3

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

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

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

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

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

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

4

1 回答 1

0

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

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

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

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

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

于 2016-02-02T05:22:25.870 回答