Node.js——前世今生
Posted Eric的前端那些事
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Node.js——前世今生相关的知识,希望对你有一定的参考价值。
还没有关注Eric君的小伙伴
1.1.Node.js之父
Node适合小型,实时事务型服务器网站;
GO更适合构建大型服务器网站;
1.2.Node.js出现的背景
目的:为了解决Web服务器的高并发性能问题。
图1 请求/响应示意图
我们知道,每次用户在客户端交互的时候都会发送请求,响应请求,去服务器上获取资源,服务器还可能和数据库进行I/O操作,这势必需要一点时间,当用户多的时候,网络请求延迟将会更长。
因此,我们需要缩短发送请求到响应请求的时长。
让发送请求快一点(不能控制,由客户端网速决定);
让响应快一点(可以控制,将服务器带宽提高, 通过CDN加速等,但考虑到成本,不可能无限的提高带宽);
让服务器处理请求任务快一点(优秀的程序员可以控制,小编这种菜鸟不行);
让服务器从磁盘读取/写入数据到数据库快一点(不能控制,磁盘的读取速度有上限)
为了解决高并发的问题,传统服务器都是通过“多线程”解决,即发送一个请求就开启一条线程。
1.3.V8引擎
2.1.什么是Node.js
Node.js不是一种独立的语言
php, JSP,.... 既是语言, 也是平台
Node.js用JavaScript进行编程, 运行平台是包装后的js引擎(V8)
Node.js是一种轻量级架构
java,php,.net都需要运行在服务器上,apache,tomat,naginx,IIS;
Node.js不用架设在任何服务器软件之上;
用最小的硬件成本,达到更高的并发,更优的处理性能
2.2.Node.js特点
单线程
优势:减少了内存开销(操作系统完全不再有线程创建、销毁的时间开销)【在Java、PHP或者.net等服务器端语言中,会为每一个客户端连接创建一个新的线程。而每个线程需要耗费大约2MB内存,相当于有一个人就要分配一个线程,就要占用空间大小】
劣势:如果某一个事件被I/O阻塞了,整个线程就阻塞了
非阻塞I/O
当在访问数据库取得数据的时候,需要一段时间。在传统的单线程处理机制中,在执行了访问数据库代码之后,整个线程都将暂停下来,等待数据库返回结果,才能执行后面的代码。也就是说,I/O阻塞了代码的执行,极大地降低了程序的执行效率。
而Node.js中采用了非阻塞型I/O机制,因此在执行了访问数据库的代码之后,将立即转而执行其后面的代码,把数据库返回结果的处理代码放在回调函数中,从而提高了程序的执行效率。
当某个I/O执行完毕时,将以事件的形式通知执行I/O操作的线程,线程执行这个事件的回调函数。为了处理异步I/O,线程必须有事件循环,不断的检查有没有未处理的事件,依次予以处理。
因此,阻塞模式下,一个线程只能处理一项任务,要想提高吞吐量必须通过多线程。而非阻塞模式下,一个线程永远在执行计算操作,这个线程的CPU核心利用率永远是100%。
所以,这是一种特别有哲理的解决方案:与其人多,但是好多人闲着;还不如一个人玩命,往死里干活儿。
事件驱动
概念:不管是新用户的请求,还是老用户的I/O完成,都将以事件方式加入事件环,等待调度
运作流程:在Node中,在一个时刻,只能执行一个事件回调函数, 但是在执行一个事件回调函数的中途,可以转而处理其他事件(比如,有新用户连接了),然后返回继续执行原事件的回调函数,这种处理机制,称为“事件环”机制。
3.1.特点
适用场景:
网站开发(如express/koa等)
im即时聊天(socket.io)
api(移动端,pc,h5)
HTTP Proxy(淘宝、Qunar、腾讯、百度都有)
前端构建工具(grunt/gulp/bower/webpack/fis3…)
跨平台打包工具
写操作系统(NodeOS)
命令行工具(比如cordova、shell.js)
反向代理(比如anyproxy,node-http-proxy)
编辑器Atom、VSCode等等
图2 企业中使用Node.js的情况
多一个点在看
多一条小鱼干
以上是关于Node.js——前世今生的主要内容,如果未能解决你的问题,请参考以下文章