深入浅出NodeJS读后感01

85 阅读5分钟

1.2.1 为什么是NodeJS

Web服务器的要点:事件驱动+非阻塞型I/O

->Chrome的引擎为V8->高性能+非阻塞型I/O+事件驱动

1.2.2 为什么叫Node

NodeJS:单线程+单进程/具备网络库/轻量化的平台。

1.2.3 Node为Javascript带来的意义

同样是V8引擎,但是在服务器和浏览器的异同:

1)都有Javascript+V8+中间层+硬件层,都是基于事件驱动的异步架构

  • 浏览器通过事件驱动实现用户交互,包括鼠标事件+键盘事件等等
  • 服务器通过事件驱动实现文件I/O,包括数据库连接+搭建WenSocket等等

2)浏览器具有DOM+BOM,利用HTML+CSS构建UI,一部分浏览器的引擎不是V8而是WebKiT;服务器则可以随意通过文件流访问本地资源。

image.png

1.4 Node的特点

作为后端Javascript的运行平台,NodeJS保留了JS的大部分接口,只是删除了DOM+BOM相关的接口,没有改变语言的特性,依然基于作用域和原型链

  1. 异步I/O

在谈论到异步I/O的时候,有一个显著的特点,就是会把异步函数放到异步队列中,继续执行后续代码,异步处理并不关心事件结果的处理时间,更关注于事件的结果。

image.png

以下的两个文件异步处理的事件是以最长的时间为总时间,并不是文件1+文件2的时间

fs.readFile('/path1', function (err, file) { console.log(’读取文件1完成’); })
fs.readFile('/path2', function (err, file) { console.log(’读取文件2完成’); })
  1. 事件与回调函数

Node的服务器虽然没有浏览器的交互事件,但是存在文件处理事件。

与其他的Web后端编程语言相比,Node除了异步和事件外,回调函数也是一大特色。

  1. 单线程

Node保持了JavaScript单线程的特点。

在Node中,JavaScript与其余线程是无法共享任何状态的。

单线程的最大好处是不用像多线程编程那样处处在意状态的同步问题,这里没有死锁的存在,也没有线程上下文交换所带来的性能上的开销。

第一个问题:引申一个问题基于JavaScript浏览器端或者服务器端不同线程之间的应用之间内存是否共享?答:否。原因如上。而单进程多线程的语言之间数据和内存是进行共享,线程之间可能互相调用导致死锁的现象。

第二个问题:我们已知可以通过WebWorker来实现副线程和主JS线程通信,那么WebWorker能否和主线程共享内存和数据?答:否。WebWorker可以通过PostMessage和onMessage和主线程进行数据共享,但并不能主动共享内存变量,也就是如果主线程定义一个变量,如果不PostMessage变量,WebWokrer是拿不到这个变量

但是单线程也具备一定的缺点:

  • 无法利用多核CPU
  • 错误会引起整个网络的崩溃,所以对于所有可能发生的错误点都需要进行错误处理,比如前后端通信错误可以使用trycatch捕获。
  • 单核CPU的计算力有限,导致对于大型的服务器Node应用有限

eg案例: 浏览器中JavaScript与UI共用一个线程一样,JavaScript长时间执行会导致UI的渲染和响应被中断,对于这种解决办法是:HTML5定制了Web Workers的标准,创建副工作线程来进行计算,以解决JavaScript计算阻塞UI渲染的问题。副工作线程通过消息传递的方式和主线程进行通信,但无法和主线程共享数据变量。子进程的出现,意味着Node可以应对单线程无法利用多核CPU方面的问题。通过将计算分发到各个子进程,可以将大量计算分解掉,然后再通过进程之间的事件消息来传递结果,这可以很好地保持应用模型的简单和对单CPU的低依赖性。

  1. 跨平台

最开始NodeJS不能够在Win操作系统上运行,为了实现操作系统的兼容性,Node基于libuv中间层实现跨平台的架构。

1.5 NodeJS的应用场景

  1. I/O密集型场景

Node面向网络,包括有网络库,且擅长并行I/O。I/O密集的优势主要在于Node利用事件循环的处理能力,而不是启动每一个线程为每一个请求服务,资源占用极少。

包括CPU密集型业务,只要涉及到I/O密集处理,大部分都可以利用Node以及其C++扩展处理。

  1. 分布式场景

分布式应用意味着对可伸缩性的要求非常高。数据平台通常要在一个数据库集群中去寻找需要的数据,并行地去多台数据库中获取数据并合并,需要高效利用并行I/O,进而充分压榨硬件资源。

  1. 不擅长处理纯计算的场景

对于纯计算场景,不涉及密集I/O,一般使用多CPU语言更合适,因为Node归根结底在不涉及I/O时还是单线程的开发环境。

1.6 Node的使用者

NodeJS的最主要的优点有:

  1. 前后端编程语言环境统一。

  2. Node带来的高性能I/O用于实时应用。

  3. 并行I/O可以更高效地利用分布式环境。

其他的应用都是基于这三点思想。