node 单线程是怎么应对高并发的场景的?

2022-01-20 17:15:25 +08:00
 leebs

node 单线程处理事件请求,一个请求卡住了,后续其他请求都会卡住,用 node 做业务处理,并发高的情况下,岂不是后面的请求可能会一直排队? node 不是单线程分发事件,多线程处理事件嘛?

12403 次点击
所在节点    Node.js
43 条回复
kxuanobj
2022-01-20 17:21:48 +08:00
你不要卡住不就行了。。需要改改非要让代码卡住的问题。
BluesQu
2022-01-20 17:21:56 +08:00
node 不是单线程 JavaScript 才是单线程 一个请求卡住 暂时没有返回的话 并不影响后续请求的执行
Leviathann
2022-01-20 17:22:42 +08:00
卡住就下一个
anonymousar
2022-01-20 17:25:21 +08:00
@kxuanobj 楼主所说的卡住 应该是指 需要 cpu 计算的不可避免的那部分吧 类似 redis 中出现的慢查询。

不太了解 node 但是单线程利用多核可以走 multi process, 也可以搞 one event base per thread
leebs
2022-01-20 17:25:39 +08:00
@kxuanobj 一个请求处理 1s ,第十个请求岂不是要等个 10s 左右的时间,如果请求没有 IO 要处理的话。
macy
2022-01-20 17:26:10 +08:00
node 实际上底层有个 libuv 线程池,看看 node 的时间循环就知道了,只要不是 cpu 密集型,把 cpu 卡住了,就没事。
Kasumi20
2022-01-20 17:27:08 +08:00
主线程处理连接,返回数据,数据的处理交给工作线程去干,一个连接对应一个线程可能比较耗费资源,所以要用协程之内的东西
Kasumi20
2022-01-20 17:33:37 +08:00
你可以看看我这个代码,对每个请求都会同步地调用 Youtube-dl ,但是不会卡住别的请求,因为有多线程呀

https://github.com/develon2015/Youtube-dl-REST/blob/node/index.js#L182
jorneyr
2022-01-20 17:39:13 +08:00
@macy 就担心 CPU 计算密集型业务。
akira
2022-01-20 17:49:39 +08:00
CPU 计算密集型 放合适的地方啊, 为啥要指望一个语言打天下呢
for8ever
2022-01-20 18:09:17 +08:00
node 适合 IO 密集,不适合 CPU 密集
leebs
2022-01-20 18:14:05 +08:00
@for8ever 复杂业务很难定义属于哪一类吧,总不能为了一个小的需求用其他语言做单独实现。
zonghow
2022-01-20 18:26:28 +08:00
一般都是根据 cpu 线程数 单机多实例部署吧
makelove
2022-01-20 18:40:49 +08:00
node 全异步怎么会卡住?业务很少有 CPU 密集部分,CPU 密集部分也不会放在 web 请求中,在 web 请求中搞 CPU 密集放哪个语言多进程框架都不行毕竟线程也是很有限的。
mxT52CRuqR6o5
2022-01-20 18:44:38 +08:00
[单线程分发事件,多线程处理事件] 多线程指的不是真正的系统层面上的线程,甚至你也可以把句话认为是错误的
node 那些常用的框架正常开发出来应该都是单核应用
正常的异步内部逻辑不会卡后续逻辑,如果你现在确实碰到了卡后续请求的问题,可能是使用了同步版本的 IO 调用(导致无法利用 JS 的异步能力),也可能是本身业务 cpu 运算量就大
简单点的利用多核的方法可以直接用 PM2
knives
2022-01-20 19:40:24 +08:00
担心主线程卡住,worker_threads 了解一下: http://nodejs.cn/api/worker_threads.html
hotsymbol
2022-01-20 23:36:08 +08:00
发给下游服务去处理。
3dwelcome
2022-01-20 23:46:22 +08:00
你想一下,领导给你一个人的任务太多,卡住怎么办?

很简单,把工作给下面的人分下去,人多力量大。

nodejs 也是同理,当然有些数据库之类的写入,还是尽量用消息队列处理。
ETiV
2022-01-20 23:55:52 +08:00
需要人灵活地使用工具

拿电钻去钉钉子是不对的 😂
LUO12826
2022-01-21 00:47:34 +08:00
@leebs 如果你这 1s 内 cpu (单核)占满,那确实后面的请求就得排队了。但一个请求要 cpu 实实在在算 1s 的业务,估计也不会用 node 写了。不过 node 也有了 worker_threads ,甚至可以调用 c++模块,一定程度上有利于计算密集型任务。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/829521

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX