[rabbitmq-discuss] Routing via user id

Michael Klishin mklishin at gopivotal.com
Mon Jun 23 07:39:22 BST 2014

On 23 June 2014 at 10:23:47, Sean Joyce (seanmjoyce at gmail.com) wrote:
> > I have a scenario where one producer publishes a stream of messages  
> to an exchange. The exchange has 10 queues (there is an upper limit  
> to the amount of parallel work that can be done - e.g. Database  
> bottleneck) that it routes messages to. The messages can really  
> go to any queue with one exception: only one message with a given  
> user id can be processed at a time.
> All messages with that user id should be routed to the same queue.  
> If there was no database bottleneck I would create a new queue  
> for each user id but I can really only process ten messages at a  
> time.
> I had thought of partitioning the user ids across ten queues but 
> there is no guarantee the incoming messages would be evenly distributed  
> even with different user ids. Thus I could have queues 1,4 and  
> 8 with a backlog while the rest are idle resources.

Consistent hash exchange [1] and one queue per user (named accordingly) sounds
like a pretty close solution. 

As for the 1 message at a time requirement, while you can use RabbitMQ to imitate
a distributed lock of a kind [2], I'd recommend using ZooKeeper, etcd, or Redis
for this.

1. http://hg.rabbitmq.com/rabbitmq-consistent-hash-exchange/file/rabbitmq_v3_3_3/README.md
2. https://www.rabbitmq.com/blog/2014/02/19/distributed-semaphores-with-rabbitmq/

Software Engineer, Pivotal/RabbitMQ

More information about the rabbitmq-discuss mailing list