代码之家  ›  专栏  ›  技术社区  ›  zhangjinzhou

node.js socket.io服务器长延迟

  •  0
  • zhangjinzhou  · 技术社区  · 6 年前

    我的node.js api上有socket.io服务器。

    当node.js服务器不执行任何操作时, pong 事件通常为5-10毫秒。但是,当node.js服务器处理一些非常复杂的HTTP请求时,延迟会跳到100以上,甚至超过5000,导致 ping timeout .

    我很好奇是什么影响了延迟?

    而且,我们的框架需要一个稳定的套接字连接来将一个长HTTP请求的信息发送到发出请求的同一个套接字。我们怎么能不花很长时间就使连接稳定呢 pingTimeout pingInterval .

    1 回复  |  直到 6 年前
        1
  •  2
  •   jfriend00    6 年前

    这实际上取决于“处理一些非常复杂的HTTP请求”正在做什么。node.js将您的javascript作为单个线程运行。这意味着它一次只能做一件事。但是,由于服务器所做的许多事情都与I/O相关(从数据库中读取、从文件中获取数据、从另一台服务器获取数据等等),node.js使用事件驱动的异步I/O,因此它通常会同时出现许多问题,因此它似乎同时处理许多请求。

    但是,如果您的复杂HTTP请求是CPU密集型的,使用大量的CPU,那么它将占用单个JavaScript线程,而在占用CPU时,其他任何事情都无法完成。这意味着所有传入的http或socket.io请求都必须在队列中等待,直到one node.js javascript线程空闲,以便它可以从事件队列中获取下一个事件并开始处理该传入请求。

    只有当我们看到这个“非常复杂的HTTP请求”的代码时,我们才能更具体地帮助您。

    解决node.js中占用CPU的问题的通常方法是将CPU密集型的东西卸载到其他进程中。如果导致问题的主要是这段代码,那么可以旋转几个子进程(可能与服务器中的CPU数量一样多),然后为它们提供CPU密集型工作,让main node.js进程自由处理传入(非CPU密集型)请求,延迟非常低。

    如果您有可能占用CPU的多个操作,那么您要么必须将它们全部转移到子进程(可能通过某种工作队列),要么可以部署集群。集群的挑战是给定的socket.io连接将连接到集群中的一个特定服务器,如果恰好是该进程执行占用CPU的操作,那么分配给该服务器的所有socket.io连接都将具有不良的延迟。因此,对于这种类型的问题,常规集群可能不太好。处理CPU密集型工作的工作队列和多个专用子进程可能更好,因为这些进程不会有任何它们负责的外部socket.io连接。