We've built a topology. At the moment, it consists of a single Spout, several Bolts, and at least two "leaf bolts" (Bolts without an emit that save our data).
In our typical bolts, we always 'ack' everything just as soon as it is emitted. In fact, most of them implement iBasicBolt which (to my understanding) calls ack() automatically.
So I am curious on how the ack'ing system works. Let's use my final bolt, which saves to the DB, as an example. At the moment, I'm calling my save() functionality and then manually ack()'ing the tuple.
What **exactly** happens if I don't ack() the tuple? What if I **don't** ack() the tuple immediately? What happens when I **do** ack() a tuple? Specifically, what affect does ack() have on the system and data?
Does this just push back one level (the previous Node(s)) or does it start all the way from the start? How does Storm know if a tuple has been ack()'d or not?
I apologies for the vagueness in my question. There's a lot of implementation details I don't quite understand, yet, but will be critical when we try to optimize certain aspects. Particularly, I need to know how Storm will react when I start queuing up objects in my Database (or other) bolts to do a large "bulk save" DB Call instead of the overhead needed to sustain one call for every tuple.
By the way, I know pre-optimization is the root of all evil :) I'm just playing with ideas at this point and want to learn as much as I possibly can (within reason) before I do go off and implement something that might clash with Storm's internals.
Thanks!
- Kurtis