网络可能以不太明显的方式失败,并且检测到某些失败需要时间。因此,将协议帧或一组帧(例如,已发布的消息)写入其套接字的客户端不能假定该消息已到达服务器并且已成功处理。它可能在途中丢失,或者它的交付可能会显着延迟。
使用标准AMQP 0-9-1,保证消息不丢失的唯一方法是使用事务 - 使事务处理事务然后为每个消息或消息集发布,提交。
我想知道为什么需要发布 - 确认或事务来防止生产者发布消息丢失。
如果amqp" basic.publish"被称为成功,api返回ok,为什么消息仍然可能丢失?
答案 0 :(得分:0)
该片段正在谈论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)响应。然后,您的申请可以采取适当的措施。