[rabbitmq-discuss] Scalable multithreaded consumer
Tony Garnock-Jones
tonyg at lshift.net
Mon Jan 21 12:32:26 GMT 2008
Hi Karel,
Karel Alfonso wrote:
> I haven’t found in RabbitMQ a mechanism to
> process concurrently the messages received. Is there any suggestion or
> guideline I could follow?
If you mean handing messages received on a consumer off to multiple
worker threads, one approach is to have multiple threads reading from a
single QueueingConsumer. Each thread would, at its heart, do something
like this:
while (true) {
QueueingConsumer.Delivery delivery = consumer.nextDelivery();
// ... handle delivery ...
synchronized (channel) {
channel.basicAck(delivery.getEnvelope().getDeliveryTag(),
false);
}
}
QueueingConsumer uses java.util.concurrent.BlockingQueue internally, so
it is thread-safe. You still need to lock the channel object if you are
accessing it from multiple threads, though - the usual model is for a
single thread to have a single channel, so if they share one, they must
take scrupulous care to not step on each other's toes.
Another approach is to open a channel and a consumer for each thread.
That way, you avoid the locking headaches needed when sharing a channel
between threads, and each thread can manage its own resources. This
approach is also gives better control over the thread/process boundary,
so if at a later date you decide you need to have multiple JVMs, it'll
be easier to move a few worker threads at a time over to the other process.
Regards,
Tony
--
[][][] Tony Garnock-Jones | Mob: +44 (0)7905 974 211
[][] LShift Ltd | Tel: +44 (0)20 7729 7060
[] [] http://www.lshift.net/ | Email: tonyg at lshift.net
More information about the rabbitmq-discuss
mailing list