谈起 Node 大家都知道它适用于处理高并发, I/O 密集的场景, 不适用于 CPU 密集的场景.
下面这些内容都是为了讲述为什么 Node 擅长处理 web 下高并发与 I/O 密集的场景.
什么是 I/O 密集与 CPU 密集?
I/O 密集 VS CPU 密集
CPU 密集: 涉及大量的逻辑计算, 如图形计算, 压缩, 解压, 加密, 解密...
I/O 密集: 文件操作, 网络操作, 数据库操作等
可见 Node 在 Web 场景下还是非常擅长的, 因为
常见的 Web 场景内容:
- 静态资源的读取
- 数据库操作
- 渲染页面
- ...
现在大多数公司使用 Node 作为中间层也是充分利用它的优点.
常见的处理高并发的方法
解决高并发可以从以下几个点入手:
- 提高处理速度: 缓存, 异步
- 增加处理人手: 多线程 (多进程), 扩容
下面以现实中举例来了解高并发, 以及解决方法:
客人 => 请求 (访问者)
厨师 => 服务器
一家新开的饭馆, 开始客人不多, 一个厨师就够了.
随时饭店有了名气, 客人开始排队吃饭, 一个厨师忙不过来了, 老板多雇佣了几个厨师.
最基本的通过增加服务器数量, 以及 nginx 的负载均衡来处理高并发
饭店经营出色, 人气持续增长, 老板觉得一直增加厨师, 成本有点大, 不如找一些做事快的, 即使价格比一般的贵点的, 算下来比较划算.
通过增加每台服务器的 CPU 数 (多核)
进程
进程是计算机程序关于某数据集合上的一次运行活动, 是系统进行资源分配和调度的基本单位.
简单理解, 你在你的 Mac 上同时打开 QQ 听歌, Chrome 浏览器浏览资料, 打开编辑器写代码.
你此时就是同时打开了几个程序, 执行了几个进程.
多进程
多进程: 启动多个进程, 多个进程可以一块执行多个任务
计算机实际上不会同时执行多个进程, 只不过它切换速度太快了, 快到我们视觉察觉不出来, 彷佛是同步进行的.
你可以想象为一桢桢的图片拼接为动画的感觉.
线程
线程: 进程内一个相对独立的, 可调度的执行单元, 与同属一个进程的线程共享进程的资源.
多线程
多线程: 启动一个进程, 在一个进程内启动多个线程, 多个线程可以共同完成多个任务.
对 Apache 服务器的基本认识
Apache 使用的是 select 模型.
每来一个 http 请求, 服务器就会开启一个进程, 来处理这个请求, Apache 使用的阻塞 IO 模型, 启动的这个进程不会立即关闭, 而是等待这个 IO 结束, 在等待 IO 的过程中, 该进程的 CPU 是在一直空转, 这就会导致 CPU 的利用率不高.
如果 http 请求过多, 就开启多个进程来处理高并发, 但是一台机器处理能力有限, CPU 分配的进程数量是有限的. 超过进程数量极限, 其他请求就需要排队, 等待空闲的进程.
Node 工作模型
对于 Node 来说, 单线程, 一个 CPU 只开一个进程, 一个进程只有一个线程.
Node 的单线程只是针对主进程而言, 所有阻塞的部分交给一个线程池处理, 然后这个主线程通过一个队列跟线程池协作.
I/O 操作系统底层是多线程调度的.
另外 Node 有提供 Cluster 模块来解决多核 CPU 问题.
来源: https://juejin.im/entry/5beb1745f265da616e4bfd24