我没有看到amqp_consumer.py
或amqp_producer.py
在 tarball 中,所以重现故障很棘手。
每当操作系统告知套接字已关闭时,RabbitMQ 就会终止连接,释放它们未确认的消息以重新传递给其他客户端。你的症状很奇怪,甚至kill -9
应该导致 TCP 套接字被正确清理。
有些人注意到,当在 AMQP 客户端和服务器之间使用防火墙或 NAT 设备运行时,套接字的存活时间超过了应有的时间。这可能是一个问题,还是您在本地主机上运行所有内容?另外,您在什么操作系统上运行系统的各种组件?
ETA:从您下面的评论中,我猜当您在 Linux 上运行服务器时,您可能在 Windows 上运行客户端。如果是这种情况,那么可能是 Windows TCP 驱动程序没有正确关闭套接字,这与 Unix 上的 kill-9 行为不同。(在 Unix 上,内核会正确关闭任何被杀死进程的 TCP 连接。)
如果是这样,那么坏消息是 RabbitMQ 只能在套接字关闭时释放资源,所以如果客户端操作系统不这样做,它就无能为力了。这与几乎所有其他基于 TCP 的服务相同。
不过,好消息是 AMQP 支持“心跳”选项,正是在这些情况下,网络结构是不可信的。您可以尝试启用心跳。当它们被启用时,如果服务器在可配置的时间间隔内没有收到任何流量,它就决定连接一定是死的。
然而,坏消息是我认为 py-amqplib 目前不支持心跳。不过值得一试!