Node.js应用程序与APIterminal需要20秒+ ::连接左打开::如何优化?

我有一个返回JSON数据的Node.js RESTful API。 其中一个API调用可以(并且经常)需要10-20秒才能完成。 这个长时间的RTT是由于连接到外部API,比如DiffBot,MailChimp,Facebook,Twitter等。我希望我可以使API调用更短,但是我不能。

当然,我已经以很好的asynchronous方式实现了节点代码,但问题是客户端的入站连接(到节点应用程序)处于活动状态,而等待服务器完成,因此可能会导致性能下降。 实际上,我现在猜测这可能解释了我在节点中长时间运行的超时问题 。

我已经将maxSockets增加到了一个巨大的数字…

require('http').globalAgent.maxSockets = 9999; 

出于利益的考虑,每当有新连接时,我都会打印出活动套接字( 这里是代码 )。

这给了我这样的输出:

 SOCKETS: {} { 'graph.facebook.com:443': 5, 'api.instagram.com:443': 1 } 

没有什么太有启发性的。 我所看到的最大连接数在所有主机上大约在20左右。 但是,这并不能告诉我任何关于传入连接的信息,或者如何优化它们,以便我的服务器不会一下子同时存在(我怀疑它是存在的)。

你应该优化你的架构 ,而不仅仅是代码。

首先,我会改变客户端/服务器之间的交互方式。 服务器应该在收到请求时结束请求,一旦该请求的所有任务都真正完成,就通知客户端。

有不同的方法来实现这一点。 例如,客户端可以每X秒使用AJAX(轮询)来查询请求的统计信息。 另一个例子是使用WebSocket。

如果你要采用这种方法,请查看Socket.IO 。 它支持许多使用相同的API的传输,如果WebSocket可用,它将使用它,否则,它会回落到其他传输,如Flash Socket,长轮询等。

其次,你不应该用一个过程来完成所有这些工作。 你应该使用一个队列(最好是一个支持队列的消息传递系统),然后运行工人(单独的进程)来完成“繁重的工作”。

就我个人而言,由于其function和可移植性(这是一个开放标准),我使用AMQP,但随意使用任何其他具有持久后端的队列系统。

这样,如果一个或多个进程崩溃并且使用正确的队列,则不会丢失任何数据(例如您提到的API任务)。

希望能帮助到你。