我的socket.io API上有一个node.js服务器。
当node.js服务器什么也不做时,pong事件的延迟通常是5-10毫秒。但是,当node.js服务器处理一些非常复杂的http请求时,延迟会跳到100甚至5000以上,从而导致ping timeout。
我很好奇是什么影响了延迟?
而且,我们的框架需要一个稳定的套接字连接,以便在发出请求时将长http请求的信息发送到同一个套接字。没有很长的pingTimeout和pingInterval,我们如何使连接稳定。
发布于 2018-07-25 00:58:25
这真的取决于“处理一些非常复杂的http请求”在做什么。node.js将Javascript作为一个线程运行。这意味着它一次只能做一件事。但是,由于服务器所做的许多事情都与I/O相关(从数据库读取、从文件中获取数据、从其他服务器获取数据等等)。而且node.js使用事件驱动的异步I/O,它通常同时有许多球在空中,因此它似乎同时处理大量的请求。
但是,如果您的复杂http请求是CPU密集型的,需要使用大量的CPU,那么它占用了单个Javascript线程,在占用CPU的同时,什么也做不了。这意味着所有传入的HTTP或socket.io请求都必须在队列中等待,直到一个node.js Javascript线程空闲,以便它能够从事件队列中获取下一个事件并开始处理该传入请求。
只有当我们看到这个“非常复杂的http请求”的代码时,我们才能更具体地帮助您。
围绕node.js中占据CPU的东西,通常的方法是将CPU密集型的东西卸载到其他进程。如果只是这一段代码造成了问题,您可以拆分几个子进程(可能与您服务器中的CPU数量一样多),然后将CPU密集型的工作提供给它们,让主node.js进程以非常低的延迟处理传入的(非CPU密集型的)请求。
如果您有可能占用CPU的多个操作,那么要么必须将它们全部分配给子进程(可能是通过某种工作队列),要么可以部署集群。集群的挑战是,给定的socket.io连接将指向集群中的一个特定服务器,如果该进程恰好执行占用CPU的操作,那么分配给该服务器的所有socket.io连接都会有不良的延迟。因此,对于这类问题来说,常规聚类可能不太好。用于处理CPU密集型工作的工作队列和多个专门的子进程可能更好,因为这些进程将没有它们负责的任何外部socket.io连接。
https://stackoverflow.com/questions/51509372
复制相似问题