我试图理解消息确认是如何在AMQP协议(特别是RabbitMQ)下与订阅同一个路由密钥的多个消费者直接交换的。它本质上是一个扇出交换,但我有它,所以它可以根据routing_key扇出到不同的消费者。我目前的心理模型如下:
1.发布者创建“reply_to”队列,并发布到路由关键字,其中包含一条消息,告诉使用者将响应发送到队列(RPC协议),以及一个被传回的相关性id,以便将来的所有结果都绑定到该唯一标识符
- Exchange将邮件发送到绑定到该路由关键字的所有队列。在这里,有两个队列用于两个使用者,每个队列都绑定到路由关键字“泵”
1.一段时间后,使用者回复reply_to
队列,然后确认消息,以便“他们的独占队列”删除发送到其队列的消息。每个接收到消息的使用者都执行此操作。
1.代理将响应发送到RPC队列。发布者确认它收到的每条消息,确认它为此接收的消息
我知道这很令人困惑......基本上可以归结为这个问题--消息绑定到什么?这在循环调度场景中是显而易见的。但是,如果同一个消息有多个使用者,那么每个队列(以及绑定到它的每个使用者)都有自己的消息发送给使用者,并且每个消息都必须得到确认,这对我来说很有意义。
RabbitMQ这样说:
https://www.rabbitmq.com/confirms.html#acknowledgement-modes 根据所使用的确认模式,RabbitMQ可以在消息发出(写入TCP套接字)后立即将其视为成功传递,也可以在收到显式(“手动”)客户端确认时将其视为成功传递。
不幸的是,这里没有提到队列,也没有提到当有多个队列有自己的使用者时会发生什么。
1条答案
按热度按时间4dbbbstv1#
对于RabbitMQ,对于真正的FanOut方法,最好让每个使用者都将自己的队列绑定到交换,这样每个使用者都将接收和使用消息,而不会影响其他使用者
例如,销售代表将订单发送给收银员,其中有多个销售代表和多个收银员。
销售代表发送订单
每个出纳员都将订阅交换
这将使用RabbitMQ动态队列,但是,任何对使用者唯一的队列都将具有相同的效果。
这里不一定需要路由密钥。