1.Node.js可以应该在中台吗?
(1)Node.js作为一门后端语言,在后端技术架构方面处于的位置主要有两种:
- 纯 Node.js 应用,从前端到数据层都由 Node.js 处理(创业公司居多)
- 将 Node.js 作为中间层,Node.js 作为业务中间层调用数据接口(大公司前后端数据分离方案)
Node.js 特别适合中小型系统的快速开发,而当系统变得复杂以后,Node.js 更适合充当 Web Gateway 的角色,以及用于前端开发。
(2)应用场景
- 独立小型内部web站点。
- 完整的重 App 的后端,其中有调用更底层的服务(如通用的用户服务等)。
- 前后端分离网关路由层,web及h5项目路由层,调用底层JAVA api。
- 前端工具,如 Webpack ,gulp打包等。
划重点:底层的服务提供者(微服务等),一般都是Java架构提供业务数据。Node进行数据聚合,然后提供API接口给前端页面。
Node.js可以代替java中台的部分功能(前端业务逻辑沉淀),代替App客户端页面和业务逻辑都放在java端。
2.Node.js优缺点
主要来说有一下缺点:
(1)简单易学,很多前端设计人员可以很快上手做后端设计;
(2)但是它可靠性低,优化难,难调试;所以还是做接口吧。
(3)线上稳定性方面还是跟java等成熟的语言有所差距。
(4)node.js相比于java系缺少了一些好用的服务治理服务监测框架。 比如JAVA有dubbo, rocketMQ...等,node已经很好用,只是缺少上层建筑。
(5)就企业级的 Web 框架来说,还有缺失,或者不活跃。目前社区中最火的 Express 和 Koa 来说实际上称不上是框架。
(6)Node是单线程的,只支持单核CPU,并不能充分的利用多核CPU服务器。当这个进程崩掉,那么整个web服务就崩掉了。
(7)在语言层面 JavaScript 本身的设计让你感觉很灵活,因为它基本上是不对类型进行约束的,只有当运行过程中发生了错误才会提示你。如果代码量很大的话,光找错误都是一项非常巨大的工程。
3.Node.js单线程原理
(1)高并发
一般来说,高并发的解决方案就是多线程模型,**服务器为每个客户端请求分配一个线程,使用同步I/O**
,系统通过线程切换来弥补同步I/O调用的时间开销。非常简单,可以实现复杂的交互逻辑.
Node.js针对这一事实采用了单线程模型来处理,**它不会为每个接入请求分配一个线程,而是用一个主线程处理所有的请求**
,然后对I/O操作进行异步处理,避开了创建、销毁线程以及在线程间切换所需的开销和复杂性。
(2)事件循环
Node.js 在主线程中维护了一个事件队列,当接收到请求后,就将请求作为一个事件放入该队列中,然后继续接收其他请求。如果是非I/O任务,就亲自处理。如果是I/O任务,就从线程池中拿出一个线程来执行这个事件。
(3)总结:
- I/O密集型任务:Nodejs就把任务交给线程池来异步处理,高效简单。
- CPU密集型任务时,就是只用CPU计算的操作,这时Node.js就会亲自处理,一个一个的计算,前面的任务没有执行完,后面的任务只能干等着。Nodejs就适合
4.知识拓展
(1)IO密集型任务
- 网络、磁盘IO的任务都是IO密集型任务。
- 常见的大部分任务都是IO密集型任务,比如Web应用。
(2)CPU密集型任务 - 数据加解密(node.bcrypt.js),数据压缩和解压(node-tar),图片处理、视频编码、人工智能等。
- 大量循环代码。