ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[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` * 等等...