我一直在努力解决这个问题,但是找不到一个好的解决方案,所以来这里寻求帮助。
我有一个node.js服务器;在收到客户端的请求后,服务器将联系第三方后端获取一些数据,并将其返回给客户端。
服务器到第三方后端通信涉及多个来回呼叫,通常需要约3秒才能完成此过程。
如果我发出来自JMeter等测试工具的50个并发请求,性能下降会很快变得严重,甚至导致一些后来服务的呼叫超时。
最初我开始研究asyncblock,但由于它是在光纤上运行的,我没有看到性能有很大改进,所以我开始研究线程。
我能找到的唯一成熟的模块是thread-a-gogo,但我最近也发现你不能在TAGG产生的线程中使用所需的外部模块(例如crypto)。
鉴于有使用node.js构建的代理产品,我相信有一种有效的方法可以做到这一点,但如果线程不能使用外部模块,我真的不能想到其他方法。
任何建议都将受到赞赏。
由于NDA,我无法透露全部细节,但这是我正在做的基本概念。我想将以下逻辑发送到一个单独的线程。
asyncblock(flow){
var result1 = flow.sync(externalRequest1(flow.callback());
if result1 contains success message
var result2 = flow.sync(externalRequest2(flow.callback());
if result2 contains success message
process result2 and return to client
}
答案 0 :(得分:2)
首先要检查并确定:您使用的是node.js核心HTTP代理吗?如果是这样,您将受到与同一服务器的5个连接的maxSockets限制。请阅读the hyperquest README rant了解详情。
其次,请注意远程端也可能会施加滥用限制,因此请检查是否存在问题,或者如果您使用单个10个连接池而不是无限制地打开,则整体性能会更好与上游服务器同时连接的数量。