资源警报后RabbitMQ服务器上的额外TCP连接

资源警报后RabbitMQ服务器上的额外TCP连接,rabbitmq,haproxy,Rabbitmq,Haproxy,我已经在Windows上安装了RabbitMQ Server 3.6.0(我知道该升级了,我已经在另一个服务器节点上完成了) 在服务器端和客户端都启用心跳(心跳间隔60秒) 我有一个资源警报(RAM限制),之后我观察到到到到RMQ服务器的TCP连接数量增加 目前有18000个连接,而正常连接数量为6000个 通过管理插件,我可以看到有很多连接有0个通道,而我们的“正常”连接至少有1个通道 即使RMQ服务器重启也不会有帮助:所有连接都会重新建立 一,。这是否意味着他们都还活着 这里描述了类似的问题

我已经在Windows上安装了RabbitMQ Server 3.6.0(我知道该升级了,我已经在另一个服务器节点上完成了)

在服务器端和客户端都启用心跳(心跳间隔60秒)

我有一个资源警报(RAM限制),之后我观察到到到到RMQ服务器的TCP连接数量增加

目前有18000个连接,而正常连接数量为6000个

通过管理插件,我可以看到有很多连接有0个通道,而我们的“正常”连接至少有1个通道

即使RMQ服务器重启也不会有帮助:所有连接都会重新建立

一,。这是否意味着他们都还活着

这里描述了类似的问题,但正如我所看到的,它在v3.6.0中被完全修复了

二,。我是否理解在RMQ Server v3.6.0之前,资源警报后的行为是这样的:每1个真实的客户端自动恢复连接,服务器端可能会挂起几个TCP连接

可能很重要:我们在服务器和客户端之间有haProxy


三,。haProxy可以解释这种额外的连接吗?可能它会阻止客户端接收到由于资源警报而关闭连接的信号?

RabbitMQ团队监视并有时只回答有关StackOverflow的问题


我建议该用户从Erlang 18升级,Erlang 18已知TCP连接问题-

  • 他们都活着吗
  • 只有你能回答这个问题,但我想问——你怎么会有成千上万的联系?实际上,每个逻辑进程只应创建一个连接。因此,如果您真的有6000个逻辑进程连接到服务器,这可能是这么多连接的原因,但在我看来,即使在这种情况下,您也远远超出了合理的设计限制

    要进行检查,请查看在终止一个逻辑进程时减少了多少连接

  • 我是否理解在RMQ Server v3.6.0之前,资源警报后的行为是这样的:每1个真实的客户端自动恢复连接,服务器端可能会挂起几个TCP连接
  • 据我所知,是的。在本例中,开发人员似乎遇到了一个问题,即检测断开的连接。如果每次有人误解TCP的工作原理时我都能得到一美元,我的钱就会比贝佐斯多。因此,他们发现有人做出了一些错误的假设,当检测到一个死套接字需要实际读写时,开发人员编写了代码(试图)来正确处理它。需要注意的是,这看起来不像是一个非常全面的修复,因此如果概念设计问题已经引入到代码的另一部分,那么这个bug可能仍然以某种形式存在。搜索bug报告可能会给您提供更详细的答案,或者询问支持列表中的某个人

  • haProxy可以解释这种额外的连接吗

  • 那要看情况。理论上,haProxy as只是一个传递。为了让代理识别连接,必须通过握手,这是一个深思熟虑的过程,不能无意中发生。关闭连接还需要握手,这可能是haProxy的罪魁祸首。如果haProxy认为连接已断开,并在没有该过程的情况下将其断开,那么这可能是一个促成原因。但是它本身并没有建立这些新的连接。

    我已经设法重现了这个问题:最终它是我们的客户使用RMQ连接的方式中的一个缺陷。 它创建了一个自动恢复连接(这很好)并且有时它创建了一个单独的简单连接用于“临时”目的

    重现我的问题的步骤是:

  • RabbitMQ中的到达内存报警(例如,设置一个容易到达的RAM 限制并推送大量大消息)。连接将处于状态 “封锁”
  • 使用这个新的“临时”连接开始从我们的客户端发送消息
  • 确保连接处于“阻塞”状态
  • 在不消除资源警报的情况下,重新启动RabbitMQ节点
  • “临时”连接本身就在这里!尽管事实是自动恢复 没有为此启用。它不断地发出心跳声,所以 服务器没有关闭它
  • 我们将修复客户端,使其始终使用唯一的连接。
    另外,我们当然会升级Erlang。

    听起来您的客户端有僵尸连接,可能是因为资源管理不善。1.您使用的RabbitMQ客户端是什么?二,。如果手动终止一个客户端进程,会发生什么情况?你看到一个连接消失了还是几个连接消失了?我想你可以把haProxy排除在外,因为它只是一个通行证。要让代理识别连接,必须通过握手,这是一个深思熟虑的过程,不能无意中发生。>实际上,每个逻辑进程只应创建一个连接。这是问题之一。我们的客户端应用程序不保证这一点。>理论上,haProxy as只是一个传递。你是对的:最终,哈普洛西在我的案件中是无辜的。