Nodejs 为什么对关系型数据库支持不好? Nodejs 为什么不适合 CPU 密集型应用?

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

Nodejs 为什么对关系型数据库支持不好? Nodejs 为什么不适合 CPU 密集型应用?
老板想让前端也承接一部分后台业务,身为一名前端推荐了 node,并说了 node 的缺点和优点,引起了老板如题的发问。有没有大佬能协助探讨下这个问题 QAQ

49 回复

如果不能说服老板,就要去学 Java 了……


js 、python 、php 这些脚本语言类的都不适合性能要求特别高的场景吧。
可以性能要求高的地方用传统后端语言,普通场景用 node.js

想的是只有表层用 nodejs 去接,数据库还是由 Java 的人去查。然后老板就问为啥 node 为什么对关系型数据库支持没有 Java 好……

先问是不是

啥语言都能搞定吧,只不过是轮子多少的问题

NODE.JS 的主线程都会有一个 EVENT LOOP 在监听事件,如果做计算密集性的工作,CPU 一直在计算,肯定没有时间去检查事件了。

直接 Golang 一把梭

这是多大的体量,能遇到 node 的性能问题?

nodejs 为什么对关系型数据库支持不好?
其实支持的并不是不好,该有的都有
nodejs 为什么不适合 CPU 密集型应用?
因为 node 的主线程是一个单线程,如果执行 cpu 密集型任务会堵住。

按照你的设想,其实你想做的就是 BFF, 这一层拿 node 做没毛病。我们公司就是这么做的,效果很好。前端可以自己写接口,而且灵活性也很强

JAVA 对关系型数据库支持好??????
mybatis 本质上还是写 sql
jpa,hibernate 太多限制,功能稍微复杂点还不如写 sql 。

不知道是怎么得出来的对关系型数据库支持不好,如果你用 mongo 那和 node 配合起来简直爽得不行
node 不适合 cpu 密集型?这个要看场景,主要是因为 node 在 js 这一层是单线程的,就是说虽然它 IO 是能异步并发执行,但是当异步回调时一次只执行一个回调,如果你写个死循环那么 node 就会被卡死,如果你的代码特别复杂那么就会占用太多的时间,导致其它的回调在后面排队
如果你的需求简单,那么它也是适合密集型计算的,v8 对 js 的优化还是很厉害的,不是说不适合就一定不能用

后半句一般情况下正确

结论: nodejs 用户层单线程 + 异步 io 适合 io 密集型 不适合计算密集型
具体查 nodejs 的模型
可以参考<深入浅出 node.js>

嗯,如果说 transaction,线程+Threadlocal 确实比异步的 node 方便很多。

get~百度一下好多说缺点是对关系型数据库支持不好的_(:з」∠)_我其实也想用 Mongo 但是老板说是要和公司统一,要用 SQL 。哎,,,,

1.有些公司的后台业务,会存在一部分甚至大部分很简单的需求。其特点是由简单的业务流程 + CURD 组成的。这部分需求,正常的前端程序员,就算是用 js,也能拿下来。这就是前后端程序员在这个问题的核心所在。

2.其次,非贬义,同样能力的前端与后端,对于老板来说,前端的价格会便宜些。那么用前端来做这些简单的后端活,性价比更好。这是老板在这个问题的本质所在。

3.在工程界,关系型数据库,默认对 java/C#这类偏业务类的语言或环境,支持度更好,更原厂一些。就连 C 、C++的支持度都没 java/C#好。因此,并不是说 nodejs 对关系型数据库支持不好,而是关系型数据库,对于除了 java/C#之外,支持度都是辣鸡。这是你的第一个问题。

4.python/node/php/java/C#等等,这类语言特点是偏向业务,实现业务需求比 C/++快,但对于计算机设备会有额外的性能损耗。CPU 密集型需求,一般情况下,在前期方案选型时,就会选择节约性能的语言,比如 C 、C++。很多公司虽然前期会用 python/node/php 等进行快速探路,一旦探路成功,规模起来后,大多会改为 C/C++。比如脸书就是个例子。

现阶段带虚拟机的语言除了 Java 之外 CPU 使用效率都不高

