RabbitMQ 消息丢失

0 投票
1 回答
4139 浏览
提问于 2025-04-20 16:58

我用Python的接口把消息插入到RabbitMQ,然后再用Go的接口从RabbitMQ获取消息。

重点1: 为了提高性能,我把RabbitMQ的确认(ACK)设置成了不需要确认。

我通过Python接口插入了超过1亿条消息,但当我用Go接口去获取消息时,发现插入的消息数量和获取的消息数量不一样。插入和获取的操作是同时进行的。

重点2: 消息丢失的比例没有超过100万分之一。

插入操作有日志,Python接口显示所有插入的消息都是成功的。

获取操作也有日志,Go接口显示所有获取的消息都是成功的。但数量上却不相等。

问题1: 我不知道怎么找到消息丢失的地方。有没有人能给我一些建议,告诉我怎么找出消息丢失的原因?

问题2: 有没有什么策略可以确保消息不会丢失?

1 个回答

1

为了测试你发送的所有消息是否都成功发布,你可以按照以下步骤操作:

  1. 先停止消费者。
  2. 在发布者中启用确认功能。在Python中,你可以通过在代码中添加一行来实现:channel.confirm_delivery()。这样做的目的是让你知道消息是否成功发布,返回的结果是一个布尔值(真或假)。你还可以选择在basic_publish中使用mandatory标志。
  3. 发送你想要的任意数量的消息。
  4. 确保所有的basic_publish()方法都返回了True。
  5. 统计Rabbit中消息的数量。
  6. 在消费者中启用确认功能,方法是设置no_ack = False
  7. 消费所有的消息。

这样你就能知道你的消息在哪里丢失了。

撰写回答