使用node.js 开发后端的优缺点

node做后端的缺点是:

1.nodejs单线程,不能做cpu密集型操作,导致时间片不能释放,阻塞后面的任务。

2.nodejs可靠性比较低,一个地方报错会导致整个程序崩溃,需要守护进程或者docker重启来解决。

3.像使用多核性能的时候需要使用cluster或者部署多个实例,比较麻烦。4.内存默认0.7G和1.4G,设置大了之后垃圾回收会变慢,可能需要多部署几个实例。

优点是:

1.nodejs底层异步io,性能比较好。

2.NodeJs超强的高并发能力。

3.开发速度高,弱类型语言比较灵活,不像强类型一样需要各种转换,代码量少。

4.前后端编程环境统一。

5.开发周期短、开发成本低、学习成本低。

具体分析如下:

缺点

1.不适用于CPU密集型

如果是I/O任务,Node.js会把任务交给线程池来异步处理,高效简单,因此Node.js适合I/O密集型任务。 但不是所有任务都是I/O密集型任务,如碰到以下CPU密集型任务时,

  • 数据加解密(node.bcrypt.js)

  • 数据压缩和解压(node-tar)

Node.js就会亲自处理,一个一个的计算,前面的任务没有执行完,后面的任务只能干等着。

目前好一点的服务器都至少是2核,而 Node.js 只有一个 EventLoop,也就是只占用一个 CPU 内核,当Node.js 被CPU 密集型任务占用,导致其他任务被阻塞时,却还有 CPU 内核处于闲置状态,造成资源浪费。

因此,Node.js并不适合CPU密集型任务。

但实际上,大多数网站服务器端都不会做太多的计算,它们接受到请求后,把请求交给其他服务来处理,如RPC(用来读取数据库等),然后等待结果返回。Node.js采用了单线程模型,它不会为每个请求分配一个线程,而是用一个主线程处理所有请求,对于I/O操作则采用异步处理,它避开了创建、销毁线程以及在线程间切换所需的开销和复杂性。

因此,Node.js做后端主要用于BFF层、SSR。

但是Node.js只能利用单核的问题也早就有解决方案了,比如Egg.js框架中的Egg-Cluster模块就利用多进程非常好的解决这个问题。但是仍然较为麻烦。

2.分布式应用基础设施不完善

分布式指的是在多台不同的服务器中部署不同的服务模块,已进程为单位,派发到服务器上,通过远程调用(RPC)通信并协同工作,最终对外提供服务。

对于分布式应用,Node.js的优势不能很好显示出来。

3.可靠性低

一旦代码某个环节崩溃,整个系统都崩溃

  • 原因:单进程,单线程
  • 解决方案:(1)Nnigx反向代理,负载均衡,开多个进程,绑定多个端口;(2)开多个进程监听同一个端口,使用cluster模块;
4.node内存限制
  • 在32位系统限制 0.7GB
  • 64位系统限制 1.4GB

导致的问题: Node 无法直接操作大文件对象。

例如我想读取一个 4g 的文件来处理,即使物理内存有 32GB,在单个 Node 进程中也是不能完全的使用的。

我们平常在声明一些对象的时候,要是没有Node垃圾回收机制回收 ,就会占用V8限制的内存

为什么有内存限制

内存限制主要原因是v8的垃圾回收制度。1.5GB内存做一次小的回收需要50MS,做一次非增量性回收需要1S以上,并且这会使JS线程暂停。因此限制内存。

优点

1、Nodejs语法完全是js语法,只要你懂js基础就可以学会Nodejs后端开发
  • Node打破了过去JavaScript只能在浏览器中运行的局面。前后端编程环境统一,可以大大降低开发成本。
2、NodeJs超强的高并发能力
  • NodeJs的首要目标是提供一种简单的、用于创建高性能服务器及可在该服务器中运行的各种应用程序的开发工具。

  • 首先让我们来看一下现在的服务器端语言中存在着什么问题。在Java、PHP或者.NET等服务器语言中,会为每一个客户端连接创建一个新的线程。而每个线程需要耗费大约2MB内存。也就是说,理论上,一个8GB内存的服务器可以同时连接的最大用户数为4000个左右。要让web应用程序支持更多的用户,就需要增加服务器的数量,而web应用程序的硬件成本当然就上升了。

  • NodeJs不为每个客户连接创建一个新的线程,而仅仅使用一个线程。当有用户连接了,就触发一个内部事件,通过非阻塞I/O、事件驱动机制,让Node.js程序宏观上也是并行的。使用Node.js,一个8GB内存的服务器,可以同时处理超过4万用户的连接。

3、实现高性能服务器
  • 严格地说,Node.js是一个用于开发各种web服务器的开发工具。在Node.js服务器中,运行的是高性能V8 JavaScript脚本语言,该语言是一种可以运行在服务器端的脚本语言。

  • 那么,什么是V8 JavaScript脚本语言呢?该语言是一种被V8 JavaScript引擎所解析并执行的脚本语言。V8 JavaScript引擎是由Google公司使用C++语言开发的一种高性能JavaScript引擎,该引擎并不局限于在浏览器中运行。Node.js将其转用在了服务器中,并且为其提供了许多附加的具有各种不同用途的API。例如,在一个服务器中,经常需要处理各种二进制数据。在JavaScript脚本语言中,只具有非常有限的对二进制数据的处理能力,而Node.js所提供的Buffer类则提供了丰富的对二进制数据的处理能力。

  • 另外,在V8 JavaScript引擎内部使用一种全新的编译技术。这意味着开发者编写的高端的 JavaScript 脚本代码与开发者编写的低端的C语言具有非常相近的执行效率,这也是Node.js服务器可以提供的一个重要特性。

4、开发周期短、开发成本低、学习成本低
  • Node.js自身哲学,是花最小的硬件成本,追求更高的并发,更高的处理性能。
相关推荐
JaguarJack几秒前
PHP 应用遭遇 DDoS 攻击时会发生什么 从入门到进阶的防护指南
后端·php·服务端
BingoGo1 分钟前
PHP 应用遭遇 DDoS 攻击时会发生什么 从入门到进阶的防护指南
后端
Victor3562 分钟前
MongoDB(3)什么是文档(Document)?
后端
傻乐u兔1 小时前
C语言进阶————指针4
c语言·开发语言
大模型玩家七七1 小时前
基于语义切分 vs 基于结构切分的实际差异
java·开发语言·数据库·安全·batch
历程里程碑1 小时前
Linux22 文件系统
linux·运维·c语言·开发语言·数据结构·c++·算法
牛奔2 小时前
Go 如何避免频繁抢占?
开发语言·后端·golang
寻星探路6 小时前
【深度长文】万字攻克网络原理:从 HTTP 报文解构到 HTTPS 终极加密逻辑
java·开发语言·网络·python·http·ai·https
想用offer打牌7 小时前
MCP (Model Context Protocol) 技术理解 - 第二篇
后端·aigc·mcp
lly2024068 小时前
Bootstrap 警告框
开发语言