Nodejs环境下,nestjs 是怎么和 spring,go(gin)这些原生支持多线程框架竞争的?

发布于 1周前 作者 sinazl 来自 nodejs/Nestjs

菜鸟好奇的问下,各位大佬乱入~~~

单线程是不是只能小打小闹?


Nodejs环境下,nestjs 是怎么和 spring,go(gin)这些原生支持多线程框架竞争的?
21 回复

你关心这个干嘛,一般人一辈子大概率不会拥有 node 单进程解决不了的网站,web 应用不是 cpu 密集,js 这类异步语言单线程足够满足 99.9%程序。
且人家 node 的 web 应用天生就支持多进程部署,程序都不用改。


一楼正解。

别动不动就多少并发的,互联网上大部分的网站根本不需要多少并发,就是一个资源转发,单进程几十个人的用户完全没问题。

同楼上,一般人也用不到 nestjs ,这种模仿 spring 的项目就是个伪需求。绝大多数项目只需要 express ,高级点 eggjs 就可以搞定。

新人不要太多关注这些宏大概念,先把业务摸透,把基础打扎实才是王道。

  1. 是的,小打小鬧
    2. 是的,一般你也閙不大
    3. 閙大了再花點小錢請幾個 JAVA crud 仔重寫

node.js 原生有多进程支持. 那种一个连接起一个线程的框架也没什么技术含量

因为。。不需要考虑这个。。。跑多线程的方式那么多,框架又是支持异步和流式的,所以在这点上是无所谓的。。。

另外,他的竞争对手是 node 平台的其他框架。。。你跨到 java 和 go 上,没啥可比的

nestjs + k8s 或者上 serverless,同样能抗住,但是谁有这么多客户.
我们业务每天差不多 1E 次调用,k8s16 个 pod 游刃有余

我的理解是 现在的 web 应用几乎都是 IO 密集型,IO 密集型的程序使用多线程没有太大的优势

IO 密集型有异步

nodejs 只是应用层面的单线程,io 本来就会在底层多线程并行。
再说现在 node 早就不是 0.x 版本了,应用层多线程多进程都原生支持好多年了

nodejs 线程模型挺厉害的,主要是好几个大佬在上面搞了高效利用线程的东西,反而 Java 这边思维固化了,虚拟线程的理念最先的实践就是 nodejs (绿色线程)

哪有这么多需要高并发的东西。
大部分生意,只需要把东西做出来。

性能什么的,等你需要考虑,你已经基本上不差钱来招人干这个了

跨语言竞争多少有点离谱了,nodejs 的优势也不在这

跨语言竞争就算了,你还拿解释性语言和编译性语言竞争,你搁这降维打击呢

到计算密集任务的时候,node 直接就挂 C++ addon 了。IO 密集那 node 的优势可太大了。

Redis 单线程为什么这么快? 和这个问题差不多。

云原生,无服务计算呀

对 nestjs 不了解,但对 Node 比较了解。
Node 的非阻塞 IO 只有计算部分是单线程,IO 部分是多线程的。
虽然 Node 支持多线程、多进程,但实际上微服务集群出现之后,单实例是不是多线程也没啥关系,堆集群节点数量就好了,负载均衡一分。只有真正在一个业务流程过于冗长需要多线程、多进程来优化的时候,才需要专门去做多线程、多进程设计。
特别是云原生之后,同一个微服务的集群节点都可能同时在不同服务器上,而且被动态调整。

Spring 的优势在于人才量大管饱,可能直到目前任何其他语言框架依然都没法竞争过 Spring 。
Go 实际上是被专门设计成一种,专门用于解决企业多人合作生产痛点的“产品”,牺牲灵活性来提升开发产能。我也不认为 nestjs 能竞争过 Go 。

几十个人?恐怕十几万人的用户也没问题哦。

在Node.js环境下,NestJS作为一个框架,虽然Node.js本身是基于单线程模型的,但NestJS通过一些策略与Spring、Go(Gin)这些原生支持多线程的框架竞争。

首先,NestJS利用Node.js的异步非阻塞I/O特性,在处理高并发请求时表现出色。它使用事件驱动模型,使得I/O操作不会阻塞主线程,从而提高了应用程序的吞吐量。

其次,虽然Node.js单线程模型在处理CPU密集型任务时存在局限性,但NestJS可以通过引入worker_threads模块实现多线程。以下是一个简单的示例代码,展示了如何在NestJS中创建和管理worker_threads:

import { Injectable } from '@nestjs/common';
import { Worker, isMainThread, parentPort, workerData } from 'worker_threads';

@Injectable()
export class WorkerService {
  // ...(代码省略,具体实现可参考多线程管理示例)
}

通过这种方式,NestJS能够处理计算密集型任务或需要并行处理的任务,从而提高了整体性能。

此外,NestJS提供了模块化、面向对象的程序设计方式以及强大的依赖注入系统,使开发者能够轻松地构建复杂的Web应用程序。这些特性使得NestJS在竞争激烈的市场中脱颖而出,成为与Spring、Go(Gin)等框架相媲美的优秀选择。

回到顶部