Azure中的node.js RabbitMQ使用者的ECONNRESET

时间:2015-06-09 11:49:34

标签: node.js azure tcp rabbitmq amqp

我现在已经研究了这个问题好几天了,这让我完全难过了。我们有一个基于node.js的rabbitmq消费者,它已经在内部运行了一年多而没有任何问题。最近,我们将应用程序部署到Azure,并将node.js组件部署到基于窗口的PAAS工作者角色。我们使用square mo amqp-lib(https://github.com/squaremo/amqp.node)作为我们的客户端库,从RabbitMQ接收消息。角色开始很好,处理请求没有问题,但定期回收。

在已部署的VM上检查C:\ resources中的WaHostBootstrapper日志显示以下内容:

[00001180:00001548, 2015/06/09, 10:01:17.385, INFO ] Getting status from client RemoteAccessAgent.exe (2816).
[00001180:00001548, 2015/06/09, 10:01:17.385, INFO ] Client reported status 0.
[00001180:00001548, 2015/06/09, 10:01:17.385, INFO ] Getting status from client WaWorkerHost.exe (1380).
[00001180:00001548, 2015/06/09, 10:01:17.385, INFO ] Client reported status 3.
[00001180:00003288, 2015/06/09, 10:01:17.385, INFO ] Sending shutdown notification to client RemoteAccessAgent.exe (2816).
[00001180:00003288, 2015/06/09, 10:01:17.416, ERROR] <- CRuntimeClient::OnRoleShutdownCallback(0x0000000000331890) =0x800706be
[00001180:00003288, 2015/06/09, 10:01:17.416, INFO ] Sending shutdown notification to client WaWorkerHost.exe (1380).

VM上的任何其他事件日志中没有任何其他注意事项。 我修改了角色模型启动任务,将所有控制台输出记录到一个文件中,该文件没有显示错误。为了更好地了解正在发生的事情,我使用$ ENV启用了http和网络模块的NODE_DEBUG:NODE_DEBUG =&#34; net,http&#34;然后直接从powershell运行启动任务。在完成处理请求的一段时间后,我得到以下内容:

NET: 3720 destroy undefined
NET: 3720 destroy
NET: 3720 close
NET: 3720 close handle
NET: 3720 emit close
NET: 3720 afterWrite 0 { domain: null, bytes: 21, oncomplete: [Function: afterWrite] }
NET: 3720 afterWrite call cb
NET: 3720 afterWrite 0 { domain: null, bytes: 8, oncomplete: [Function: afterWrite] }
NET: 3720 afterWrite call cb
NET: 3720 onread ECONNRESET undefined undefined NaN
NET: 3720 error ECONNRESET
NET: 3720 destroy
NET: 3720 close
NET: 3720 close handle

rabbitMQ服务器具有以下日志条目:

=WARNING REPORT==== 13-Mar-2015::17:48:39 ===
closing AMQP connection <0.7072.1> (137.116.194.234:1307 -> 10.140.42.79:5672):
connection_closed_abruptly

在看到这个之后,我很清楚消费者和服务器之间的某些东西正在关闭连接,导致节点进程退出(我们没有收听来自AMQP连接的错误事件)导致了回收的角色。

我已经设法通过使用TCPView(sysInternals)手动关闭与Rabbit服务器的连接来复制它。

由于这只发生在部署到Azure时,我想必须有一些Azure基础架构以脏的方式关闭此连接,从而导致问题。但是什么?

1 个答案:

答案 0 :(得分:2)

我想我已经解决了这个问题!由于缺少正确的错误消息和Azure负载均衡器的隐形性,它非常棘手。事实证明这是一个非常简单的解决方案,但一个根本不明显(直到你知道它,然后它才有意义)。

简答

Azure负载均衡器正在看到空闲连接并将其终止。

<强>修正

在客户端和rabbitmq之间的长时间连接上启用心跳。您可以通过将?heartbeat = 5附加到服务器连接字符串的末尾来轻松完成此操作:

var a = $(geojson[0].features[1]).offset();
alert(a.top);

<强>资源

Azure负载平衡背景和超时:http://blogs.msdn.com/b/avkashchauhan/archive/2011/11/12/windows-azure-load-balancer-timeout-details.aspx

amqp-lib heartbeats:http://www.squaremobius.net/amqp.node/doc/channel_api.html