谈起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问题。
推荐阅读:
Node is Not Single Threadedrickgaribay.net
node.js应用高并发高性能的核心关键本质是什么?www.zhihu.com