![]() |
1
11
我看不见
rabbitmq终止连接,在操作系统通知套接字已关闭时,释放未确认的消息以重新传递给其他客户端。你的症状很奇怪,甚至
有些人注意到,当在amqp客户机和服务器之间使用防火墙或nat设备运行时,套接字的生存时间比应该的长。这可能是一个问题,或者您正在本地主机上运行所有内容?另外,您在哪个操作系统上运行系统的各个组件? 埃塔: 从您下面的评论中,我猜当您在linux上运行服务器时,您可能在windows上运行客户机。如果是这种情况,则可能是windows tcp驱动程序没有正确关闭套接字,这与unix上的kill-9行为不同。(在UNIX上,内核将正确地关闭任何已终止进程上的TCP连接。) 如果是这样,那么 坏消息 RabbitMQ只能在套接字关闭时释放资源,所以如果客户端操作系统不这样做,它就无能为力。这与其他几乎所有基于tcp的服务都是一样的。 这个 好消息 不过,amqp在这些情况下支持“心跳”选项,因为在这些情况下,网络结构是不可信的。你可以试着激活心跳。当它们被启用时,如果服务器在一个可配置的时间间隔内没有接收到任何流量,它将决定连接必须是死的。 这个 坏消息 不过,我认为py-amqplib目前不支持心跳。不过,值得一试! |
![]() |
2
5
rabbitmq在客户端确认消息已被处理时没有超时:请参阅 this post (整个线索可能很有趣)。帖子中的一些要点:
(我的重点)
这个问题很可能发生,因为在客户机拉取模型中,服务器很难检测到断开的连接(而不是活动但无响应的消费者),特别是服务器似乎乐于永远等待ack。
更新:
在linux上,您可以附加sigterm和/或sigkill和/或sigint的信号处理程序,并希望以一种有序的方式从客户端关闭连接。在windows上,我相信从任务管理器关闭会调用win32
这意味着可能很难有秩序地终止和关闭。 可能值得在rabbitmq列表中使用您自己的ack超时用例。 |
![]() |
3
2
请提供有关您声明的组件的更多详细信息。通常(独立于客户机实现)一个具有属性的队列
一旦声明客户端和代理之间的连接断开,就应该被删除。不过,这对共享队列没有帮助。请详细说明你到底想做什么样的模特。 |