RabbitMQ,docker,单队列,多个消费者

我们在我们的系统中使用了Docker,Spring和RabbitMq。 我是AMQP的新手,我试图弄清楚交换,队列,绑定和连接是如何在我们的系统中工作的。 我们有多个dockerized应用程序。

简而言之,当应用程序启动的时候,他们每个人都开始听同一个队列,我不明白他们怎么能期望收到相同的消息。 在stackoverflow有一些类似的问题,给我的印象是,我们目前的系统可能有缺陷。

更详细地说:

Docker容器启动时,不同容器中的多个应用程序使用RabbitAdmin

declare the same exchange: rabbitAdmin.declareExchange(exchange) declare the same queue: rabbitAdmin.declareQueue(queue) bind those together: rabbitAdmin.declareBinding(BindingBuilder.bind(queue).to(exhange).with("theSameKey"); 

他们这样做是因为他们想听同样的信息。 据我所知,只有一个dockerized程序pipe理创build交换和队列,其余的尝试,但没有任何效果。

之后,这些应用程序中的每一个都会为队列创build并启动SimpleMessageContainers:

 simpleMessageContainer.setMessageListener(messageListener) simpleMessageContainer.addQueueNames(queue.getName()) simpleMessageContainer.start() 

使用rabbitmqctl和rabbitmq的web界面,我可以看到单个队列在不同的渠道上有多个消费者,对应不同的docker容器。

是不是这样,messageListener驻留在应用程序中,但是当调用addQueueNames时,RabbitMq为代理中的队列创build一个Consumer,然后这个Consumer通过与应用程序本地messageListener的连接转发消息?

由于不同Docker容器中的多个应用程序都这样做,因此同一队列中有多个Consumers,就像我在rabbitmqctl中看到的一样。

我不明白的是,RabbitMq不是以循环的方式将消息传递到队列中的消息队列,所以只有一个docker应用程序会收到它? 这些交stream是直接的,话题types,没有扇出交stream。 如果所有dockerized应用程序想要接收相同的消息,那么不应该为自己的队列名称使用相同的exhance为相同的exhance创build一个自己的队列,但使用相同的路由密钥?

我没有看到目前的实施可能正常工作。

简而言之,当应用程序启动的时候,他们每个人都开始听同一个队列 ,我不明白他们怎么能期望收到相同的消息

他们永远不会收到相同的信息。 只有一个会select一个消息。

要执行你所要求的 – 所有收到同样的信息 – 它必须是一个主题 ,而不是一个队列

顺便说一句:关于Docker或容器没有什么特别的,多个消费者可以用很多方式运行。 以典型的集群环境为例。