Node.js的初步探索

发表时间: 2017-05-04 00:02

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、跨平台:

基于libuv实现的跨平台

缺点:

1、只支持单核CPU:

CPU的利用不够充分。

2、可靠性低:

由于是单进程、单线程的,一旦代码某个环节崩溃,整个系统都崩溃。可以通过Nnigx反向代理,负载均衡,开多个进程,绑定多个端口来解决该问题。

3、Debug困难:

错误没有stack trace,查找不是很方便。

常用场景:

1、RESTful API:

由于本身没有太多的逻辑,只需要请求API,组织数据进行返回即可,可以处理庞大并且高吞吐量的并发连接。

2、统一Web应用的UI层:

面向服务的架构,更好的做前后端的依赖分离。

3、大量Ajax请求的应用:

NodeJS能响应大量的并发请求。