使用RabbitMQ基于密钥(例如id)确定并发性

时间:2015-11-17 07:44:43

标签: concurrency rabbitmq amqp spring-amqp spring-rabbitmq

我们正在使用RabbitMQ和Spring的侦听器容器构建一个Web应用程序,以产生并发性,如下所示:

<rabbit:listener-container connection-factory="connectionFactory" concurrency="10">
      <rabbit:listener ref="FooService" method="handleFoo" queue-names="fooQueue"/>
</rabbit:listener-container>

<rabbit:topic-exchange name="exchange">
    <rabbit:bindings>
        <rabbit:binding queue="fooQueue" pattern="foo.handle"/>
    </rabbit:bindings>
</rabbit:topic-exchange>

我希望侦听器同时处理消息(例如,此示例为10个线程),但我不希望它们同时处理具有相同数据的消息。例如,如果我发送Foo对象的id,我只想要同时处理不同的Foo对象,但是应该顺序处理相同的Foo对象。

我已经查看了RabbitMQ的交换和队列类型,但无法解决这些问题。

我能想到的一种方法是创建具有不同模式的多个队列,例如foo.handle.1foo.handle.2等等。然后将Foo对象的id哈希到这些模式。但是,对于我们拥有的每种类型的队列并管理所有这些队列,这很容易就会失控。

有没有一种机制可以用RabbitMQ实现这个目标?

1 个答案:

答案 0 :(得分:0)

与JMS不同,RabbitMQ(或AMQP本身)没有消息选择器的概念 - 您无法从队列中提取选择性消息。

RabbitMQ的唯一解决方案是每种类型的单独队列和每个队列上的单个使用者。