gpt4 book ai didi

python - 如何在 RabbitMQ 服务器上设置超时检测?

转载 作者:IT老高 更新时间:2023-10-28 21:13:00 24 4
gpt4 key购买 nike

我正在试用 RabbitMQthis python绑定(bind)。

我注意到的一件事是,如果我不干净地杀死了一个消费者(模拟一个崩溃的程序),服务器会认为这个消费者仍然存在很长时间。这样做的结果是所有其他消息都将被忽略。

例如,如果您杀死消费者 1 次并重新连接,则 1/2 消息将被忽略。如果你杀死另一个消费者,那么 2/3 的消息将被忽略。如果您杀死 3rd,则 3/4 消息将被忽略,依此类推。

我尝试打开确认,但似乎没有帮助。我找到的唯一解决方案是手动停止服务器并重置它。

有没有更好的办法?

如何重现此场景

  • 运行rabbitmq。

  • 取消归档 this library .

  • 下载消费者和发布者here .运行 amqp_consumer.py 两次。运行 amqp_publisher.py,输入一些数据并观察它是否按预期工作。消息以循环方式接收。

  • 使用 kill -9 或任务管理器终止其中一个消费者进程。

  • 现在,当您发布消息时,50% 的消息将丢失。

最佳答案

我在 tarball 中没有看到 amqp_consumer.pyamqp_producer.py,因此重现故障很棘手。

每当操作系统通知套接字已关闭时,RabbitMQ 就会终止连接,释放它们未确认的消息以重新传递给其他客户端。你的症状很奇怪,即使是 kill -9 也应该导致 TCP 套接字被正确清理。

有些人注意到,在 AMQP 客户端和服务器之间使用防火墙或 NAT 设备运行时,套接字的存活时间超过了应有的时间。这可能是一个问题,还是您在本地主机上运行所有内容?另外,您在什么操作系统上运行系统的各个组件?

预计到达时间: 从您下面的评论中,我猜您在 Linux 上运行服务器时,可能在 Windows 上运行客户端。如果是这种情况,那么可能是 Windows TCP 驱动程序没有正确关闭套接字,这与 Unix 上的 kill-9 行为不同。 (在 Unix 上,内核会正确关闭任何被杀死进程的 TCP 连接。)

如果是这样,那么坏消息是RabbitMQ只能在socket关闭时释放资源,所以如果客户端操作系统不这样做,它就无能为力了。这与几乎所有其他基于 TCP 的服务相同。

好消息,不过,AMQP 支持“心跳”选项,正是在这些情况下,网络结构是不可信的。您可以尝试启用心跳。启用它们后,如果服务器在可配置的时间间隔内没有接收到任何流量,它会确定连接一定是死的。

坏消息,然而,我认为 py-amqplib 目前不支持心跳。不过值得一试!

关于python - 如何在 RabbitMQ 服务器上设置超时检测?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1345239/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com