Node.JS 是非阻塞异步操作. node 具有异步 I/O 特性, 每当有 I/O 请求发生时, node 会提供给该请求一个 I/O 线程. 然后 node 就不管这个 I/O 的操作过程了, 而是继续执行主线程上的事件, 只需要在该请求返回回调时在处理即可. 也就是 node 省去了许多等待请求的时间.
node 特点:
1,Chrome V8 引擎
2, 事件驱动
3, 非阻塞 I/O
4, 单线程
node 实现高并发的方法:
针对每个并发请求, 服务端给请求注册一个激发事件(I/O), 并给一个回调函数(这个过程没有阻塞新的连接请求).
按顺序执行事件处理(I/O), 处理完成后执行回调函数, 接着执行下一个事件处理(I/O).
事件处理 (I/O) 原理?
事件处理 (即异步 I/O 处理) 是由 node 工作线程去执行的(Node.JS 底层的 libuv 是由多线程的线程池并行 I/O 操作), 且主线程是不需要等待返回的, 只要发出指令后就可以执行其他事件, 所有操作完成后执行回调.
Node.JS 的优缺点
优点:
1, 高并发;
2, 适合 I/O 密集型应用.
缺点:
1, 不适合 CPU 密集型应用, 只支持单核 CPU, 不能充分利用 CPU;
2, 单进程, 单线程, 一旦代码某处出现 bug, 整个系统都崩溃;
如何解决 CPU 密集型?
原因, 由于 JavaScript 单线程的原因, 如果有长时间运行的计算(比如大循环), 将会导致 CPU 时间片不能释放, 使得后续 I/O 无法发起.
解决方案: 分解大型运算任务为多个小任务, 使得运算能够适时释放, 不阻塞 I/O 调用的发起.
单进程, 单线程解决方案
Nnigx 反向代理, 负载均衡, 开多个进程, 绑定多个端口;
开多个进程监听同一个端口, 使用 cluster 模块.
来源: http://www.css88.com/qa/node-js/10787.html