By calling the nextTuple procedure or method on the Spout, Storm requests a tuple from the Spout. The Spout avails the SpoutoutputCollector given in the open method to discharge a tuple to one of its output streams. While discharging a tuple, the Spout allocates a “message id” that will be used to recognize the tuple later.
After that, the tuple gets sent to consuming bolts, and storm takes charge of tracking the tree of messages that is produced. If the storm is confident that a tuple is processed thoroughly, then it can call the ack procedure on the originating Spout task with the message id that the Spout has given to the Storm.