Nodejs 优缺点适用场景1

一. Nodejs 的特点

Node.js is a platform built on Chrome's JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices.

  • 一个JavaScript运行环境
  • 依赖于Chrome V8引擎进行代码解释
  • 事件驱动
  • 非阻塞I/O
  • 轻量、和伸缩,适用于实时数据交互使用
  • 单进程,单线程

二. NodeJS带来的对系统瓶颈的解决方案

1. 并发连接

举个例子,想象一个场景,我们在银行排队办理业务,我们看看下面两个模型

我们在银行排队办理业务

(1)系统线程模型:

这种模型的问题显而易见,服务端只有一个线程,并发请求(用户)到达只能处理一个。

 

其余的要先等待,这就是阻塞,正在享受服务的请求阻塞后面的请求了

2. 多线程、线程池模型

这个模型已经比上一个有所进步,它调节服务端线程的数量来提高对并发请求的接收和响应,但并发量高的时候,请求仍然需要等待,它有个更严重的问题:

  回到代码层面上来讲,我们看看客户端请求与服务端通讯的过程:

服务端与客户端每建立一个连接,都要为这个连接分配一套配套的资源,主要体现为系统内存资源,以PHP为例,维护一个连接可能需要20M的内存

  这就是为什么一般并发量一大,就需要多开服务器

nodejs 怎么解决?

想象一下我们在快餐店吃饭

3. 异步、事件驱动模型

  1.  这个喊号码的动作在NodeJS中叫做回调(Callback),能在事件(烧菜,I/O)处理完成后继续执行后面的逻辑(吃饭),这体现了NodeJS的显著特点,异步机制、事件驱动
  2. 整个过程没有阻塞新用户的连接(点餐),也不需要维护已经点餐的用户与厨师的连接

基于这样的机制,理论上陆续有用户请求连接,NodeJS都可以进行响应,因此NodeJS能支持比Java、PHP程序更高的并发量

维护事件队列也需要成本,再由于NodeJS是单线程,事件队列越长,得到响应的时间就越长,并发量上去还是会力不从心

总结下怎么处理并发

更改连接到服务器的方式,每个连接发射(emit)一个在NodeJS引擎进程中运行的事件(Event),放进事件队列当中,而不是为每个连接生成一个新的OS线程(并为其分配一些配套内存)

2. I/O阻塞

比如,需从多个数据源拉去数据

然后进行处理

解决方案?

1.PHP世上最好的语言?

// get the profile
$profile = $userProfile->getProfile($_userid);

// get the timeline
$timeline = $userTimelineModel->getTimeline($_userid);

// Todo
// ...
echo $return;

假如获取profile和timeline操作各需要1S

那么串行获取就需要2S

2. Nodejs非阻塞I/O,事件驱动

var proxy = new EventProxy();

proxy.all('profile', 'timeline', function (profile, timeline) {
    // todo
});

api.getUser('username', function (profile) {
    proxy.emit('profile', profile);
});

api.getTimeline('username', function (timeline) {
    proxy.emit('timeline', timeline);
})

两个动作并行执行,假如各需要1S

那么总的时间也就是1S

总结下

  Java、PHP也有办法实现并行请求(子线程),但NodeJS通过回调函数(Callback)和异步机制会做得很自然

 

三. NodeJS优缺点

优点

  • 高并发(最重要的优点)
  • 适合I/O密集型应用

缺点

1. 不适合CPU密集型应用

解决方案:分解大型运算任务为多个小任务,使得运算能够适时释放,不阻塞I/O调用的发起;

2. 可靠性不够高

一旦代码某个环节崩溃,整个系统都崩溃

解决方案:

(1)Nnigx反向代理,负载均衡,开多个进程,绑定多个端口;

(2)开多个进程监听同一个端口,使用cluster模块;

3. 支持单核CPU,不能充分利用CPU

四. NodeJS适用场景

1. RESTful API

这是NodeJS最理想的应用场景,可以处理数万条连接,本身没有太多的逻辑,只需要请求API,组织数据进行返回即可。

  它本质上只是从某个数据库中查找一些值并将它们组成一个响应。

  由于响应是少量文本,入站请求也是少量的文本,因此流量不高,一台机器甚至也可以处理最繁忙的公司的API需求。

2. 统一Web应用UI层

目前MVC的架构,在某种意义上来说,Web开发有两个UI层,一个是在浏览器里面我们最终看到的,另一个在server端,负责生成和拼接页面。

面向服务的架构

更好的做前后端的依赖分离

3. 大量Ajax请求的应用

总结

高并发、

I/O密集、

少量业务逻辑

五. 结尾

其实nodejs能实现几乎一切的应用

需要考虑是适不适合用它来做。

六. 参考文献

Made with Slides.com