python - RabbitMQ 消息丢失

标签 python go rabbitmq

我使用 Python api 向 RabbitMQ 中插入消息,然后使用 go api 从 RabbitMQ 获取消息。

关键 1:RabbitMQ ACK 因性能原因设置为 false。

我通过 python api 向 RabbitMQ 插入了大约超过 100,000,000 条消息,但是当我使用 go api 获取 消息,我发现消息的插入数不等于获取数。插入操作和

获取操作是并发的。

关键 2:丢失消息率不超过 1,000,000% 1.

插入 Action 有日志,python api显示所有插入消息成功。

get action有log,go api显示所有get message成功。 但数量并不相等。

问题1:我不知道如何找到消息丢失的地方,谁能给我一个建议,如何找到消息丢失的地方?

问题2:有什么策略可以保证消息不丢失吗?

最佳答案

为了测试您的所有消息是否已发布,您可以这样做:

  1. 停止消费。
  2. 在发布者中启用确认。在 Python 中,您可以通过在代码中添加额外的行来实现:channel.confirm_delivery()。如果消息已发布,这基本上会返回一个 bool 值。您可能希望在 basic_publish 中使用 mandatory 标志。
  3. 想发多少就发多少。
  4. 确保所有 basic_publish() 方法都返回 True。
  5. 计算 Rabbit 中的消息数。
  6. 通过执行 no_ack = False 在消费者中启用 Ack
  7. 消费所有消息。

这会让您了解您的消息在哪里丢失了。

关于python - RabbitMQ 消息丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25749566/

相关文章:

python - 为什么 "yield from"在 all() 或 any() 中没有按预期工作?

python - 如何在 Flask 应用程序中使用 Postgre 的 HSTORE 类型?

python - 禁用 OpenERP 中特定功能的创建和丢弃按钮

python - pygame中的矩形不会一致移动

mongodb - 从对象数组删除键值时出错

google-app-engine - 允许 App Engine 应用程序访问另一个 App Engine 应用程序的数据存储区

mysql - SetMaxOpenConns() 无法解决 `Error 1040: Too many connections`

rabbitmq - 直接交换和扇出交换有何必要?

database - 消息代理与数据库和监控

java - RabbitMQ - 线程 "main"java.lang.NoClassDefFoundError : org/slf4j/LoggerFactory 中出现异常