现在都是多进程,单线程不影响性能,最新 node 也开始支持进程内多线程 worker 。
另外 js 性能在动态语言里是顶尖的,比 java 差不了太多。
类型有 typescript,动静结合,类型表达能力比 java 更灵活。

JavaScript 不是有 async/await 吗,单论访问数据库这个比 Java 的 Thread 模式好; ThreadLocal 也许是个问题,但是我觉得也不是不能忍。

都 2020 年了,nodejs 早就支持多线程多进程了

mongo 不是关系型数据库吧

解决的方法总比问题多,公司也主推 Java, 作为前端的我还在孜孜不倦的找机会推荐 nodejs 也上了几个项目效果也挺好的。但是真的能玩起来的前端没几个。

async 处理事务麻烦点,也可以尝试 asynchooks,但是实际上并不好

不是很理解为什么数据库与用什么语言还有关系?

数据库不是个独立系统吗?各种语言调用它的 API 来存取数据。

如果你只会 node,反而我觉得应该继续用 node,语言只是一种工具,学习其他语言需要的时间和精力足可以让你在 node 上深层次挖掘。这并不是让你固守己见,学习新知识更多的利用业余时间,当你拿出来的时候,它更应该是一把利器。


1 、MongoDB is a cross-platform document-oriented database program. Classified as a NoSQL database program, MongoDB uses JSON-like documents with optional schemas.
2 、CPU 密集型应用就是场景了,还要看什么场景。不合适就是不合适,nodejs 优点就是对异步的支持,CPU 密集型应用使用异步还是同步对性能也根本不会有太大的影响。

老板可能就是想让你写 java

可能国内的在做技术选型的人就是不喜欢 js,如果关注一下 nodejs 在服务端的应用,单就外国来说,实践(文章)还是很多的,当然我不在国外,也只是臆测

node 对关系数据库支持挺好的

#12 请教一下。为啥都说 node 在 js 上是单线程的?其他语言不也一样么?
想多线程,createthread 啊,不都是这么解决的么?

生态还是一般,总结起来属于,做都可以做,但是没必要

来到北美才发现,除 FLAG 这种开源领导者以外,普通企业中最流行的是.Net 。Node 比国内流行一些,但也不如用 Ruby 的多。

总之就不是 everythin java 嘛,那就完事了😂

nodejs 的数据库 orm 还是太少,用起来也比较烦琐。能不入 nodejs 的坑就尽量不要入了。php/py/go 的生态都比 nodejs 要好

node 的框架 koa2 或 express 引入包 ,自己封装下 都可以把,不过生态确实一般

oracle database 的话,node 要单独下个超级大的依赖包

node.js 搭配 mongodb 很方便,MEAN/MERN 架构 h 还是很不错的,搭配关系型数据库的不多,有 typeorm

就告诉老板各大厂都用 nodejs 就好了,而且 nodejs 上手容易,部署简单很容易找到维护者。计算型的就不要用 nodejs 用 java,nodejs 主要用于处理异步请求,跟 nginx 的事件模型应用场景很像,高性能非阻塞是 nodejs 牛逼于 java 的地方。

感谢各位大佬的回复~Thanks♪(・ω・)ノ

哪一门语言好,还是要建立在你对它的熟悉程度,如果楼主是前端,对 js 很熟悉,那么转后端,非常建议用 nodejs 。

这两个问题如果从字面上理解的话,其前提都是假命题。

Node.js 在哪些方面对于哪些关系型数据库支持不好?数据库驱动其实只需要实现 Socket 通信、实现特有通信协议、发送指令( SQL 字符串)、反序列化返回结果就可以了,Node.js 一开始就支持 Socket 通信(net 模块),通信协议是纯逻辑的只要是图灵完备语言都能实现,字符串任何编程语言都支持,反序列化完全就是按照本身语言特性来设计的。现在主流数据库 Node.js 都有对应的驱动包,有的甚至是数据库官方提供的。

