[英]RabbitMQ, docker, single queue, multiple consumers
我们在系统中使用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的程序设法创建了交换和队列,其余的都尝试了,但是没有效果。
之后,每个应用程序都会为队列创建并启动SimpleMessageContainers:
simpleMessageContainer.setMessageListener(messageListener)
simpleMessageContainer.addQueueNames(queue.getName())
simpleMessageContainer.start()
使用rabbitmqctl和rabbitmq的Web界面,我可以看到单个队列在不同的通道上具有多个使用者,对应于不同的docker容器。
是不是让messageListener驻留在应用程序中,而是当调用addQueueNames时RabbitMq在代理处为队列创建了使用者,然后该使用者通过连接将消息转发到应用程序本地messageListener?
由于不同的Docker容器中的多个应用程序都执行相同的操作,因此同一队列有多个使用者,就像我看到的Rabbitmqctl一样。
我不明白的是,RabbitMq是否不会以循环方式将最终出现在队列中的消息传递给渠道/消费者,因此只有一个dockerized应用程序会收到它? 交换是直接类型和主题类型,没有扇出交换。 如果所有被docker化的应用程序都希望接收相同的消息,那么它们是否不应该为所有具有相同队列名称但具有相同路由密钥的实例创建自己的队列?
我看不到当前的实现可能如何正常工作。
简而言之,当应用程序启动时,它们每个都开始侦听相同的队列 ,而我不明白它们如何期望接收相同的消息 。
他们将永远不会收到相同的消息。 只有一个人会选择一条消息。
要执行您要求的操作- 所有用户都收到相同的消息 -它必须是主题 ,而不是队列 。
顺便说一句:Docker或容器没有什么特别的,多个使用者可以以多种方式运行。 作为经典集群环境中的示例。
RabbitMq不会以循环方式将最终出现在队列中的消息传递给渠道/消费者。
那是对的。 虽然您可以通过prefetch_count
和message ack
影响它。
如果所有被docker化的应用程序都希望接收相同的消息,那么它们是否不应该为所有具有相同队列名称但具有相同路由密钥的交换创建自己的队列?
是的,那是唯一的方法,因为按照AMQP协议,消息在使用者之间是负载平衡的。 因此,如果所有容器(消费者)要处理同一条消息,则它们每个都应具有连接到同一交换机的不同队列( direct
路由将这样做)。
消费者是使用docker还是其他方式运行都是如此。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.