node.js应用高并发高性能的核心关键是什么?

2020-11-19 10:01发布

8条回答
aijingda
2楼 · 2020-11-19 14:02

首先需要了解几个基本常识

  1. CPU 运算远远快于 I/O 操作

  2. Web 是典型的 I/O 密集场景

  3. JavaScript 是单线程、但 JavaScript 的 runtime NodeJS 并不是,毕竟人家很多代码是 C++

很多语言是依赖的多进程、线程解决高并发,一个线程处理一条用户请求,处理完成了释放线程,在阻塞 I/O 模型下, I/O 期间该用户线程所占用的 CPU 资源(虽然十分微量,大部分交给了 DMA)什么都不做,等待 I/O,然后响应用户,而且开启多个进程/线程 CPU 切换 Context 的时间也十分可观。

就像饭店的服务员只负责点菜,如果给每个厨师都配一个服务员,服务员把客人菜单给大厨后就玩手机等着一样,你是老板你也生气,况且不同于饭店大厨工资高于服务员,在计算机世界,CPU 资源比 I/O 宝贵的多。

说 NodeJS 在高并发、I/O 密集场景性能高,也就是 Web 场景性能高主要也是解决这个问题,没必要一个厨师配一个服务员,整个饭店说不定一个服务员就够了,剩下的钱可以随便做其它事情。

用户请求来了, CPU 的部分做完不用等待 I/O,交给底层完成,然后可以接着处理下一个请求了,快就快在

  1. 非阻塞 I/O

  2. Web 场景 I/O 密集

  3. 没那么多线程 Context 切换,多出来的开销是检查一个 EventLoop

其它场景 NodeJS 性能确实不高,甚至非常底下,其实看看 Apache 都江山稳固了,为什么 Nginx 还能异军突起就很容易理解 NodeJS优势,原理实在太像了。

Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎,V8引擎执行Javascript的速度非常快,性能非常好。
异步发送IO操作请求后,你可以去做别的事,IO返回后会自动做下一步的,而且你可以同时发起多个IO然后一起汇总。所以只用单线程就可以了,每一步的操作可以用整体更少的资源满足要求,从而大大提高性能。

小猪仔
4楼 · 2020-11-20 09:46

高并发的请求处理能力,解决的是请求的问题。

海量数据的分布、组织和处理形式,又事关能否快速响应的问题。

如果涉及海量数据,八成还牵扯到容灾,那事情就不简单了,什么单点故障RAID复制备份各种各样的因素都穿插其中。

何大侠
5楼 · 2020-11-20 10:08

首先题主说的这个情况我完全不相信,虽然我们也是NodeJS团队,但是我们从来不会跟ruby或者java去吹我们NodeJS性能多好。有意义么?Web开发的瓶颈根本不是你应用本身的性能啊,而且Nodejs的性能哪里好了。。。一个成熟的web应用,大部分性能瓶颈是在IO操作上,这个io包括 数据库操作(连接数,机器性能等)、缓存服务、网络IO、文件读写等操作。如果IO生产方的性能瓶颈了,你再分布式,再堆机器,再牛逼的语言都没啥卵用。

NodeJS的天然异步IO的确可以快速写出异步高效读取io的代码,不过就跟你去食堂吃饭一样,其实有时候100个人一拥而上打饭和100个人排着队打饭,并不是一定是一拥而上效率高。对于Nodejs线上服务,很常见的性能瓶颈就是因为他太屌了,能够一下子承接1W个异步请求,然后。。。。它挂了,他的异步机制导致应用被挂起,内存狂飙,IO堵塞,而且不可恢复,这个时候你只能重启了。而ruby,java他们正在有序的处理请求,他们处理不了的请求都在排队等着呢,虽然慢点,但是不会挂额。

而且,谁说其他语言没有异步机制呢?ruby,java,都有解决异步问题的框架方案。


对于我们团队,其实使用NodeJS的理由,反而提现在其他方面:
1. 生态活跃,解决方案众多,我们的Node服务化,架构,协作方式都很先进,因为社区活跃,有很多思路可以借鉴,架构变得越来越优,开发方式也变得越来越趋向社区规范。反观java,一直在玩老掉牙的架构,每天就是在搞环境问题,大部分开发完全不知道内部原理,而且没有什么大的技术追求。
2. 轻量,部署轻量,开发轻量。我们可以用最小的阿里云配置就部署出一个小应用来,用来做微服务化架构非常完美。想想把一个java系统拆分成十几个微服务(java)的场景,每个进程启动起来都要1G内存吧至少,high起来吧阿里云。
3. 我们公司技术栈采用多语言,多一个语言就多一种可能性,例如一些用node实现特别适合的服务,Phantomjs类的服务(图片,模拟操作等),WebSocket啊之类的。

