最近开始看一些大前端的东西,也开始查阅Node、ServerLess、BFF相关的一些书籍和技术文档,每一次进阶都感觉如沐春风,技术的魅力实在太大了😀。各种技术疑问在头脑蹦出,刚刚过去的双十一阿里是如何做到支持如此高并发的服务的?NodeJS适合什么样的场景下使用?如何在实际场景中通过BFF(服务于前端的后端)的聚合裁剪和适配逻辑解决实际中的问题...
接下来只是简单的回答下开始学习Node的几个疑问,如有错误,请指正。。
NodeJs是什么
解释:NodeJS是一种通过javascript语言开发WEB服务端的技术,也就是可以通过JS编写运行在电脑运行的程序而不需要在浏览器。NodeJS并不是一门语言,而是一个基于Chrome V8引擎的JavaScript运行环境。结合LiBuv,使之支持io、fs只有语言才有的特性
为什么用NodeJS
解释:因为NodeJS有非阻塞I/O和事件驱动等特性,从而让高并发在的轮询和Commet构建的应用成为可能。
什么是非阻塞I/O和事件驱动
解释:比如我们要开发一个实时通讯工具,以往是通过长轮询的方式来保持连接,实现消息同步更新,只有在服务端有新的消息才会重新连接,重复此操作。但是每个连接在服务器都会占用一定的内存,所以也会浪费服务器的资源去保持无效的连接,同时当连接数达到一定的量的时候,那么服务器可能就会down掉。那这个时候就可以通过非阻塞I/O和事件驱动的这一类的特性来解决了,我们可以把服务器想象成一个大的Loop循环(时间循环处理库是有LiBuv提供支持的),每当一个新的请求来的时候或者任何其他I/O工作被添加到工作队列的时候,线程循环的处理队列上的任务,当执行过程遇到堵塞(egg.大文件读取、数据查询)时,线程不会停下来等待结果返回,而是留下一个处理结果的回调函数,再有EventLoop将I/O任务丢到线程池去。接着继续执行队列中的下一个任务,这个回调函数会在堵塞任务结束时才被线程调用,这也就是非阻塞I/O。往返循环,就形成了我们常常说的事件循环机制EventLoop。这样的话,我们的服务器也就不会闲着去等待,而是在客户端有事件发生的时候服务器才会去响应,从而也实现了不用通过频繁的为每一个请求创建一个额外的线程,这也就是事件驱动。
注:libuv 由事件循环和线程池组成,负责所有 I/O 任务的分发与执行
什么场景下适合NodeJS
解释:I/O密集型、业务逻辑简单、高并发
大多数人都认为 Node.js 只能写网站后台或者前端工具,这其实是不全面的,Node.js的目标是让并发编程更简单,主要应用在以网络编程为主的 I/O 密集型应用。Node.js自身在I/O上非常轻量,善于将数据从一个管道代理到另外一个管道,这能是在处理大量请求的时候持有很多开发的接口,并且只占用一小部分内存。
I/O密集型和计算密集型
- I/O密集型:大部分的状况是CPU在等I/O(硬盘、内存)的读写操作,比如网络请求、页面请求、SOCKET连接
- 计算密集型(CPU密集型):大部分的状况是I/O在等CPU的执行操作,比如计算圆周率、高清视频解码,全靠CPU的运算能力
Node的特点
- 单线程(通过Event Loop解决运算问题,也是这个特点使得它比其他平台高出很多I/O处理的能力,支持更多并发链接)
- 非阻塞I/O
- 依赖于Chrome V8引擎进行代码解释
Node的缺点
- 因为JS是单线程的,所以如果长时间的运行的计算,将会导致CPU时间片不能释放,使得后续I/O无法发起
- 支持单核CPU,无法充分利用多核CPU
- 不适合CPU密集型的运算(但是也是可以通过系统底层语言Rust来扩展解决解决此问题)
Node VS PHP
在性能方面,Node更胜一筹,由于Node遵循事件驱动的非阻塞I/O模型,与传统的后端技术相比,Node能处理大量的服务器请求。而PHP遵循一个阻塞模型,会在服务端中创建多个线程来处理客户端请求,如果代码没有被优化,那么容易造成服务器高负载和响应时间较长。当如果需要处理一些需要比较占用CPU的业务时,那么PHP更适合。NodeJs是追求极致性能的一门技术,但是对于银行、政府等应用的系统来说,考虑更多的是系统的健壮性,而NodeJs恰恰在这方面有所欠缺。
场景
- 聊天应用:这一类的并发量较高,连接数较多的比较适合用NodeJs
- ERP系统:ERP对并发要求很低,却对业务逻辑的复杂新、与外部系统的集成度、服务与数据的可靠性和稳定性有很高的要求,这些都不是Node擅长的领域,那么更适合传统后端的开发方式
Node的WEB服务框架
Express
基于 Node.js 平台,快速、开放、极简的 Web 开发框架
Koa
Koa 是一个新的 web 框架,由 Express 幕后的原班人马打造, 致力于成为 web 应用和 API 开发领域中的一个更小、更富有表现力、更健壮的基石。 通过利用 async 函数,Koa 帮你丢弃回调函数,并有力地增强错误处理。 Koa 并没有捆绑任何中间件, 而是提供了一套优雅的方法,帮助您快速而愉快地编写服务端应用程序
Nest.js
用于构建高效且可伸缩的服务端应用程序的渐进式 Node.js 框架
Egg.js
Egg.js 为企业级框架和应用而生,可以由此孕育出更多的上层框架,奉行约定优于配置
结论
个人很喜欢Node.js,这项新的技术给前端带来了更大的发展潜力,同时,因为Node.js也有自己的短板,所以我并不认为Node.js可以完全替代整个后端,尽管Node是可以做到这一点的。我认为目前Node最大的价值就是能让前端完全把控整个UI层(包括浏览器端和server端),这样就真的实现了让专业的人做专业的事,前端只管如何把拿到的数据整合成以更好的方式呈现给用户,而后端只管数据的查询、存储和数据的安全性。