首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >node.js socket.io服务器长延迟

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

Stack Overflow用户
提问于 2018-07-25 00:43:24
回答 1查看 797关注 0票数 0

我的socket.io API上有一个node.js服务器。

当node.js服务器什么也不做时,pong事件的延迟通常是5-10毫秒。但是,当node.js服务器处理一些非常复杂的http请求时,延迟会跳到100甚至5000以上,从而导致ping timeout

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

而且,我们的框架需要一个稳定的套接字连接,以便在发出请求时将长http请求的信息发送到同一个套接字。没有很长的pingTimeoutpingInterval,我们如何使连接稳定。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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连接。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51509372

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档