我的node.js API上有一个socket.io服务器。
当node.js服务器不执行任何操作时,df2 = (df.groupby(['sample', 'alpha', 'lambda', 'n_fold']).apply(lambda x: (x.score*x.count)/sum(count)).to_frame('final'))
事件的延迟通常为5到10毫秒。但是,当node.js服务器正在处理一些非常复杂的http请求时,延迟会跳到100甚至超过5000,从而导致pong
。
我对延迟产生的影响感到好奇吗?
而且,我们的框架需要稳定的套接字连接,才能将长http请求的信息发送到与请求相同的套接字。我们如何才能在没有很长的ping timeout
和pingTimeout
的情况下稳定连接。
答案 0 :(得分:2)
这实际上取决于“处理一些非常复杂的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工作并离开主节点.js可以自由处理,以极低的延迟处理传入(非CPU密集型)请求。
如果您有多个可能占用CPU的操作,那么您要么将它们全部植入子进程(可能通过某种工作队列),要么可以部署集群。集群面临的挑战是,给定的socket.io连接将连接到集群中的一台特定服务器,如果正是这个进程恰好在执行CPU占用操作,那么分配给该服务器的所有socket.io连接将有不好的延迟。因此,常规群集可能不适用于此类问题。工作队列和多个专门处理CPU密集型工作的子进程可能更好,因为这些进程将没有它们负责的任何外部socket.io连接。