NodeJs好在哪?

1. Node.js是什么?

首先,我们看一下官网对于Node.js的介绍:

Node.js is a JavaScript runtime built on Chrome's V8

Node.js是一个构建在ChromeV8引擎上的Javascript的运行时,nodejs并不是一门语言,JavaScript才是一门语言,而nodejs是让JavaScript在服务器端跑起来的一个runtime,nodejs并不能使用JavaScript的全集(BOM和DOM)

2. Node.js的两个特性(事件驱动和非阻塞式I/O模型)

Node.js uses an event-driven,non-blocking I/O model

2.1 非阻塞I/O模型(non-blocking I/O model)

I/O: 就是 input/output 的缩写,也就是 输入/输出 的意思

对于计算机来说读写磁盘一次I/O操作,想要理解非阻塞I/O,我们先来了解一下什么是阻塞I/O

阻塞: I/O时进程休眠等待I/O完成后进行下一步,

简单来说,我们计算机的程序是逐条顺序执行的,第一句执行完之后才会执行第二句直到程序结束,那么当某条指令是要求计算机进行I/O操作的时候,程序会调用操作系统更底层的命令来进行I/O操作,期间程序就会等待底层命令返回结果,拿到结果之后才能执行下一条指令。我们就把等待底层命令的这种行为成为阻塞

非阻塞: I/O时函数立即返回,进程不等待I/O完成

当我们理解了阻塞和I/O之后,那么顾名思义,非阻塞I/O就是当程序执行到I/O指令时(调用操作系统底层的I/O),主程序不需要等待I/O返回的结果,直接执行下一条指令,这种行为称为非阻塞

I/O结束后通知主程序,也就是我们接下来要说的事件驱动

2.2 事件驱动(event-driven)

事件驱动很常见,比如我们经常在页面上放一个按钮,然后给他绑定click事件,这个事件处理程序就是事件驱动的,JavaScript的进程并不知道什么时候调用,当用户点击按钮的时候触发了click事件,这时候主程序得到通知,去调用相应的事件处理程序

  • I/O等异步操作结束后的通知

  • 观察者模式

3 NodeJS的优势

  • 前端职责范围变大,统一开发体验

  • 在处理高并发、I/O密集场景性能优势明显

3.1 CPU密集 VS I/O密集

什么是I/O密集场景呢?我们来对比一下CPU密集场景

  • CPU密集: 压缩、解压、加密、解密
  • I/O密集: 文件操作、网络操作、数据库

3.2 web常见场景

  • 静态资源读取
  • 数据库操作
  • 渲染页面

3.3 高并发应对之道

什么是高并发呢?在单位时间内访问量特别大就是高并发。

我们举一个生活中常见的例子,比如说老王开了一个饭店,雇了个厨师小A,来了客人之后小A就去接待,选好菜之后小A去后厨做,做完之后交给客户享用,但是客人一多,就会有客人等待,这样客人就很不爽,

老王一分析,这个简单,再雇两个厨师小B和小C,这样三个厨师,客人可以排三条队,这样问题就初步解决了。

接着饭店名气越来越大,客人越来越多,这时老王就想了,再多雇几个厨师?但是好像不太划算,老王想到一个好办法,他炒掉了之前的厨师,雇了几个做饭快的厨师,每个厨师做饭快了4倍,但是只需要支付1.5倍的工资就可以了。

对应到我们web开发场景,大厨就是物理服务器,开始应对高并发大家想到的最直接的方法就是增加机器数,机器多了,流量还是一样的大,我们就可以通过负载均衡让他到不同的机器上去处理,这样同时响应的web请求的数量就变多了,但是加到一定地步,我们会发现这并不划算,于是我们开始使用更好的机器(多核)

总结一下如何应对高并发就是

  • 增加机器数
  • 增加每台机器的cpu数--多核

上面这些是简单粗暴的方法,使用java、node并没有什么区别,不能体现出nodejs的优势,而nodejs性能好,主要是在单个的cpu,也就是单台机器的时候,在处理web请求的方式和java是迥异的。为了方便理解后面的内容,我们先来了解几个概念

3.4 进程和多进程

进程: 是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位

这个定义很难理解,但是不要慌,我们还是举个栗子

我们可以用电脑来听音乐、上网,那么对应的音乐播放器和浏览器就是一个程序,当我们双击桌面图标让它运行的时候,实际上就是把这个程序加载到了内存中执行,这个执行中(进行中)的程序叫做进程。

那么我们知道,单核cpu也是可以一边听音乐一边上网的,这是为什么呢?按照上面所说,程序在内存中是一句句执行的,这是两个程序啊,它俩是不可能同时进行的呀。

实际上,它俩也不是同时进行的,计算机用了一个很巧妙的做法,跟我们拍动画片非常像,在一秒播24帧,虽然是一帧一帧的,但在人的肉眼看就是动画了,cpu也是这么做的,两个程序,在非常短的时间切换,0.1纳秒执行音乐播放器,0.1纳秒执行浏览器,对于人来说就识别不出来,认为听得音乐都是连续的,这个就叫做多进程

多进程: 启动多个进程,多个进程可以一块执行多个任务(不是同时执行)

3.5 线程和多线程

线程: 进程内一个相对独立、可调度的执行单元,与同属一个进程的线程共享进程的资源

多线程:启动一个进程,在一个进程内启动多个线程,这样多个线程也可以一块执行多个任务

3.6 NodeJs的单线程

  • 单线程只是针对主进程,I/O操作是系统底层多线程调度
  • 单线程并不是单进程

3.7 NodeJs常用场景

  • Web Server
  • 本地代码构建

随着JSX、ES6还有前端各种各样的模块化,sass、less、postcss等的出现,前端代码变得异常复杂,我们前端直接书写的代码在浏览器上是没法直接工作的,需要进行一些本地的转化工作我们管这个转化工作叫做编译构建。相关的工具webpack、gulp、babel等工具也应运而生,这些都是nodejs写的。

  • 实用工具开发

所以我们讲NodeJs高性能是有非常多前提的,最大的前提就是web场景,高并发和I/O密集。

转载于:https://juejin.im/post/5d0068df6fb9a07f0a2dd845

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值