[rabbitmq-discuss] Routing key match algorithms

Michael Bridgen mikeb at rabbitmq.com
Thu Jun 30 14:26:31 BST 2011


> The problem I see is that, if a consumer issues a regex as a pattern for
> a subscription, when a message gets published, how do I find out all the
> regexes I know about that match? Do I loop over all the consumers,
> asking each one if they match or not? Seems kind of inefficient.

Indeed.  Building an FSM with bindings as transitions states would be a 
start.  "Collecting" states after binding deletion is likely to be the 
tricky bit.

> Just wondering if this problem was known and passed over early on, and
> the */# mechanism used to get around this problem.

I suspect the */# mechanism was made to match JMS implementations, and I 
suspect those used it because it was fairly easy to implement and to 
grasp as a user.

Regular expressions are not tougher in kind than globbing, since they 
both describe regular languages.  They are more fiddly to implement however.

> I also thought about using some text indexing engine (a la lucene) to
> solve this problem, but if a message gets published with a specific
> routing key, you'd have to re-run the search attached to the consumers
> to get an updated list of messages that match a given regex. So there's
> no benefit from doing that either, so far as I can tell.

One approach to implementing topic matching is to keep something a bit 
like a reverse index: http://www.openamq.org/doc:fast-topic-matching

Vlad at Rabbit tried this among other techniques, and posted his results:
http://www.rabbitmq.com/blog/2010/09/14/very-fast-and-scalable-topic-routing-part-1/ 
and 
http://www.rabbitmq.com/blog/2011/03/28/very-fast-and-scalable-topic-routing-part-2/


mkb


More information about the rabbitmq-discuss mailing list