【问题标题】:.NET RabbitMQ Client and Not Acknowledged Messages.NET RabbitMQ 客户端和未确认消息
【发布时间】:2015-12-19 16:23:06
【问题描述】:

使用 RabbitMQ .NET API,我无法接收 BasicNacks 事件。我可以成功地将消息基本发布到交换(任何类型)并使用 BasicGet 或 BasicConsume 检索它;但是,如果我随后使用交付标签发送 BasicNack,则不会触发 BasickNacks 事件。 在创建交换和队列、绑定等之前,我正在向 BasicNacks 事件注册一个处理程序,并且我正在执行 ConfirmSelect。 这可能是什么原因? BasicNacking 消息并使其返回队列(enqueue = true)的要求或常见工作流程是什么?

【问题讨论】:

    标签: .net rabbitmq message-queue


    【解决方案1】:

    您应该发送并监听 BasicAck 事件。 Broker 在无法处理消息的特殊情况下会发送否定确认(BasicNack)。见here

    【讨论】:

    • 那么如何将消息返回到队列中?
    • 所以你的问题是消费者如何放弃消息处理?在这种情况下,消费者应该发送基本取消。见这里:rabbitmq.com/consumer-cancel.html
    • 不完全是。情况如下:从队列中拉出一条消息,未确认(?)并进行处理,这可能需要一些时间。根据此处理的结果,我可能希望将其从队列中删除或将其返回到原来的位置。这有意义吗?
    • 我想我明白了。您对 basic.nack 的看法是正确的。但似乎 basic.nack 是 RabbitMQ 对 AMQP 协议规范的扩展。 AMQP 只指定您正在寻找的 basic.reject 命令。 basic.nack 和 basic.reject 的区别在于拒绝只对一条消息有效,而 nack 可以批量使用。请参阅此处的示例:rabbitmq.com/nack.html。可以将消息返回到队列或只是要求代理拒绝它。在这种情况下,代理不应该向发布者发送 nack 事件,因为无论消息是否处理都不是发布者的业务。
    • 如果您需要通知发布者有关消息拒绝的信息,您应该使用另一个队列来执行此操作(并且对于此队列,发布者和消费者将切换他们的角色)。这有帮助吗?
    猜你喜欢
    • 1970-01-01
    • 2015-11-24
    • 2019-12-02
    • 2020-11-11
    • 1970-01-01
    • 2015-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多