【问题标题】:NodeJS & Socket.IONodeJS 和 Socket.IO
【发布时间】:2013-10-23 10:31:07
【问题描述】:

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

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

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

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

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

Note: NodeJS 0.10.20 和 Socket.IO 0.9.16。

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

【问题讨论】:

  • 如果你喜欢你可以发布一些代码,我们可以找到解决方案,看来你不是唯一一个遇到这个问题的人?
  • 是的,一些代码会有所帮助,或者至少描述一下服务器接收 ZeroMQ 消息和服务器写入套接字之间发生的情况。

标签: javascript node.js socket.io


【解决方案1】:

看看这个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 处理模型的模型,看看事件循环及其周围发生了什么

【讨论】:

  • 这真是一个回答朋友的地狱
  • @TheOnin 我也有这种感觉,但遗憾的是仍然没有被接受的问题:D
【解决方案2】:

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

查看这篇文章了解更多信息: http://drewww.github.io/socket.io-benchmarking/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-16
    • 2015-03-19
    • 2012-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-14
    相关资源
    最近更新 更多