2

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

当然,我已经以一种很好的异步方式实现了节点代码,但问题是客户端的入站连接(到节点应用程序)在等待服务器完成时是活动的,因此可能会影响我的性能。事实上,我目前猜测这可以解释我在 node 中长时间运行的超时问题

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

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

为了感兴趣,每次建立新连接时,我都会打印出活动的套接字(这里是代码)。

这给了我这样的输出:

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

那里没有什么太有启发性的。我见过的最大连接数大约是 20 个左右,所有主机的总数。但这并没有真正告诉我有关传入连接的任何信息,或者如何优化它们,以使我的服务器在同时有许多连接时不会阻塞(我怀疑是这样)。

4

1 回答 1

0

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

首先,我会改变客户端/服务器相互交互的方式。服务器应在收到请求后结束请求,并在该请求的所有任务真正完成后通知客户端。

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

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

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

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

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

希望能帮助到你。

于 2012-11-16T03:53:09.697 回答