调试节点集群中的杂散未捕获异常 (ECONNRESET)

Posted

技术标签:

【中文标题】调试节点集群中的杂散未捕获异常 (ECONNRESET)【英文标题】:Debugging stray uncaught exceptions (ECONNRESET) in a node cluster 【发布时间】:2013-06-01 18:29:11 【问题描述】:

在使用集群模块的 node.js 应用程序中,我间歇性地看到如下错误:

events.js:71
        throw er; // Unhandled 'error' event
              ^
Error: read ECONNRESET
    at errnoException (net.js:863:11)
    at TCP.onread (net.js:524:19)

这会导致我的整个应用程序崩溃,到目前为止,我能够处理这些问题的唯一方法是绑定 process.on('uncaughtException')。我想找出根本原因,但上面的堆栈跟踪毫无用处。

有什么方法可以找出导致这些异常的原因吗?

我应该注意,我只在集群主服务器中看到这些,而不是在工作人员中,这让我怀疑它们与集群模块在将连接分配给工作人员时发挥其魔力的方式有关。

【问题讨论】:

How to debug a socket hang up error in NodeJS?的可能重复 【参考方案1】:

这个答案很有帮助:https://***.com/a/11542134/233370

基本上,我安装了longjohn,然后能够获得完整的异步堆栈跟踪以找出根本原因(在我的例子中是rabbit.js)。

【讨论】:

【参考方案2】:

似乎 express 默认启用了 keep-alive。 为了在响应后关闭连接,您可以添加 res.set("Connection", "close");

或者,您可以在应用中添加中间件以在每次响应后关闭连接:

 app.use(function(req, res, next) 
         res.set("Connection", "close");
         next();
     );

【讨论】:

以上是关于调试节点集群中的杂散未捕获异常 (ECONNRESET)的主要内容,如果未能解决你的问题,请参考以下文章

Ajax 响应中的杂散字符?

string中的杂散知识点

telnet 协商中的杂散数据字节。它来自哪里?

在 snprintf 的输出中看到的杂散字符

boost::iostreams::copy() 的异常

自动捕获 BlazeDS 远程处理方法引发的所有异常?