NodeJS& Socket.IO

时间:2013-10-23 10:31:07

标签: javascript node.js socket.io

使用NodeJSSocket.io时,我遇到了一个奇怪的问题。

通过ZeroMQ接收数据的服务器。那工作完美。 对于来自ZeroMQ的每条消息,我使用sockets.volatile.emit将其发送给所有连接的客户端。 问题仅出现在大量连接帐户(超过100个)上,似乎有一个队列发送给客户端(客户端接收消息的延迟不断增加)

注意:每个连接的客户端都收到来自ZeroMQ的每条消息,因此基本上对于更多客户端,通过socket.IO发送的数据更多。

通过日志/调试我知道来自ZeroMQ的接收没有延迟,并且所有工作都在该部分。发射似乎有一个不断增加的队列或延迟。

每个客户的消息速率为80条消息/秒。

Note: NodeJS 0.10.20和Socket.IO 0.9.16。

如何控制它以防止客户端收到旧消息?

2 个答案:

答案 0 :(得分:13)

结帐这个article它会告诉你许多基本的错误,就是阻止事件循环,这看起来与你的行为非常相似。

也许使用以下工具:DebugBlocked我认为这有助于解决您的问题。两者都要调试你在性能和创建方面造成瓶颈的地方其他基本问题。

或者将节点项目挂钩在 PM2 上,然后将其绑定到Keymetrics.IO,这样可以很好地了解服务器及其运行缓慢的原因以及造成性能瓶颈的原因。

如果没有代码示例很难解决您的问题,但这里有3个原因可以解释您的应用或者您可能会产生瓶颈(可能是在不知不觉中):

  • 使用JSON.parse函数解析大型json有效负载。

  • 尝试在后端的大文件上进行语法高亮显示(使用Ace或highlight.js之类的东西)。

  • 一次性解析一个大输出(例如从子进程输出git log命令)。

第2部分第一个article中的更多信息,名为“阻止事件循环”

与您有关的问题, this one

想要了解更多关于事件循环的信息,我可以热情地指导您进行操作How the single threaded non blocking IO model works in Node.js

这是Node.js处理模型的模型,以查看事件循环及其周围环境会发生什么

Node.js processing model

答案 1 :(得分:0)

如果事实证明你没有以任何可怕的方式阻止事件循环,那么你可能会对 socket.io 可以处理特定应用程序的限制达到极限。如果是这种情况,那么您可以考虑扩展您的实例。

查看此文章以获取更多信息: http://drewww.github.io/socket.io-benchmarking/