Concurrency 基于RabbitMQ的密钥(如id)确定并发性

Concurrency 基于RabbitMQ的密钥(如id)确定并发性,concurrency,rabbitmq,amqp,spring-amqp,spring-rabbit,Concurrency,Rabbitmq,Amqp,Spring Amqp,Spring Rabbit,我们正在使用RabbitMQ和Spring的侦听器容器构建一个web应用程序,以产生并发性,如下所示: <rabbit:listener-container connection-factory="connectionFactory" concurrency="10"> <rabbit:listener ref="FooService" method="handleFoo" queue-names="fooQueue"/> </rabbit:listen

我们正在使用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.1
foo.handle.2
等等。然后将Foo对象的id散列到这些模式中。但是,对我们拥有的每种类型的队列执行此操作并管理所有队列都可以很容易地摆脱控制

RabbitMQ是否有实现这一点的机制?

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


RabbitMQ的唯一解决方案是为每种类型提供一个单独的队列,每个队列上只有一个使用者。

非常感谢您的回答。您能详细说明每种类型的独立队列吗。我只有一种类型
Foo
,并且有许多
Foo
对象具有不同的ID。我应该像我在问题中建议的那样散列ID吗?对不起-我误读了-是的;您需要散列id以确定将其发送到哪个队列。再次感谢,最后一件事,rabbitmq是否可以使用绑定模式
foo.handle.
和路由键
foo.handle.
帮助我解决此类问题?我仍然需要创建10个队列,但生产者不必担心散列函数,对吗?是的,这会起作用,但绑定并不像您描述的那样-请参阅自述。我不熟悉exchange,但似乎所有的绑定都是简单的
“1”
,以便在队列中均匀分布。