如何定义“CPU 密集型”?如果指的是多线程多进程的话,那 Node 完全没问题;但如果单纯看执行效率的话,没啥语言能比得过汇编、C 、C++、Rust 等编译型系统开发语言吧( Java 的性能也并不比 Node 好多少( https://benchmarksgame-team.pages.debian.net/benchmarksgame/fastest/javascript.html),跟系统开发语言来比仍然有很大距离)。而且因为 Node.js 内的 V8 是支持 WebAssembly 的,以及 Node 自己支持 N-API,核心对计算性能要求较高的模块(一般要求高性能的部分都是很少的一部分)可以用 C/C++、Rust 来实现,然后由 Node.js 调用,早年做区块链的很多公司就是这么搞的。

如果捋一遍目前最新版的 Node 的文档,可以发现现在 Node 能干以前干不了的很多事了。

我觉得前端干后端的活的问题从来不是工具、语言、引擎、框架的问题,而是后端架构思想、中间件、DevOps 、SRE 方面知识不足的问题,现在没有任何一个成规模的系统是只用一门语言就可以做得很好的,多种语言、多种中间件、多种架构思想各自发挥各自的优势才能让整体系统处于最佳状态(同时降成本降到最低)。

想说明老板,可以让老板提出几个指标(比如硬件资源、并发量、相应速度、开发周期等指标),然后你再去调研 Node.js 现阶段是否能让你们实现这些指标,能的话就直接用 Node.js 试试,用数据来说话。
或者让老板把担忧说明白一些,然后你可以做一些 Demo 来证明他可以不用担忧。

根据具体的业务场景选择语言,Node.js 的特点是适合网络 I/O 密集型应用,开发效率高,轻量级,如果有 CPU 密集型场景用 Go 。
https://shimo.im/slides/r8jXRvtTgx6jxC9j

其实这两个问题跟 nodejs 没有什么关系
用不用关系型数据库是你的业务决定的,如果你要做一个日志系统,那用文档数据库可能更顺手。
你的业务中存在很重的运算需求,才需要去考虑可能存在的技术天花板,例如你是做图片处理,长文本分词这种,那肯定要对比下其他语言( nodejs 下有 c 的分词库跟很不错的图形库)。
技术选型脱离了业务需求肯定是要掉坑的,把时间精力花在最重要的业务核心上比较重要。

数据库支持很好啊
https://www.expressjs.com.cn/guide/database-integration.html
CPU 密集照样干: https://www.v2ex.com/t/705067
而且异步加解决 CPU 密集,性能又能上一个档次

接着上一条,这个是白话异步讲解异步模式的优势: https://www.zhihu.com/question/59739941/answer/182109996
当然 node12 自从推出多线程,就可以使用多线程加异步来解决 CPU 密集问题了

我看到第一问,我就疑惑了,nodejs 操作什么数据库不都一样吗?大家都是操作数据库的接口实现的库,只是实现语言不一样罢了。

关于Node.js对关系型数据库支持不好的问题,这并非绝对。实际上,Node.js可以通过官方或第三方的驱动程序与关系型数据库(如MySQL、PostgreSQL)进行集成。不过,由于Node.js的异步非阻塞特性,它更适合与NoSQL数据库(如MongoDB)搭配,以发挥其在处理高并发I/O密集型任务时的优势。

至于Node.js不适合CPU密集型应用的原因,这主要基于其设计理念和核心特性:

  1. 单线程模型:Node.js采用单线程模型,无法充分利用多核CPU的计算能力。对于需要大量计算资源的CPU密集型应用,单线程模型会成为瓶颈,导致应用性能受限。
  2. 异步非阻塞I/O模型:虽然异步I/O模型可以帮助Node.js应用保持响应性,但它并不直接解决CPU密集型任务的问题。对于CPU密集型任务,即使使用异步API,也仍然需要等待CPU完成计算。

示例代码如下,展示了Node.js中一个简单的异步操作:

async function example() {
  // 模拟一个异步操作,如数据库查询
  await new Promise(resolve => setTimeout(resolve, 1000));
  console.log('异步操作完成');
}

example().catch(console.error);

综上所述,Node.js更适合I/O密集型任务和高并发场景,而非CPU密集型应用。

回到顶部