rabbitmq basic.publish返回ok时消息为何会丢失

rabbitmq basic.publish返回ok时消息为何会丢失,rabbitmq,Rabbitmq,从 网络可能以不太明显的方式出现故障,检测某些故障需要时间。因此,将协议帧或一组帧(例如,已发布的消息)写入其套接字的客户端不能假定消息已到达服务器并已成功处理。它可能在途中丢失,也可能严重延迟交付 使用标准AMQP 0-9-1,确保消息不会丢失的唯一方法是使用事务——使通道具有事务性,然后为每条消息或消息集发布、提交 我想知道为什么需要发布确认或事务来防止生产者发布的消息丢失 如果调用amqp“basic.publish”成功,则api返回ok,为什么消息仍然可能丢失?该片段是关于amqp 0

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

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

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


如果调用amqp“basic.publish”成功,则api返回ok,为什么消息仍然可能丢失?

该片段是关于amqp 0-9-1的。RabbitMQ提供了对该协议的扩展,其中之一是Publisher确认。发布者确认,这些文件本身不属于AMQP 0-9-1标准的一部分

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

因此,如果您确实需要一些保证,那么应该使用Publisher-Confirms并在消息上设置强制标志。如果使用此标志,则如果代理收到消息但无法将其路由到exchange,则将从代理收到basic.return(后跟basic.ack)响应。然后,您的应用程序可以采取适当的措施