零、什么是Node.js?

引用Node.js官方网站的解释如下:

Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient.

翻译成中文就是:

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境
Node.js 使用了一个事件驱动非阻塞式 I/O 的模型,使其轻量又高效。

1、 运行环境(Runtime)

如果做一个类比,Node.js与JavaScript关系,就像JDK(Java Development Kit)与Java的关系。
总的来说,Node.js不是一门语言,而是用来进行Web开发的Runtime。

2、事件驱动(Event-driven)

在前端web开发中比较常见的事件驱动例子是,给一个按钮绑定一个事件处理程序,这个事件处理程序就是事件驱动的,JavaScript进程并不知道什么时候调用它,点击按钮,触发Click事件,此时主程序得到相应的通知,就知道调用绑定的的事件处理程序了。
因为Node.js是JavaScript的Runtime,所以天然就可以使用这种模式通知主进程的I/O 完成。

3、非阻塞式 I/O(Non-blocking I/O)

阻塞:I/O 时进程休眠等待 I/O 完成后进行下一步
非阻塞:I/O 时函数立即返回,进程不等待I/O 完成

一、Node.js 究竟好在哪里?

1、为什么偏爱Node.js

① 前端需求变得重要、职责范围变大,统一开发体验
② 在处理高并发、I/O 密集型场景性能优势明显

Node.js 使用了事件驱动和非阻塞的 I/O 模型,使 Node 轻量高效,非常适合 I/O 密集的 Web 场景。

CPU密集型 VS I/O密集型
CPU密集型:计算等逻辑判断的操作,如:压缩、解压、加密和解密等。
I/O 密集型:存取设备,网络设施的读取操作,如:文件的存取,http等网络操作,数据库操作等。

2、Web常见场景

① 静态资源读取
html,css,js等文件的读取
② 数据库操作
把数据存取到物理设磁盘或内存中
③ 渲染页面
读取模板文件,根据数据生成html

3、高并发应对之道

高并发,简而言之就是单位时间内访问量特别大。

对应生活中的场景,一家菜馆做菜招待顾客,老板刚开始就雇了一个厨师,做菜好吃不贵,顾客很多,顾客排好一条队,然后顾客选好菜,厨师拿到菜单开始做菜,做好菜,给顾客端上来,再招待下个顾客。

 
一个厨师应对若干顾客

客人增多,一个厨师忙不过来了,老板于是又招了2个厨师,这样顾客可以排3条队,快了很多。

 
多个厨师应对若干顾客

随着菜馆名气增大,顾客越来越多,老板本想再用之前的方法多招几个厨师,但是老板想,多招厨师好像不太划算,有些厨师做饭快,有些做饭慢,经过调查,老板发现做饭快2倍的厨师只需要花费原来厨师工资的1.5倍,于是精明的老板炒掉了原来的3个厨师,招来了比原来厨师做饭速度快2倍的另外3个厨师,菜馆比之前运转的更好了。

 
多个速度快的厨师应对若干顾客

回到Web开发场景,厨师就是物理服务器,应对高并发的方法如下:① 增加机器数
机器多了,流量还是一样的大,通过Nginx负载均衡分到不同的机器上处理
② 增加每台机器的CPU数——多核
单位机器,核数增多,运算能力增强了

4、进程与线程

进程在百度百科中的解释如下:

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

换成正常的人话就是:电脑桌面的程序,如QQ音乐,当我们双击图标时,实际上是把这个程序加载到内存中执行,我们称这个执行中的程序就是进程,操作系统都是用进程作为基本单位进行分配和调度的。

多进程:启动多个进程,多个进程可以一块执行多个任务。

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

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

5、Node.js工作模型

传统的server处理请求(如多线程高并发模式的Apache)对应生活中的场景,如下:
一个老板开了一家饭店,不同于之前那个菜馆,这家的每个厨师配备了一个服务员,专门负责点菜,然后把菜单给厨师,厨师负责做菜,做完后给服务员,服务员端给客人,然后再接待顾客队伍中的下一个。

如果这个饭店是Web的话,点菜这个动作很快,相当于CPU的运算,如访问一个静态资源,CPU运算后知道是哪个文件了,去相应盘读取,类似于厨师做饭,是一个相对较慢的阻塞I/O操作,当顾客很多时候就相当于高并发了。忙不过来的时候,可以选择增加厨师数量和服务员数量,即并发多进程处理多个请求的概念。

 
一个服务员每次只接待一个顾客

但是这个饭店老板慢慢发现,增加服务员和厨师的同时,饭店的空间是有限的,慢慢的变得拥挤(阻塞),而且更为头疼的是另一个问题:服务员太悠闲了,2分钟就把点菜的事干完了,厨师做菜10分钟,那他就有8分钟在那干等着,没事干,因为厨师没把菜做完给他,他也不能接待下一个顾客。

同样类似于Apache开发web时候,CPU分配的最大进程数是有限的,并不能没完没了的分配进程的,并发到一定数目的时候,必须得排队(阻塞)了,更大的问题是,CPU处理的速度远远快于I/O,在Web场景中,CPU运用场景很少,大头都在I/O上,CPU大部分进程情况下都是在等待,等待I/O,CPU的资源被浪费掉了,相当于饭店的服务员一直干等着没事干。

Node.js很好的解决了上面的问题

最新文章

  1. putty无密码登陆
  2. javascript之一切皆为对象3
  3. 博客引索 - imsoft.cnblogs
  4. bug_ _Popwindow被魅族手机自带虚拟键挡住完美解决
  5. ANDROID_MARS学习笔记_S02_002_Date\TimePicker
  6. Linux kernel ‘lbs_debugfs_write’函数数字错误漏洞
  7. UTL_RAW
  8. 【Linux】ssh免密登录
  9. 今天给大家补充一下 background 用法
  10. 一个人的旅行(hdu2066)Dijkstra算法模版
  11. clientHeight ,offsetHeight,style.height,scrollHeight有区别与联系
  12. IP的准确性
  13. 火星坐标、百度坐标、WGS84坐标转换代码(JS、python版)
  14. Auty 2017——WebMonitor接口线上检测平台
  15. Linux wget 命令下载文件
  16. LNMP ftp 可以登录无权限操作?
  17. Windows Installer (MSI)知识学习
  18. CSS3制作3D水晶糖果按钮
  19. JavaWeb之JSP原理
  20. 简单 JS 弹出层 背景变暗

热门文章

  1. conda查找安装包的版本以及安装特定版本的包
  2. three.js之让物体动起来方式(二)移动物体
  3. 5.Nginx的session一致性(共享)问题配置方案1
  4. HNOI 世界树 虚树
  5. BZOJ 1003 最短路dp
  6. 怎么卸载hexo
  7. 解决tomcat控制台乱码+清除过期缓存条目后可用空间仍不足 - 请考虑增加缓存的最大空间问题
  8. python 文件操作的相对路径和绝对路径(windows)
  9. C语言1-2019秋第一周作业
  10. Linux下mount存储盘遇到的错误