[rabbitmq-discuss] Round-robin exchanges?

Adam Rabung adamrabung at gmail.com
Tue Oct 11 02:48:45 BST 2011


Hello,
I am trying to implement a work queue in RabbitMQ.  I have several machines
that will act as worker pools for consuming my queues.  I would like each
job to be processed only once.  Some jobs have environmental requirements,
ie must be executed on a machine with an SSD.  Not all worker pools will
meet these requirements.  A first approach would be to have a queue for
every permutation of requirements: "No Requirements", "Requires SSD",
"Requires Certificate", etc and have each worker pool subscribe to all
queues which it can handle.

A majority of the jobs will have no requirements, so many worker pools will
be underutilized.  To fight this, I am hoping to distribute jobs in a
round-robin fashion to all queues that can handle them.  For example, a
no-requirements job can be handled by any worker pool, and therefore should
be distributed equally to all of them.  That is, jobs w/ no requirements
will be evenly distributed to "No Requirements", "Requires SSD", "Requires
Certificate", etc.

I tried this with topic exchanges, but of course they will distribute the
job to ALL matching queues, rather than a single arbitrary queue.

Some terrible alternative approaches I have so far:
1. Have producers submit to a single queue, and have a home-grown "load
balancer" consumer on the other end which distributes jobs to appropriate
queues.
2. When a worker pool spins up, rather than have each worker consume a
dedicate queue, have at least some of them hop between queues in an attempt
to keep them busy.
3. Hacks with timestamps/modulo arithmetic in the routing key to trick the
exchange into being round robin.

Being new to RabbitMQ, my intuition tells me #1 will be a big performance
problem, #2 will be a performance and maintenance problem, and #3 just won't
end up working.  I suspect I'm missing something big here :)

Has anyone successfully load-balanced their workers in a situation like
this?

Any advice much appreciated.
Adam
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.rabbitmq.com/pipermail/rabbitmq-discuss/attachments/20111010/031ba60c/attachment.htm>


More information about the rabbitmq-discuss mailing list