[rabbitmq-discuss] question on message delivery
Jon Brisbin
jon.brisbin at npcinternational.com
Tue Sep 28 20:23:51 BST 2010
In my Groovy Map/Reduce framework, I've got everything mapping and reducing but I'm having a little trouble making sure everything that needs to know a key change has occurred is notified correctly.
The flow is basically: an SQL statement is executed and individual records are submitted to the Map phase via AMQP message. The map closure calls emit() N number of times, which sends that data to the reduce closure via AMQP message. When a key change occurs, I send a control message, which has its own consumer inside the (Spring AMQP) message handler.
My question is basically: how do I know I've fully processed all potential messages for a given key? If I send a control message out, I'm going to assume there's at least a theoretical possibility of consuming that control message before all map messages have been delivered to the handler. I probably need a two-phase key switch. The handler should be alerted that a key change has occurred by the control message, but the handler itself should decide whether a key change has yet occurred.
Clear as mud? :)
I'm basically wondering if message delivery can occur out-of-order if consumers are bound to different exchanges? Assuming the control message of a key change is published after all the map messages go out (but on a different exchange) can I rely on the map and reduce handlers (which are separate consumers) to watch for key changes in the usual fashion? e.g.
lastKey = null;
...
void onMessage(msg) {
...
if(newKey != lastKey) {
keyChange();
lastKey = newKey;
}
...
invokeAfterClosure(row);
}
Jon Brisbin
Portal Webmaster
NPC International, Inc.
More information about the rabbitmq-discuss
mailing list