I want to do something crazy. Someone talk me off the ledge: record Bundle { string key; array<bytes> msgs; }
Producers individually serialize a bunch of messages that share a key, then serialize a bundle and post to a topic. A generic Flattener service is configured by startup parameters to listen to 1...n kafka topics containing bundles, then blindly forward the bundled messages on to configured output topics one at a time. (Blindly meaning it takes the bytes from the array and puts them on the wire.) Use case: I have services that respond to small operations (update record, delete record, etc). At times, I want batches of ops that are gauranteed not to be interleaved with other ops for the same key. To accomplish this, my thought was to position a Flattener in front of each of the services in question. Normal, one-off commands get stored in 1-item bundles, true batchs are bundled into bigger ones. I don't use a specific field type for the inner messages, because I'd like to be able to re-use Flattener all over the place Does this make any sense at all? Potential drawbacks? With multiple producers to a topic, is there another way to publish a series of messages that gaurantees they won't be interleaved? (It seems like that goes again the whole spirit of Kafka.) Thanks! -John