RabbitMQ 消息丢失
我用Python的接口把消息插入到RabbitMQ,然后再用Go的接口从RabbitMQ获取消息。
重点1: 为了提高性能,我把RabbitMQ的确认(ACK)设置成了不需要确认。
我通过Python接口插入了超过1亿条消息,但当我用Go接口去获取消息时,发现插入的消息数量和获取的消息数量不一样。插入和获取的操作是同时进行的。
重点2: 消息丢失的比例没有超过100万分之一。
插入操作有日志,Python接口显示所有插入的消息都是成功的。
获取操作也有日志,Go接口显示所有获取的消息都是成功的。但数量上却不相等。
问题1: 我不知道怎么找到消息丢失的地方。有没有人能给我一些建议,告诉我怎么找出消息丢失的原因?
问题2: 有没有什么策略可以确保消息不会丢失?
1 个回答
1
为了测试你发送的所有消息是否都成功发布,你可以按照以下步骤操作:
- 先停止消费者。
- 在发布者中启用确认功能。在Python中,你可以通过在代码中添加一行来实现:
channel.confirm_delivery()
。这样做的目的是让你知道消息是否成功发布,返回的结果是一个布尔值(真或假)。你还可以选择在basic_publish
中使用mandatory
标志。 - 发送你想要的任意数量的消息。
- 确保所有的
basic_publish()
方法都返回了True。 - 统计Rabbit中消息的数量。
- 在消费者中启用确认功能,方法是设置
no_ack = False
。 - 消费所有的消息。
这样你就能知道你的消息在哪里丢失了。