【问题标题】:Requests and connections double on node 4.1.2节点 4.1.2 上的请求和连接加倍
【发布时间】:2015-10-16 15:39:21
【问题描述】:

我们目前正在从节点 0.10 更新到节点 4.1.2,并且我们看到了一些奇怪的模式。与我们的 postgres 数据库的连接数量翻了一番1,我们看到与外部服务请求相同的模式2。我们正在运行一个运行本机集群 API 的集群应用程序,并且两个版本的工作人员数量相同。

我不明白为什么升级运行时语言会明显地通过对外部服务的请求加倍来改变应用程序的行为。

【问题讨论】:

  • 你使用哪个节点包来访问postgres?
  • pg v4.4.1。我还打开了issue on their repo,但我认为问题不是来自那里。
  • 他们发布了 4.4.2 来解决围绕 Node 4.x 支持的一些问题。你试过了吗?是什么让你认为问题不是来自那里?我会先怀疑 pg 包。
  • 根据pg 的作者的说法,很长一段时间以来,连接池方面没有任何改变。此外,我发布的第二张图是外部 HTTP 请求,它们似乎也加倍并且与 postgres 无关。我现在怀疑应用程序集群,但目前没有任何证据“加倍”。
  • 您的问题需要独特的研究。任何人都不太可能知道这个问题,尤其是考虑到 NodeJS 4.x 的新鲜程度。

标签: node.js


【解决方案1】:

我注意到 0.12 和 4.x 的一个有趣的事情是垃圾收集的变化。我以前没有使用过 pg 模块,所以我不知道它在内部是如何维护它的池的,它是否会受到内存或垃圾收集的影响。如果您还没有为节点定义默认内存设置,您可以尝试尝试一下,看看您是否看到任何其他结果。

node --max_old_space_size <some sane value in MB>

【讨论】:

  • 经过更多调查,我怀疑问题出在 postgres 和连接池上。真正令人担忧的是传出 HTTP 请求的数量,它位于应用程序逻辑中并且不使用任何外部库。
【解决方案2】:

我遇到了类似的情况,但我收到了双文件写入。我不知道你的具体情况,但我见过一个请求几乎完全翻倍的场景。

在 4.1.2 的更新中,process.sendchild.send 已从同步变为异步

我发现了这样一个问题:

var child = fork('./request.js');
var test = {};

child.send(small request);
child.send(large request);
child.on('response', function (val) {
    console.log('small request came back: ' + val);
    test = val;
});

if(!test){
   //retry request
} ...

因此,在之前的阻塞发送允许此代码工作的情况下,非阻塞版本假定发生了错误并重试。实际上没有发生错误,所以请求加倍。

【讨论】:

  • 有趣。我们正在使用throng 进行集群并分叉整个应用程序。里面没有重试逻辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-13
  • 2016-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-26
相关资源
最近更新 更多