2019独角兽企业重金招聘Python工程师标准>>>

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

一. 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线程(并为其分配一些配套内存)。

其实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能实现几乎一切的应用,我们考虑的点只是适不适合用它来做。


转载于:https://my.oschina.net/u/2429470/blog/492007

NodeJS优缺点及适用场景讨论相关推荐

  1. [NodeJS] 优缺点及适用场景讨论 - 鱼松

    原文:http://www.cnblogs.com/sysuys/p/3460614.html 概述: NodeJS宣称其目标是" 旨在提供一种简单的构建可伸缩网络程序的方法 ", ...

  2. pcie ep 应该支持哪种interrupt_双盘位NAS支持PCI扩展可以做什么?QNAP QM2-2S10G1T应用场景讨论...

    之前上手了QNAP的TS-251D这款NAS,这是一款支持PCIe扩展的NAS产品.之前上手不过不少不同的NAS产品,但是支持PCIe扩展的NAS产品,我还是第一次上手,对于PCIe扩展可以带来怎么样 ...

  3. 单例设计模式 优缺点 及 使用场景

    文章转自:http://www.tools138.com/create/article/20150929/020009847.html :http://www.cnblogs.com/damsoft/ ...

  4. 单利模式的优缺点和使用场景

    文章转自:http://www.tools138.com/create/article/20150929/020009847.html 单利模式的优缺点和使用场景 首先介绍一下单例模式:      单 ...

  5. Qt框架与STL库之间的巅峰对决:差异、优缺点及适用场景

    Qt框架与STL库之间的巅峰对决:差异.优缺点及适用场景 引言 对比的重要性 Qt框架与STL库简介 博客内容概览 Qt框架基础 Qt框架的特点与组成 Qt的信号槽机制 Qt容器类简介 数据结构的对比 ...

  6. 时分多路复用TDM与时分多址TDMA对比 优缺点以及应用场景

    本文主要介绍了TDM和TDMA技术的对比,优缺点以及应用场景 TDM与TDMA对比 1.基本概念 2.功能框图 3.工作原理 4.同步与异步时分复用 5.TDMA和TDM的区别 6.主要应用 1.基本 ...

  7. 浅谈 ext2 文件系统的特点、优缺点以及使用场景

    ext2(Extended File System 2)是 Linux 中最早的一种文件系统,它是 Linux 文件系统的基础,也被广泛用于其他类 Unix 系统中.下面是 ext2 文件系统的特点. ...

  8. ext4 文件系统的特点、优缺点以及使用场景

    ext4(Fourth Extended File System)是 Linux 中最新的一种文件系统,它是 ext3 文件系统的后续版本,具有更高的性能.可靠性和扩展性.下面是 ext4 文件系统的 ...

  9. 机器学习算法原理:详细介绍各种机器学习算法的原理、优缺点和适用场景

    目录 引言 二.线性回归 三.逻辑回归 四.支持向量机 五.决策树 六.随机森林 七.K-均值聚类 八.主成分分析(PCA) 九.K近邻算法 十.朴素贝叶斯分类器 十一.神经网络 十二.AdaBoos ...

最新文章

  1. Annotation
  2. Fiddler 发送post 请求失败
  3. php引入类的位置,php如何在一个类中引入另外一个类
  4. 模型优化:BatchNorm合并到卷积中
  5. 机器翻译 - 日期翻译
  6. 查找-------(HashCode)哈希表的原理
  7. Day 12:枚举值、枚举类
  8. 【笔记】Yale博弈论第一课
  9. 怎样用python录音_python实现录音功能(可随时停止录音)
  10. html注册登录模板
  11. web端常用手机号,邮箱,税号,组织机构代码,银行卡号等JS正则校验表达式总结
  12. 排序算法——选择排序
  13. 2023银行校园招聘简历自我评价高分写法模板
  14. 字节跳动校招提前批前端一面总结
  15. XCTF-PWN pwn-200(使用DynELF利用write泄露system地址)
  16. 小学二年级计算机考试,人教版二年级语文下学期期中考试试卷
  17. Android NDK thread 回收crash, signal 4 (SIGILL), code 1 (ILL_ILLOPC) , fault addr 地址
  18. 07年中国企业500强名单
  19. 【备忘】IE开发人员工具修复
  20. 缓解论文写作压力的小妙招

热门文章

  1. DateTime时间格式转换为Unix时间戳格式
  2. C# .net 命名规范
  3. mysql索引详解_MySQL索引详解
  4. Kali Linux常用服务配置教程获取IP地址
  5. Visual Studio提示Bonjour backend初始化失败
  6. 检验Xcode是否被改动过的简单方法,不妨试试!!!
  7. grub rescue 安装linux,Ubuntu重装启动失败进入修复grub rescue模式
  8. dynamo方程怎么写_根据以下说明,画出因果关系图,建立流图模型,并拟定变量名称和适当数据,写出对应的...
  9. ipv6简写还原_用什么进制表示ipv6
  10. spring data jpa从入门到精通_Spring Data JPA的简单入门