HARPPRTのIT
6楼 · 2020-11-20 16:12

NodeJS的天然异步IO的确可以快速写出异步高效读取io的代码,不过就跟你去食堂吃饭一样,其实有时候100个人一拥而上打饭和100个人排着队打饭,并不是一定是一拥而上效率高。对于Nodejs线上服务,很常见的性能瓶颈就是因为他太屌了,能够一下子承接1W个异步请求,然后。。。。它挂了,他的异步机制导致应用被挂起,内存狂飙,IO堵塞,而且不可恢复,这个时候你只能重启了。而ruby,java他们正在有序的处理请求,他们处理不了的请求都在排队等着呢,虽然慢点,但是不会挂额。


@CcCc
7楼 · 2020-11-20 16:26

首先需要了解几个基本常识

  1. CPU 运算远远快于 I/O 操作

  2. Web 是典型的 I/O 密集场景

  3. JavaScript 是单线程、但 JavaScript 的 runtime NodeJS 并不是,毕竟人家很多代码是 C++

很多语言是依赖的多进程、线程解决高并发,一个线程处理一条用户请求,处理完成了释放线程,在阻塞 I/O 模型下, I/O 期间该用户线程所占用的 CPU 资源(虽然十分微量,大部分交给了 DMA)什么都不做,等待 I/O,然后响应用户,而且开启多个进程/线程 CPU 切换 Context 的时间也十分可观。

就像饭店的服务员只负责点菜,如果给每个厨师都配一个服务员,服务员把客人菜单给大厨后就玩手机等着一样,你是老板你也生气,况且不同于饭店大厨工资高于服务员,在计算机世界,CPU 资源比 I/O 宝贵的多。

说 NodeJS 在高并发、I/O 密集场景性能高,也就是 Web 场景性能高主要也是解决这个问题,没必要一个厨师配一个服务员,整个饭店说不定一个服务员就够了,剩下的钱可以随便做其它事情。

用户请求来了, CPU 的部分做完不用等待 I/O,交给底层完成,然后可以接着处理下一个请求了,快就快在

  1. 非阻塞 I/O

  2. Web 场景 I/O 密集

  3. 没那么多线程 Context 切换,多出来的开销是检查一个 EventLoop

其它场景 NodeJS 性能确实不高,甚至非常底下,其实看看 Apache 都江山稳固了,为什么 Nginx 还能异军突起就很容易理解 NodeJS优势,原理实在太像了。

 0人赞  添加讨论(0)

 

雨陵西 - 每一代青年都有自己的际遇和机缘

3楼-- · 22小时前

Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎,V8引擎执行Javascript的速度非常快,性能非常好。
异步发送IO操作请求后,你可以去做别的事,IO返回后会自动做下一步的,而且你可以同时发起多个IO然后一起汇总。所以只用单线程就可以了,每一步的操作可以用整体更少的资源满足要求,从而大大提高性能。

 0人赞  添加讨论(0)

 

小猪仔

4楼-- · 6小时前

高并发的请求处理能力,解决的是请求的问题。

海量数据的分布、组织和处理形式,又事关能否快速响应的问题。

如果涉及海量数据,八成还牵扯到容灾,那事情就不简单了,什么单点故障RAID复制备份各种各样的因素都穿插其中。

 0人赞  添加讨论(0)

 

何大侠

5楼-- · 6小时前

首先题主说的这个情况我完全不相信,虽然我们也是NodeJS团队,但是我们从来不会跟ruby或者java去吹我们NodeJS性能多好。有意义么?Web开发的瓶颈根本不是你应用本身的性能啊,而且Nodejs的性能哪里好了。。。一个成熟的web应用,大部分性能瓶颈是在IO操作上,这个io包括 数据库操作(连接数,机器性能等)、缓存服务、网络IO、文件读写等操作。如果IO生产方的性能瓶颈了,你再分布式,再堆机器,再牛逼的语言都没啥卵用。

