具有 API 端点的 Node.js 应用程序需要 20 秒+::连接保持打开状态::如何优化?

标签 node.js

我有一个返回 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/

相关文章:

node.js - 使用 Digital Ocean 和 FlightPlan.js 时 Node 应用程序出错 - 所有配置的身份验证方法均失败

Bunyan 中的 Node.js 顺序日志记录

javascript - 使用node js websockets实时显示温度

android - React Native 陷入配置 React-Native-gesture-handler 的困境

javascript - Node.js 中的 Facebook Messenger 机器人

node.js - 在 PassportJS 中使用多种本地策略

javascript - 如何在文本区域字段中显示图像代替用户输入的 URL?

javascript - 在验证模式中使用 isStrongPassword

javascript - 如何根据express/mssql中间件反馈有条件地渲染页面

node.js - 模拟存储库,然后换成 Node.js 中的实际实现