我们有一个C#Web API服务器和一个Node Express服务器。我们从C#服务器向节点服务器上的路由发出数百个请求。节点服务器上的路由执行密集工作,通常不会返回6-8秒。
同时发出数百个这样的请求似乎会导致节点服务器失败。节点服务器输出中的错误包括socket hang up
或ECONNRESET
。来自C#端的错误说
无法建立连接,因为目标计算机主动拒绝它。
处理不可预测数量的请求后会发生此错误,这导致我认为它只是使服务器过载。在C#端使用Thread.Sleep(500)
允许我们接受更多请求,并且摆弄等待会导致或多或少的成功,但线程休眠很少,如果有正确的答案,我认为这种情况是否定的异常。
我们是否只是在节点服务器上施加了太多压力?这只能通过负载平衡或某种形式的群集来解决吗?如果还有另一种选择,它会是什么样子?
我开始探索的一条路径是node-toobusy
模块。如果我返回503,那么下面代码中的进程应该是什么?我应该Thread.Sleep
然后重新提交请求吗?
答案 0 :(得分:0)
听起来你的node.js服务器过载了。
节点服务器上的路由执行密集工作,通常不会返回6-8秒。
这是一种难闻的气味 - 如果您的节点进程正在进行大量计算,它将暂停事件循环,直到该计算完成,并且将无法处理任何其他请求。你应该让它在一个工作进程中进行计算,如果可用的话,它将运行在另一个cpu核心上。 cluster
是节点内置模块,可以让你这样做,所以我会指出你。
我开始探索的一条路径是node-toobusy模块。如果我返回503,那么下面代码中的进程应该是什么?我应该Thread.Sleep然后重新提交请求吗?
这取决于您的应用程序和预期的负载。如果在那段时间内事情可能会冷却下来,你可能想要刷新一次或两次,但是对于你的API,你可能只想在C#中返回503 - 更好地让客户知道服务器太忙而让他们做出自己的决定,然后代表它继续刷新。