我有一个返回 JSON 数据的 Node.js RESTful API。其中一个 API 调用可能(而且经常)需要 10 - 20 秒才能完成。这么长的 RTT 是由于连接到外部 API 造成的,例如 DiffBot、MailChimp、Facebook、Twitter 等。我希望可以缩短 API 调用时间,但我做不到。
当然,我已经以一种很好的异步方式实现了 Node 代码,但问题是客户端的入站连接(到 Node 应用程序)在等待服务器完成时处于事件状态,因此可能会被终止我的表现。事实上,我目前猜测这可以解释 my long-running timeout issue in node .
我已经将 maxSockets 增加到一个巨大的数字...
require('http').globalAgent.maxSockets = 9999;
出于兴趣,每次建立新连接时我都会打印出事件套接字( here's the code )。
这给了我这样的输出:
SOCKETS: {} { 'graph.facebook.com:443': 5, 'api.instagram.com:443': 1 }
没有什么太有启发性的。我见过的所有主机上的最大连接总数约为 20 个左右。但这并没有真正告诉我有关传入连接的任何信息,也没有告诉我如何优化它们,以便我的服务器在有许多连接同时处于事件状态时不会阻塞(我怀疑是这样)。
最佳答案
您应该优化您的架构,而不仅仅是代码。
首先,我会改变客户端/服务器之间交互的方式。服务器应在收到请求后结束请求,并在该请求的所有任务真正完成后通知客户端。
有不同的方法可以实现这一目标。例如,客户端可以每 X 秒使用 AJAX(轮询)查询请求的统计信息。另一个例子是使用 WebSocket。
如果您要采用这种方法,请查看 Socket.IO 。它支持具有相同 API 的多种传输,如果 WebSocket 可用,它将使用它,否则,它将回退到其他传输,例如 Flash Socket、长轮询等。
其次,您不应该使用一个进程来完成所有这些工作。您应该使用队列(最好是支持队列的消息传递系统),然后运行工作线程(单独的进程)来完成“繁重的工作”。
就个人而言,我使用 AMQP 是因为它的功能和可移植性(它是一个开放标准),但可以随意使用任何其他具有持久后端的队列系统。
这样,如果一个或多个进程崩溃并且您使用了正确的队列,您就不会丢失任何数据(例如您提到的 API 任务)。
希望有帮助。
关于具有 API 端点的 Node.js 应用程序需要 20 秒+::连接保持打开状态::如何优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12939253/