当前位置: 首页 > 后端技术 > Node.js

Node.js特性及适用场景

时间:2023-04-03 12:52:12 Node.js

Node起源Node由RyanDahl创建。RyanDahl是一名高级C/C++程序员。在创建Node之前,他的主要工作是围绕高性能Web服务器,他找到了设计高性能Web服务器的几个关键点:事件驱动、非阻塞I/O。基于对现有几种语言的比较和考虑,RyanDahl选择了JavaScript作为Node.js的实现语言。.Node特点1.异步I/O在Node中,从文件读取到网络请求,大部分操作都是异步调用的。异步I/O是指每次调用之间不需要等待上一次I/O调用结束,在编程模型上可以提高效率。如果有两个文件读取任务,最后的耗时只取决于最慢的文件读取耗时。对于同步I/O,His耗时是两个任务的总和。2.事件和回调事件在Node中被广泛使用。例如,创建一个服务器,我们将请求对象绑定到服务器,并将数据和结束事件绑定到请求对象。同时,我们通常会在前端绑定ajax请求。设置成功事件,错误事件等。同样,回调在Node中无处不在,事件处理基本都是通过回调来实现的。在JavaScript中,函数可以作为对象传递给要作为实际参数调用的方法。3、单线程Node在浏览器中保持了JavaScript的单线程特性,在Node中JavaScript和其他线程不能共享任何状态。JavaScript之所以使用单线程,与其最早使用有关。在最早的网络浏览器中,JavaScript主要响应用户的DOM操作并进行表单验证。这些功能单线程处理就足够了,而对于DOM操作来说,使用多线程也会带来线程安全问题,多线程也会给浏览器带来更大的内存消耗,降低CPU使用率。就单线程本身而言,有以下弱点:1.无法使用多核CPU2.出错会导致整个应用程序退出,需要考虑应用程序的健壮性3.大占用CPU的计算次数会阻塞程序的运行。严格来说,Node并不是真正的单线程架构。Node本身仍然有一定的I/O线程。这些I/O线程由底层的libuv来处理,也就是说Node在访问系统I/O时仍然是多线程的。对于文件读取、检索、SQL查询、网络请求等具体操作,Node依然采用多线程进行处理,以保证Node的处理效率。为了处理单线程的CPU利用率问题,Node采用了多进程架构,这就是著名的Master-Worker模式,也称为主从模式。如下图所示,这种典型的用于并行处理业务的分布式架构具有较好的扩展性和稳定性。Node通过fork()复制的进程都是独立的进程。这个过程中有独立的V8实例。每个独立的进程至少需要30毫秒的启动时间和至少10MB的内存。fork()过程虽然有一定的开销,但是可以提高多核CPU的利用率。这在CPU通常是多核的今天仍然非常有用。同时,我们也应该意识到,Node已经可以通过事件驱动的方式解决单线程的大并发问题。问题是启动多进程只是为了充分利用CPU资源。在Node的Master-Worker多进程模式下,master进程和worker进程通过消息传递进行通信,而不是共享或直接操作资源。通过fork()创建worker进程后,在master进程和worker进程之间创建一个IPC。Channel,多进程相关内容,Node官方提供了cluster模块来管理进程,相关内容请参考cluster。关于应用的健壮性,我们也可以采用上面提到的Master-Worker模式。主进程只负责管理工作进程,具体的业务处理由工作进程完成。监听工作进程中的uncaughtException事件可以捕获未知异常。然后通知主进程,主进程根据策略重新创建工作进程,或者直接退出主进程。在这种情况下,代码必须给出足够的日志信息,并通过日志监控任务及时产生告警。4、跨平台Node刚发布的时候,只能运行在Linux平台上。后来Node在架构层面做了改动,在Node和操作系统之间引入了一层libuv,实现了跨平台。Node适合的应用场景1.I/O密集型Node的异步I/O特性,可以轻松面对I/O密集型业务场景,处理效率会比同步I/O高,虽然同步I/O可以它以多线程或多进程的方式进行,但相对于Node的异步I/O特性,会增加内存和CPU的开销。2.高并发场景对于高并发请求场景,Node的异步I/O和事件回调特性可以高效处理并发请求。举个简单的例子:有一家快餐店,有一个收银员和4个厨师。高峰期,很多人回来吃饭。对于同步场景,收银员收钱后给厨师下单,厨师开始做菜。在异步场景下,收银员会把订单交给厨师,收款后给顾客一个号码牌。厨师开始制作。这时候,顾客可以到隔壁去买饮料,等厨师说完鼓掌就可以取餐了。对于同步场景,如果需要提高客户的处理速度,需要增加几个收银员(多线程),这意味着更多的人力成本,虽然对于系统的处理能力(厨师)来说是一样的。总结总体来说,Node的异步I/O在开销固定的情况下,可以极大的提升并发处理速度,适合高并发、I/O密集的使用场景。同时,由于单线程的特点,Node程序不如多线程。程序健壮性高,多线程无法使用多核CPU。但是对于Node来说,使用多进程的代价是比较小的。合理使用多进程可以解决以上问题。关于软件架构和编码质量。为了方便学习,我会写Node中的Buffer、内存控制、程序测试等相关内容。