NodeJS的天然异步IO的确可以快速写出异步高效读取io的代码,不过就跟你去食堂吃饭一样,其实有时候100个人一拥而上打饭和100个人排着队打饭,并不是一定是一拥而上效率高。对于Nodejs线上服务,很常见的性能瓶颈就是因为他太屌了,能够一下子承接1W个异步请求,然后。。。。它挂了,他的异步机制导致应用被挂起,内存狂飙,IO堵塞,而且不可恢复,这个时候你只能重启了。而ruby,java他们正在有序的处理请求,他们处理不了的请求都在排队等着呢,虽然慢点,但是不会挂额。

而且,谁说其他语言没有异步机制呢?ruby,java,都有解决异步问题的框架方案。


对于我们团队,其实使用NodeJS的理由,反而提现在其他方面:
1. 生态活跃,解决方案众多,我们的Node服务化,架构,协作方式都很先进,因为社区活跃,有很多思路可以借鉴,架构变得越来越优,开发方式也变得越来越趋向社区规范。反观java,一直在玩老掉牙的架构,每天就是在搞环境问题,大部分开发完全不知道内部原理,而且没有什么大的技术追求。
2. 轻量,部署轻量,开发轻量。我们可以用最小的阿里云配置就部署出一个小应用来,用来做微服务化架构非常完美。想想把一个java系统拆分成十几个微服务(java)的场景,每个进程启动起来都要1G内存吧至少,high起来吧阿里云。
3. 我们公司技术栈采用多语言,多一个语言就多一种可能性,例如一些用node实现特别适合的服务,Phantomjs类的服务(图片,模拟操作等),WebSocket啊之类的。

 0人赞  添加讨论(0)

 

HARPPRTのIT

6楼-- · 13分钟前

NodeJS的天然异步IO的确可以快速写出异步高效读取io的代码,不过就跟你去食堂吃饭一样,其实有时候100个人一拥而上打饭和100个人排着队打饭,并不是一定是一拥而上效率高。对于Nodejs线上服务,很常见的性能瓶颈就是因为他太屌了,能够一下子承接1W个异步请求,然后。。。。它挂了,他的异步机制导致应用被挂起,内存狂飙,IO堵塞,而且不可恢复,这个时候你只能重启了。而ruby,java他们正在有序的处理请求,他们处理不了的请求都在排队等着呢,虽然慢点,但是不会挂额。


爱煲汤的小王
8楼 · 2020-11-20 17:14

高并发的请求处理能力,解决的是请求的问题。

海量数据的分布、组织和处理形式,又事关能否快速响应的问题。


无奈的飘过
9楼 · 2020-11-23 10:35

首先需要了解几个基本常识

  1. CPU 运算远远快于 I/O 操作

  2. Web 是典型的 I/O 密集场景

  3. JavaScript 是单线程、但 JavaScript 的 runtime NodeJS 并不是,毕竟人家很多代码是 C++

很多语言是依赖的多进程、线程解决高并发,一个线程处理一条用户请求,处理完成了释放线程,在阻塞 I/O 模型下, I/O 期间该用户线程所占用的 CPU 资源(虽然十分微量,大部分交给了 DMA)什么都不做,等待 I/O,然后响应用户,而且开启多个进程/线程 CPU 切换 Context 的时间也十分可观。

就像饭店的服务员只负责点菜,如果给每个厨师都配一个服务员,服务员把客人菜单给大厨后就玩手机等着一样,你是老板你也生气,况且不同于饭店大厨工资高于服务员,在计算机世界,CPU 资源比 I/O 宝贵的多。

说 NodeJS 在高并发、I/O 密集场景性能高,也就是 Web 场景性能高主要也是解决这个问题,没必要一个厨师配一个服务员,整个饭店说不定一个服务员就够了,剩下的钱可以随便做其它事情。

用户请求来了, CPU 的部分做完不用等待 I/O,交给底层完成,然后可以接着处理下一个请求了,快就快在

  1. 非阻塞 I/O

  2. Web 场景 I/O 密集

  3. 没那么多线程 Context 切换,多出来的开销是检查一个 EventLoop

其它场景 NodeJS 性能确实不高,甚至非常底下,其实看看 Apache 都江山稳固了,为什么 Nginx 还能异军突起就很容易理解 NodeJS优势,原理实在太像了。


