`
longzhun
  • 浏览: 371540 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

nodejs优缺点及适用场景讨论

 
阅读更多

概述:

 

  NodeJS宣称其目标是“旨在提供一种简单的构建可伸缩网络程序的方法”,那么它的出现是为了解决什么问题呢,它有什么优缺点以及它适用于什么场景呢?

  本文就个人使用经验对这些问题进行探讨。

 

一. NodeJS的特点

 

  我们先来看看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.

 

  其特点为:

  1. 它是一个Javascript运行环境

  2. 依赖于Chrome V8引擎进行代码解释

  3. 事件驱动

  4. 非阻塞I/O

  5. 轻量、可伸缩,适于实时数据交互应用

  6. 单进程,单线程

 

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

 

  它的出现确实能为我们解决现实当中系统瓶颈提供了新的思路和方案,下面我们看看它能解决什么问题

 

  1. 并发连接

 

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

 

  (1)系统线程模型:

  

 

  这种模型的问题显而易见,服务端只有一个线程,并发请求(用户)到达只能处理一个,其余的要先等待,这就是阻塞,正在享受服务的请求阻塞后面的请求了

 

  (2)多线程、线程池模型:

  

 

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

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

 

  

 

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

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

 

  那么NodeJS是怎么解决这个问题的呢?

  我们来看另外一个模型,想象一下我们在快餐店点餐吃饭的场景

 

  (3)异步、事件驱动模型

  

 

  我们同样是要发起请求,等待服务器端响应;但是与银行例子不同的是,这次我们点完餐后拿到了一个号码,

  拿到号码,我们往往会在位置上等待,而在我们后面的请求会继续得到处理,同样是拿了一个号码然后到一旁等待,接待员能一直进行处理。

  等到饭菜做号了,会喊号码,我们拿到了自己的饭菜,进行后续的处理(吃饭)

  这个喊号码的动作在NodeJS中叫做回调(Callback),能在事件(烧菜,I/O)处理完成后继续执行后面的逻辑(吃饭),

  这体现了NodeJS的显著特点,异步机制、事件驱动

  整个过程没有阻塞新用户的连接(点餐),也不需要维护已经点餐的用户与厨师的连接

 

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

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

  

  总结一下NodeJS是怎么解决并发连接这个问题的:

  更改连接到服务器的方式,每个连接发射(emit)一个在NodeJS引擎进程中运行的事件(Event),放进事件队列当中,

  而不是为每个连接生成一个新的OS线程(并为其分配一些配套内存)

 

  2. I/O阻塞

 

  NodeJS解决的另外一个问题是I/O阻塞,看看这样的业务场景:需要从多个数据源拉取数据,然后进行处理

 

  (1)串行获取数据,这是我们一般的解决方案,以PHP为例

  

 

  假如获取profile和timeline操作各需要1S,那么串行获取就需要2S

 

  (2)NodeJS非阻塞I/O,发射/监听事件来控制执行过程

  

 

  NodeJS遇到I/O事件会创建一个线程去执行,然后主线程会继续往下执行的,

  因此,拿profile的动作触发一个I/O事件,马上就会执行拿timeline的动作,

  两个动作并行执行,假如各需要1S,那么总的时间也就是1S

  它们的I/O操作执行完成后,发射一个事件,profile和timeline,

  事件代理接收后继续往下执行后面的逻辑,这就是NodeJS非阻塞I/O的特点

 

  总结一下:

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

 

 

三. NodeJS的优缺点

 

  优点:

  1. 高并发(最重要的优点)

  2. 适合I/O密集型应用

 

    缺点:

  1. 不适合CPU密集型应用;CPU密集型应用给Node带来的挑战主要是:由于JavaScript单线程的原因,如果有长时间运行的计算(比如大循环),将会导致CPU时间片不能释放,使得后续I/O无法发起;

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

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

  3. 可靠性低,一旦代码某个环节崩溃,整个系统都崩溃

    原因:单进程,单线程

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

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

  4. 开源组件库质量参差不齐,更新快,向下不兼容

  5. Debug不方便,错误没有stack trace

 

 

四. 适合NodeJS的场景

 

  1. RESTful API

 

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

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

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

 

  2. 统一Web应用的UI层

 

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

  

 

  不讨论这种架构是好是坏,但是有另外一种实践,面向服务的架构,更好的做前后端的依赖分离。

  如果所有的关键业务逻辑都封装成REST调用,就意味着在上层只需要考虑如何用这些REST接口构建具体的应用。

  那些后端程序员们根本不操心具体数据是如何从一个页面传递到另一个页面的,他们也不用管用户数据更新是通过Ajax异步获取的还是通过刷新页面

  

 

  3. 大量Ajax请求的应用

 

  例如个性化应用,每个用户看到的页面都不一样,缓存失效,需要在页面加载的时候发起Ajax请求,

  NodeJS能响应大量的并发请求

 

  总而言之,NodeJS适合运用在高并发、I/O密集、少量业务逻辑的场景

 

 

五. 结尾

 

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

  我们考虑的点只是适不适合用它来做

 

 

六. 参考文献

 

  [1] Node.js能构建支持并发和高负载的大型应用吗?

  [2] 理解Node.js事件驱动编程

  [3] 是否不擅长CPU密集型业务

  [4] 使用 Node.js 的优势和劣势都有哪些?有大公司用吗?

  [5] Node.js给前端带来了什么

分享到:
评论

相关推荐

    nodejs安装步骤及环境配置

    nodejs安装步骤及环境配置nodejs安装步骤及环境配置nodejs安装步骤及环境配置nodejs安装步骤及环境配置nodejs安装步骤及环境配置nodejs安装步骤及环境配置nodejs安装步骤及环境配置nodejs安装步骤及环境配置nodejs...

    NodeJS安装及环境配置(windows)

    1. 访问 Node.js 官方网站 (https://nodejs.org) 下载适用于 Windows 的最新稳定版安装包。 2. 双击下载的 MSI 文件(例如:node-v6.9.2-x64.msi)启动安装向导。 3. 点击【Next】按钮,接受许可协议。 4. 勾选...

    NodeJS安装包及教程.zip

    这是一个特定版本的NodeJS安装程序,适用于64位的Windows系统。版本号"v10.15.3"表示这是NodeJS的LTS(长期支持)版本,意味着它会得到更长时间的安全更新和技术支持。安装此MSI文件时,系统会引导用户完成一系列...

    nodejs安装及环境配置介绍

    nodejs安装及环境配置。一、下载Node.js 首先,你需要在Node.js的官方网站下载对应你电脑系统(Windows、macOS、Linux等)的安装包。 二、安装Node.js 双击你下载的.msi(Windows)或.pkg(macOS)文件开始安装。 ...

    nodejs 9 低版本,适用于绝大多数的vue项目

    nodejs 9 低版本,适用于绝大多数的vue项目,分享给兄弟们,目前官方是17,各种报错

    nodejs.pdf nodejs初级教程 nodejs初级教程

    nodejs初级教程

    NodeJs 开发实战教程

    涵盖的主要内容:NodeJs的概念、应用场景、环境搭建和配置、异步编程等。多方位介绍相关场景开发实战。(2014版) 通过编写原生代码,讲解NodeJs的应用开发 适用于Nodejs初学者; javascript程序员; 想全面了解...

    nodejs14.9.0

    nodejs14.9.0

    NodeJS示例

    NodeJS 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,它允许开发者在服务器端使用 JavaScript 进行编程,极大地提升了开发效率。在 Windows 环境下配置和使用...随着技术的发展,NodeJS 的应用场景还在不断拓宽。

    NodeJS-技术讲解

    NodeJS 的优缺点: 优点: 1. 高并发(最重要的优点,据说可以应付百万级并发) 2. 适合 I/O 密集型应用 缺点: 1. 不适合 CPU 密集型应用;CPU 密集型应用给 Node 带来的挑战。 NodeJS 的应用场景: 1. ...

    nodejs:NodeJS示例项目

    节点js NodeJS示例项目

    NodeJS 安装包

    在实际开发中,NodeJS 的非阻塞 I/O 模型使得它非常适合处理大量的并发连接,例如在实时聊天应用、流媒体服务或者游戏服务器等场景下。同时,由于 JavaScript 语法在客户端和服务器端的一致性,NodeJS 也促进了前后...

    AppiumAir-nodejs安装及环境配置

    AppiumAirAppiumAndroidappiumAPP nodejs安装及环境配置 nodejs安装及环境配置 nodejs安装及环境配置 nodejs安装及环境配置 nodejs安装及环境配置

    NodeJs技术经典文档

    资源名称:NodeJs技术经典文档资源目录:【】Node.js开发指南_中文正版【】nodejs开发指南pdf及源码及win安装程序【】nodejs手册中文【】NodeJs教程【】umav4simple【】七天学会NodeJS【】七天学会NodeJS【】深入浅...

    NodeJs-v18.18.0 Linux安装包及安装脚本

    NodeJs-v18.18.0 Linux安装包及安装脚本 小白适用 一键安装

    Idea 配置前端web nodejs项目

    Idea 配置前端 Web Nodejs 项目 Idea 配置前端 Web Nodejs 项目是指在 IntelliJ IDEA 集成开发环境中配置 Nodejs 项目的步骤。下面我们将详细讲解配置的步骤和相关知识点。 Idea 配置 Nodejs 项目 首先,我们需要...

    NodeJS整理手册文档

    NodeJS是一种基于Chrome V8引擎的JavaScript运行环境,它允许开发者在服务器端使用JavaScript进行编程,从而打破了JavaScript只能在浏览器中运行的传统。本"NodeJS整理手册文档"旨在为对NodeJS感兴趣的朋友们提供一...

    Node.js安装及环境配置详细教程_nodejs安装及环境配置-CSDN博客.mhtml

    Node.js安装及环境配置详细教程_nodejs安装及环境配置-CSDN博客.mhtml

    NodeJS学习笔记和代码

    NodeJS是一种基于Chrome V8引擎的JavaScript运行环境,它允许开发者在服务器端使用JavaScript进行编程。这个"NodeJS学习笔记和代码"的压缩包显然包含了帮助初学者掌握NodeJS基础知识和实践技能的所有必要资料。 ...

    nodejs安装及环境配置

    nodejs安装及环境配置

Global site tag (gtag.js) - Google Analytics