我有一个涉及rabbitmq的项目。我遇到的问题说明如下:
现在,让我来描述一下这个场景。我有n个队列订阅了topic1
。
现在我的问题是,如果我按顺序发布3条消息,这些消息在名为Exchange
的代理中显示为1,2和3,那么所有队列中的Rabbitmq 保证这些消息的顺序是什么? / p>
我发现的唯一一件事就是在Rabbitmq文档中Message ordering guarantees正在讨论
AMQP 0-9-1核心规范的第4.7节解释了保证订购的条件:在一个信道中发布的消息,通过一个交换机,一个队列和一个输出信道将以与它们相同的顺序接收被送了。自2.7.0发布以来,RabbitMQ提供了更强大的保证。
那么,任何人都可以帮助我并指出正确的文档或示例,以证明它是否有保证吗?
由于
答案 0 :(得分:3)
正如另一张海报所提到的,假设一个简单/基本的消费者设置,你的场景应该可以正常工作。但是,这里有一些其他信息可以解释原因。
我不确定在文档的这一部分中可能包含的细微差别,直到我确切地查找了Channel
的内容。与RabbitMQ 的连接可以有多个"迷你连接"在其中称为channels
。这些通道中的每一个都是独立的,因此您可以通过多个通道向代理发送多条消息。
因此,只要您的方案中的消息是在单个频道上发送的(您必须明确尝试使用多个频道),他们就会按照您发送的相同顺序到达队列。只要消息是通过单个频道消费的,他们就会按照他们到达队列的相同顺序到达消费者(也是他们被发送的顺序相同)。
来自:https://www.rabbitmq.com/tutorials/amqp-concepts.html
某些应用程序需要与AMQP代理程序建立多个连接。但是,不希望同时打开许多TCP连接,因为这样做会消耗系统资源并使配置防火墙变得更加困难。 AMQP 0-9-1连接与可被视为"轻量级连接共享单个TCP连接的通道进行多路复用"。
答案 1 :(得分:2)
你引用的内容完美地回答了你的问题。唯一的问题是您的消费者设置是什么样的。如果您将每个队列连接到其自己的通道并且该使用者在其自己的线程中运行,则该线程将在发布时按顺序查看每个消息。