NodeJS和Socket.IO

10

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

服务器通过 ZeroMQ 接收数据,这部分工作非常完美。对于来自 ZeroMQ 的每条消息,我使用 sockets.volatile.emit 将其发送到所有连接的客户端。

问题只出现在连接的账户数量很多(超过100),似乎存在一个发送给客户端的队列(客户端接收到延迟逐渐增加的消息)

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

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

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

注意: NodeJS 0.10.20 和 Socket.IO 0.9.16。

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


如果您愿意,可以发布一些代码,我们可以找到解决方案,似乎您不是唯一遇到这个问题的人? - Simon Dragsbæk
是的,一些代码会很有帮助,或者至少描述一下当服务器接收到ZeroMQ消息时和服务器写入套接字之间发生了什么。 - strider
2个回答

13

请看这篇文章,它将告诉你许多基本错误,其中一个是阻塞事件循环,这似乎与你正在做的事情非常相似。

也许可以使用诸如:DebugBlocked等工具,我认为这将有助于解决你的问题。两者都可用于调试性能瓶颈及其他基本问题。

或者将您的Node项目连接到PM2并绑定到Keymetrics.IO,这将为您提供对服务器的良好视图,以及为什么运行缓慢以及为什么产生性能瓶颈。

在没有代码示例的情况下解决您的问题很难,但以下是三个原因,可能您的应用程序或您可能会意外地创建瓶颈:

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

  • 尝试在后端处理大型文件的语法突出显示(例如使用Ace或highlight.js)。

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

有关更多信息,请参见第一个文章中第2部分的“阻塞事件循环”。

与您相关的问题,这个

想更了解事件循环?我热情地向您推荐一个讨论帖子 "How the single threaded non blocking IO model works in Node.js"

这是Node.js处理模型的示意图,可以看到事件循环及其周围发生的情况。

Node.js processing model


1
那是一个非常棒的答案,朋友。 - The Onin
@TheOnin 我也有同感,但是还没有被接受的问题 :D - Simon Dragsbæk

0

如果你确定你没有以任何可怕的方式阻塞事件循环,那么你可能会达到了 socket.io 处理你特定应用程序的极限。如果是这种情况,那么你可以考虑扩大实例规模。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接