我在使用 NodeJS
和 Socket.io
时遇到了一个奇怪的问题。
通过 ZeroMQ
接收数据的服务器。那工作完美。
对于来自 ZeroMQ
的每条消息,我使用 sockets.volatile.emit
将其发送到所有连接的客户端。
该问题仅出现在大量连接的帐户(超过 100 个)上,似乎有一个发送给客户端的队列(客户端接收消息延迟不断增加)
注意:每个连接的客户端都从 ZeroMQ 接收到每条消息,所以基本上对于更多的客户端,通过 socket.IO 发送的数据更多。
通过日志/调试我知道来自 ZeroMQ
的接收没有延迟,并且所有工作都在该部分工作。发射似乎有一个不断增加的队列或延迟。
每个客户端的消息速率为 80
条消息/秒。
注意:
NodeJS 0.10.20 和 Socket.IO 0.9.16。
如何控制它以防止客户端收到旧消息?
最佳答案
查看此 article它会告诉你很多基本的错误,它是关于阻塞事件循环的,这看起来和你做的很相似。
也许使用以下工具:Debug和 Blocked我认为这将有助于解决您的问题。两者都可以调试您在哪里造成性能瓶颈和其他基本问题。
或者将您的 Node 项目挂接到 PM2 并将其绑定(bind)到 Keymetrics.IO这将使您能够很好地了解您的服务器以及它运行缓慢的原因以及为什么会出现性能瓶颈。
如果没有代码示例,很难解决您的问题,但以下是您的应用或您可能会造成瓶颈的 3 个原因(可能是在不知不觉中):
使用 JSON.parse 函数解析大型 json 负载。
尝试在后端的大文件上进行语法高亮(使用 Ace 或 highlight.js 之类的东西)。
一次性解析大输出(例如来自子进程的 git log 命令的输出)。
更多信息见第article在名为 “阻塞事件循环”的第 2 节中
一个与你有关的问题, this one 。
想了解更多关于事件循环的信息,我可以热情地引导您了解胎面 "How the single threaded non blocking IO model works in Node.js "
这是一个 Node.js 处理模型的模型,看看事件循环及其周围发生了什么
关于javascript - NodeJS 和 Socket.IO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19539219/