【问题标题】:Why message can be lost when rabbitmq basic.publish return ok为什么rabbitmq basic.publish返回ok时消息会丢失
【发布时间】:2018-05-11 21:50:37
【问题描述】:

来自Rabbitmq doc

网络可能会以不太明显的方式出现故障,并且检测某些故障需要时间。因此,将协议帧或一组帧(例如发布的消息)写入其套接字的客户端不能假定消息已到达服务器并已成功处理。它可能会在途中丢失,或者它的交付可能会大大延迟。

使用标准 AMQP 0-9-1,保证消息不丢失的唯一方法是使用事务 -- 使通道具有事务性,然后为每条消息或一组消息发布、提交。

我想知道为什么需要发布确认或事务来防止生产者发布的消息丢失。

如果amqp "basic.publish"调用成功,api返回ok,为什么消息还可能丢失?

【问题讨论】:

    标签: rabbitmq


    【解决方案1】:

    那个 sn-p 正在谈论 AMQP 0-9-1。 RabbitMQ 提供了对该协议的扩展,其中之一是 Publisher Confirms。发布者确认不是 AMQP 0-9-1 标准本身的一部分。

    如果您收到“OK”或 basic.ack,那么这就是发布者确认。一旦你收到了那个 bacic.ack 就意味着代理肯定收到了消息。但是此时您仍然可能“丢失”消息。如果没有绑定到该交换的队列或没有具有与消息匹配的绑定的队列,则代理将丢弃该消息。因此,尽管您收到了 basic.ack,但该消息现在已丢失。

    因此,如果您真的想要一些保证,您应该使用 Publisher Confirms 并在消息上设置 Mandatory 标志。如果您使用此标志,那么如果代理收到消息但无法将其路由到交换,您将收到来自代理的 basic.return(后跟 basic.ack)响应。然后您的应用程序可以采取适当的措施。

    【讨论】:

      猜你喜欢
      • 2019-09-22
      • 2017-07-02
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 2014-11-06
      • 1970-01-01
      • 2013-03-22
      相关资源
      最近更新 更多