【问题标题】:Putting a Load on Node给节点增加负载
【发布时间】:2016-05-10 18:41:48
【问题描述】:

我们有一个 C# Web API 服务器和一个 Node Express 服务器。我们从 C# 服务器向 Node 服务器上的路由发出数百个请求。 Node 服务器上的路由做了大量的工作,经常 6-8 秒不返回。

同时发出数百个这样的请求似乎会导致 Node 服务器失败。节点服务器输出中的错误包括 socket hang upECONNRESET。 C# 方面的错误说

由于目标机器主动拒绝,无法建立连接。

在处理不可预测数量的请求后会发生此错误,这使我认为它只是使服务器超载。在 C# 端使用Thread.Sleep(500) 可以让我们处理更多请求,并且摆弄那里的等待或多或少会导致成功,但是线程休眠很少是正确的答案,我认为这种情况也不例外。

我们是否只是对 Node 服务器施加了太大的压力?这只能通过负载平衡或某种形式的集群来解决吗?如果有另一种选择,它会是什么样子?

我开始探索的一条路径是node-toobusy 模块。如果我返回 503,那么下面代码中的过程应该是什么?我应该Thread.Sleep然后重新提交请求吗?

【问题讨论】:

标签: node.js multithreading server load econnreset


【解决方案1】:

听起来您的 node.js 服务器正在过载。

Node 服务器上的路由做了大量工作,经常 6-8 秒不返回。

这是一种不好的气味 - 如果您的节点进程正在进行密集计算,它将暂停事件循环,直到该计算完成,并且无法处理任何其他请求。您可能应该让它在一个工作进程中进行计算,如果可用,它将在另一个 cpu 核心上运行。 cluster 是 node 内置模块,可以让你这样做,所以我会指出你那里。

我开始探索的一条路径是 node-toobusy 模块。如果我返回 503,那么以下代码中的过程应该是什么?我应该 Thread.Sleep 然后重新提交请求吗?

这取决于您的应用程序和您的预期负载。如果在此期间事情可能会足够冷却,您可能需要刷新一次或两次,但对于您的 API,您可能也只想在 C# 中返回 503 - 最好让客户端知道服务器太忙并让他们做出自己的决定,然后代表它保持刷新。

【讨论】:

  • child_process.fork 是另一种生成工作 node.js 进程的方式
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-18
  • 1970-01-01
  • 2015-03-17
  • 2017-12-05
  • 2021-11-14
  • 1970-01-01
相关资源
最近更新 更多