Node.js是一个Javascript运行环境(runtime),它使Javascript能够运行于浏览器之外,用于方便地搭建响应速度快、易于扩展的网络应用。
优点:
1、高并发:
传统的网络服务技术每新增一个连接(请求)便生成一个新的线程,这个新的线程会占用系统内存,最终会占掉所有的可用内存。而 Node.js 仅仅只运行在一个单线程中,使用非阻塞的异步 I/O 调用,所有连接都由该线程处理,因为它能够处理庞大并且高吞吐量的并发连接。
2、适合I/O密集型应用:
能够实现I/O多路复用 (单个线程,通过记录跟踪每个I/O流(sock)的状态,来同时管理多个I/O流 )。Node.js不适合CPU密集型应用,CPU密集型应用给Node带来的挑战主要是:由于JavaScript单线程的原因,如果有长时间运行的计算(比如大循环),将会导致CPU时间片不能释放,使得后续I/O无法发起;可以通过分解大型运算任务为多个小任务,使得运算能够适时释放,不阻塞I/O调用的发起来进行优化。
3、事件和回调函数:
Node.js将前端浏览器中应用广泛且成熟的事件引入后端,配合异步I/O,将事件点暴露给业务逻辑。如Ajax请求绑定success事件,在发出请求后,只需关心请求成功时执行相应的业务逻辑并返还结果即可。
4、跨平台:
缺点:
1、只支持单核CPU:
CPU的利用不够充分。
2、可靠性低:
由于是单进程、单线程的,一旦代码某个环节崩溃,整个系统都崩溃。可以通过Nnigx反向代理,负载均衡,开多个进程,绑定多个端口来解决该问题。
3、Debug困难:
错误没有stack trace,查找不是很方便。
常用场景:
1、RESTful API:
由于本身没有太多的逻辑,只需要请求API,组织数据进行返回即可,可以处理庞大并且高吞吐量的并发连接。
2、统一Web应用的UI层:
面向服务的架构,更好的做前后端的依赖分离。
3、大量Ajax请求的应用:
NodeJS能响应大量的并发请求。