[TOC]
# Node.js的弊端
### 单线程带来的弊端
Node.js中有一个特点就是单线程,它带来了很多好处,但是它也有弊端,单线程弱点如下。
1. 无法利用多核 CPU
2. 错误会引起整个应用退出无法继续调用异步`I/O`
3. 大量计算占用 CPU 导致无法继续调用异步`I/O`
以上确实是 Node 的弊端,但是都会有一些对应的解决方案:
弊端1:解决方案
* (1)一些管理工具比如`pm2,forever` 等都可以实现创建多进程解决多核 CUP 的利用率问题。
* (2)在 v0.8 版本之前,实现多进程可以使用 `child_process`
* (3)在 v0.8 版本之后,可以使用`cluster` 模块,通过主从模式,创建多个工作进程解决多核CPU的利用率问题。
弊端2:解决方案
* (1)Nnigx 反向代理,负载均衡,开多个进程,绑定多个端口;
* (2) 一些管理工具比如`pm2,forever`等都可以实现进程监控,错误自动重启等
* (3)开多个进程监听同一个端口,使用Node提供的`cluster`模块;
* (4)未出现`cluster`之前,也可以使用`child_process`,创建多子线程监听一个端口。
* (5)这里说明下,有上面的这些解决方案,但是写node后端代码的时候,异常抛出`try catch`显得格外有必要。
弊端3:解决方案
* (1)可以把大量的密集计算像上面一样拆分成多个子线程计算
* 但是如果不允许拆分,想计算100万的大数据,在一个单线程中,Node确实显得无能为力,这本身就是V8内存限制的弊端。
> 说明:`child_process`与`cluster`模块我会单独拿一篇文章来讲。 值得开心的是上面这些弊端随着Node 的版本更新,和新的 api 模块出现,好像解决了这些弊端。
# Node.js的应用场景
介绍了Node.js的特点和弊端,再说一下Node.js的应用场景。
Node.js适合用来开发什么样的应用程序呢?
善于`I/O`,不善于计算。因为`Node.js`最擅长的就是任务调度,如果你的业务有很多的`CPU`计算,实际上也相当于这个计算阻塞了这个单线程,就不太适合Node开发,但是也不是没有解决方案,只是说不太适合。
当应用程序需要处理大量并发的`I/O`,而在向客户端发出响应之前,应用程序内部并不需要进行非常复杂的处理的时候,`Node.js`非常适合。`Node.js`也非常适合与`websocket`配合,开发长连接的实时交互应用程序。
具体场景可以表现为如下:
* 第一大类:用户表单收集系统、后台管理系统、实时交互系统、考试系统、联网软件、高并发量的web应用程序;
* 第二大类:基于web、canvas等多人联网游戏;
* 第三大类:基于web的多人实时聊天客户端、聊天室、图文直播;
比如聊天服务,聊天应用程序是最能体现 Node.js 优点的例子:轻量级、高流量并且能良好的应对跨平台设备上运行密集型数据(虽然计算能力低)。同时,聊天也是一个非常值得学习的用例,因为它很简单,并且涵盖了目前为止一个典型的 Node.js 会用到的大部分解决方案。
* 第四大类:单页面浏览器应用程序;
* 第五大类:操作数据库、为前端和移动端提供基于`json`的 RESTful API;
这是适合 Node 的理想情况,因为您可以构建它来处理数万条连接。它仍然不需要大量逻辑;它本质上只是从某个数据库中查找一些值并将它们组成一个响应。由于响应是少量文本,入站请求也是少量的文本,因此流量不高,一台机器甚至也可以处理最繁忙的公司的 API 需求。
* 第六大类,....
# 哪些大公司在用
* 雅虎:雅虎开放了 `Cooktail`框架,将 `YUI3`这个前端框架的能力借助Node延伸到了服务器端。
* 腾讯:将Node应用到长连接,以提供实时功能。
* 花瓣网,蘑菇街:通过 `socket.io` 实现实时通知。
* 阿里:主要利用的是并行 `I/O` 这个性能,实现高效的分布式,它们自己也出了很多Node框架
* LinkedIn:移动网站也是使用的 Node
* 网易:游戏领域对并发和实时要求很高,网易开源了 Node 的实时框架 `pomelo`
* 等等...