[rabbitmq-discuss] How to achieve HA consumers?

Matthias Radestock matthias at rabbitmq.com
Mon Sep 3 10:42:39 BST 2012


On 03/09/12 10:29, Francesco Mazzoli wrote:
> That said, whoever wants to consume from the queue needs to consume from the
> token queue first.  In the case of the OP, the main consumer will start first,
> and the second right after it.  This way, the second will be blocked until the
> first consumer dies/quits and the token message will be requeued.

In pseudo code, this is what each consumer looks like:

token_consumer = channel.basic_consume(token_queue)
wait_for_consumer_message(token_consumer)
main_consumer = channel.basic_consume(main_queue)
while(true) {
   msg = wait_for_consumer_msg(main_consumer)
   process_message(msg)
   channel.basic_ack(msg)
}


There is one snag with this: When a consumer dies, the order in which 
the token message and any pending "proper" messages are requeued is 
undefined. That means the consumer that is taking over might start 
consuming from the main queue before the unack'ed messages have been 
requeued. The messages will get requeued eventually, but they will be 
out of order.

In practice, introducing a slight delay before consuming from the main 
queue should prevent this.


Matthias.


More information about the rabbitmq-discuss mailing list