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

我已经看了这个问题好几天了,这让我非常难过。 我们有一个基于node.js的rabbitmq消费者,已经运行了一年多,没有任何问题。 最近,我们将应用程序部署到Azure,并将node.js组件部署到基于窗口的PAAS辅助angular色。 我们使用方形mo amqp-lib( https://github.com/squaremo/amqp.node )作为我们的客户端库接收来自RabbitMQ的消息。 angular色可以正常启动,处理请求没有问题,但会定期回收。

检查部署的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). 

虚拟机上的其他事件日志中没有任何其他信息。 我修改了angular色模型启动任务,以将所有控制台输出logging到文件中,该文件没有显示错误。 为了更好地了解所发生的事情,我使用$ ENV:NODE_DEBUG =“net,http”启用了http和net模块的NODE_DEBUG,然后直接从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 

在看到这个消息之后,消费者和服务器之间的某些事情正在closures连接,导致节点进程退出(我们没有听AMQP连接的错误事件),这反过来又导致了angular色回收。

我设法通过使用TCPView(sysInternals)手动closures到兔子服务器的连接复制此。

由于这只在部署到Azure时才会发生,所以我猜测必须有一些Azure基础结构以肮脏的方式closures此连接,导致出现问题。 但是什么?

我想我已经解决了这个问题! 这是非常棘手的,因为没有体面的错误消息和Azure负载平衡器的隐形。 事实certificate,这是一个非常简单的解决scheme,但是一个并不明显的解决scheme(直到你知道它,那么它是非常有意义的)。

简答

Azure负载平衡器正在查看空闲连接并将其消除。

固定

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

 amqp.connect('amqp://' + server + "?heartbeat=5", function(err, conn) { ... } 

资源

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

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