相关问题推荐

  • 回答 15

    对于新入门的小伙伴来说,选择一个合适的nodejs框架可能是一件很头疼的事情,我最初也为这个头疼过,下面分享一下我的框架选择之路nodejs的框架最近来node的火热,带动了一大批的框架,例如express koa sails loopback thinkjs egg这些是我比较过的框架,下面...

  • PHP与Node.js的区别2021-01-18 10:23
    回答 19

    PHP胜出:代码与内容混合大家在输入的过程中当然希望能将自己的思路直接转化为网站的文本内容,同时还要为进程添加分支、一部分if-then语句以保证站点拥有漂亮的视觉效果,具体取决于URL中的某些参数。又或者,我们希望能够利用单一数据库将文本或者数据加以...

  • 回答 9
    已采纳

    这个问题涉及到的是整个web开发体系的变更。我尽量长话短说,有问题可以继续留言。现在的web开发体系可以说是在15年后才逐渐形成,因为15年比较特殊,html5和ES6都是在这一年发布,css3的最后一次更新在2014年。这些变更带来的变化是产生了前后分离的开发方式...

  • 回答 3

    初次接触nodejs确实有一些难度,因为思路语法都和js有了一些差别,属于后端思想,所以需要楼主多下功夫,进行系统学习之后就容易接受了

  • 回答 13

    //首先卸载已安装的node-sasscnpm uninstall node-sass//重新安装cnpm install node-sass//如果报关于gyp的错,安装相关的gyp编译环境npm install -g node-gyp//再重复执行以上的卸载安装步骤//安装完成启动项目试试npm run dev...

  • 回答 10

    node.js 和 javascript 从本质上来说没有什么区别,语言是一样的,都是javascript语言编写。但是,node.js 主要从事后台操作,javascript主要操作HTML的元素(前端)。

  • 回答 8

    Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。(事件驱动:事件触发过程中,进行决策的一种策略,简单说就是跟随当前时间点上出现的事物,调用可用的资源进行解决该事物...

  • 回答 10

    global 最根本的作用是作为全局变量的宿bai主。按照ECMAScript 的定义,满足以下条 件的变量是全局变量:在最外层定义的变量;全局对象的属性;隐式定义的变量(未定义直接赋值的变量)。当你定义一个全局变量时,这个变量同时也会成为全局对象的属性,反之亦...

  • 回答 4

        webpack构建工具是基于node平台的, 所以在安装之前必须先安装nodejs. 接在来就可以通过npm包管理工具在线安装webpack了.    对于webpack构建工具, 即可全局安装, 也可以局部安装. 一般情况下,大多数会采用局部安装, 因为每一个项目需要对webpack...

  • 回答 3

    vue-cli脚手架是基于node平台的, 所以安装之前, 必须先安装nodejs. 之后直接通过npm包管理工具即可完成vue-cli脚手架工具的安装. 目前市面上流行的vue-cli脚手架有两个版本, 接下来分别演示下:安装vue-cli-2.x版本// -g 表示全局安装 npm install vue-cli...

  • 回答 3

    1.打开node官网 https://nodejs.org/en/,选择 other Downloads,2.安装Windows Binary 64位或者32位3.将你减压后的路径保存一份,如(D:\soft\node-v10.16.3-win-x64)4.找到系统路径(控制面板-》系统-》高级系统设置-》环境变量-》path),获取到 5.找到...

  • 回答 5

    一、安装环境1、本机系统:Windows 10 Pro(64位)2、Node.js:v6.9.2LTS(64位)二、安装Node.js步骤1、下载对应你系统的Node.js版本2、选安装目录进行安装3、环境配置4、测试

  • 回答 4

    Node.js是一个基于Chrome v8引擎建立的JavaScript运行平台,用于搭建响应速度快、易于扩展的网络应用。本文和大家分享的是Node.js的一些特点,希望对大家有帮助。  异步I/O  这里,我们来详细解释一下:  异步是什么意思  比如说你的爸,今天要叫你做...

  • 回答 5

    dejs适用于I/O密集的应用,而不太适用于计算密集的应用我用 Node.js 开发了 Am I Hacked,算是有一点用 Node.js 支持大流量的经验。先列一些数字服务器是 Linode 512,也就是 Linode 上最低端的。...

没有解决我的问题,去提问