rabbitmq 如何在直接交换中与多个使用者确认消息

bvpmtnay  于 2022-11-08  发布在  RabbitMQ
关注(0)|答案(1)|浏览(197)

我试图理解消息确认是如何在AMQP协议(特别是RabbitMQ)下与订阅同一个路由密钥的多个消费者直接交换的。它本质上是一个扇出交换,但我有它,所以它可以根据routing_key扇出到不同的消费者。我目前的心理模型如下:

1.发布者创建“reply_to”队列,并发布到路由关键字,其中包含一条消息,告诉使用者将响应发送到队列(RPC协议),以及一个被传回的相关性id,以便将来的所有结果都绑定到该唯一标识符

  1. Exchange将邮件发送到绑定到该路由关键字的所有队列。在这里,有两个队列用于两个使用者,每个队列都绑定到路由关键字“泵”
    1.一段时间后,使用者回复reply_to队列,然后确认消息,以便“他们的独占队列”删除发送到其队列的消息。每个接收到消息的使用者都执行此操作。
    1.代理将响应发送到RPC队列。发布者确认它收到的每条消息,确认它为此接收的消息
    我知道这很令人困惑......基本上可以归结为这个问题--消息绑定到什么?这在循环调度场景中是显而易见的。但是,如果同一个消息有多个使用者,那么每个队列(以及绑定到它的每个使用者)都有自己的消息发送给使用者,并且每个消息都必须得到确认,这对我来说很有意义。
    RabbitMQ这样说:
    https://www.rabbitmq.com/confirms.html#acknowledgement-modes 根据所使用的确认模式,RabbitMQ可以在消息发出(写入TCP套接字)后立即将其视为成功传递,也可以在收到显式(“手动”)客户端确认时将其视为成功传递。
    不幸的是,这里没有提到队列,也没有提到当有多个队列有自己的使用者时会发生什么。
4dbbbstv

4dbbbstv1#

对于RabbitMQ,对于真正的FanOut方法,最好让每个使用者都将自己的队列绑定到交换,这样每个使用者都将接收和使用消息,而不会影响其他使用者
例如,销售代表将订单发送给收银员,其中有多个销售代表和多个收银员。
销售代表发送订单

Channel.ExchangeDeclare(exchange: "cashieradd", ExchangeType.Fanout);
                var jsonResult = JsonConvert.SerializeObject(new CashierQueue()
                {
                    transactionId = transactionId
                });
                var body = Encoding.UTF8.GetBytes(jsonResult);

                Channel.BasicPublish(exchange: "cashieradd", routingKey: "", basicProperties: null, body: body);

每个出纳员都将订阅交换

{
            var cashierAddQueue = Channel.QueueDeclare().QueueName;
            Channel.QueueBind(queue: cashierAddQueue, exchange: "cashieradd", routingKey: "");
            var consumer = new EventingBasicConsumer(Channel);
            Channel.BasicConsume(queue: cashierAddQueue, autoAck: true, consumer: consumer);
            return consumer;
        }

这将使用RabbitMQ动态队列,但是,任何对使用者唯一的队列都将具有相同的效果。
这里不一定需要路由密钥。

相关问题