V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yukiball
V2EX  ›  Node.js

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

  •  
  •   yukiball · 2020-08-28 18:03:11 +08:00 · 7901 次点击
    这是一个创建于 1548 天前的主题,其中的信息可能已经有所发展或是发生改变。
    老板想让前端也承接一部分后台业务,身为一名前端推荐了 node,并说了 node 的缺点和优点,引起了老板如题的发问。有没有大佬能协助探讨下这个问题 QAQ
    48 条回复    2020-11-17 11:11:51 +08:00
    yukiball
        1
    yukiball  
    OP
       2020-08-28 18:05:16 +08:00   ❤️ 1
    如果不能说服老板,就要去学 Java 了……
    anjianshi
        2
    anjianshi  
       2020-08-28 18:07:30 +08:00   ❤️ 1
    js 、python 、php 这些脚本语言类的都不适合性能要求特别高的场景吧。
    可以性能要求高的地方用传统后端语言,普通场景用 node.js
    yukiball
        3
    yukiball  
    OP
       2020-08-28 18:14:03 +08:00
    @anjianshi 想的是只有表层用 nodejs 去接,数据库还是由 Java 的人去查。然后老板就问为啥 node 为什么对关系型数据库支持没有 Java 好……
    stabc
        4
    stabc  
       2020-08-28 18:17:32 +08:00
    先问是不是
    cco
        5
    cco  
       2020-08-28 18:18:11 +08:00
    啥语言都能搞定吧,只不过是轮子多少的问题
    keygen88
        6
    keygen88  
       2020-08-28 18:20:48 +08:00
    NODE.JS 的主线程都会有一个 EVENT LOOP 在监听事件,如果做计算密集性的工作,CPU 一直在计算,肯定没有时间去检查事件了。
    MyFaith
        7
    MyFaith  
       2020-08-28 18:21:44 +08:00
    直接 Golang 一把梭
    azh7138m
        8
    azh7138m  
       2020-08-28 18:23:19 +08:00
    这是多大的体量,能遇到 node 的性能问题?
    coderxy
        9
    coderxy  
       2020-08-28 18:26:40 +08:00
    nodejs 为什么对关系型数据库支持不好?
    其实支持的并不是不好,该有的都有
    nodejs 为什么不适合 CPU 密集型应用?
    因为 node 的主线程是一个单线程,如果执行 cpu 密集型任务会堵住。
    coderxy
        10
    coderxy  
       2020-08-28 18:27:26 +08:00
    按照你的设想,其实你想做的就是 BFF, 这一层拿 node 做没毛病。我们公司就是这么做的,效果很好。前端可以自己写接口,而且灵活性也很强
    optional
        11
    optional  
       2020-08-28 18:33:56 +08:00 via Android
    JAVA 对关系型数据库支持好??????
    mybatis 本质上还是写 sql
    jpa,hibernate 太多限制,功能稍微复杂点还不如写 sql 。
    zengming00
        12
    zengming00  
       2020-08-28 18:34:42 +08:00   ❤️ 1
    不知道是怎么得出来的对关系型数据库支持不好,如果你用 mongo 那和 node 配合起来简直爽得不行
    node 不适合 cpu 密集型?这个要看场景,主要是因为 node 在 js 这一层是单线程的,就是说虽然它 IO 是能异步并发执行,但是当异步回调时一次只执行一个回调,如果你写个死循环那么 node 就会被卡死,如果你的代码特别复杂那么就会占用太多的时间,导致其它的回调在后面排队
    如果你的需求简单,那么它也是适合密集型计算的,v8 对 js 的优化还是很厉害的,不是说不适合就一定不能用
    wangyzj
        13
    wangyzj  
       2020-08-28 18:35:49 +08:00
    后半句一般情况下正确
    silenzio
        14
    silenzio  
       2020-08-28 18:37:10 +08:00
    结论: nodejs 用户层单线程 + 异步 io 适合 io 密集型 不适合计算密集型
    具体查 nodejs 的模型
    可以参考<深入浅出 node.js>
    yukiball
        15
    yukiball  
    OP
       2020-08-28 18:37:57 +08:00
    @keygen88 get~
    optional
        16
    optional  
       2020-08-28 18:39:52 +08:00
    @optional 嗯,如果说 transaction,线程+Threadlocal 确实比异步的 node 方便很多。
    yukiball
        17
    yukiball  
    OP
       2020-08-28 18:48:25 +08:00
    @zengming00 get~百度一下好多说缺点是对关系型数据库支持不好的_(:з」∠)_我其实也想用 Mongo 但是老板说是要和公司统一,要用 SQL 。哎,,,,
    laminux29
        18
    laminux29  
       2020-08-28 18:52:48 +08:00   ❤️ 1
    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++。比如脸书就是个例子。
    misaka19000
        19
    misaka19000  
       2020-08-28 18:54:13 +08:00
    现阶段带虚拟机的语言除了 Java 之外 CPU 使用效率都不高
    love
        20
    love  
       2020-08-28 19:46:52 +08:00   ❤️ 1
    现在都是多进程,单线程不影响性能,最新 node 也开始支持进程内多线程 worker 。
    另外 js 性能在动态语言里是顶尖的,比 java 差不了太多。
    类型有 typescript,动静结合,类型表达能力比 java 更灵活。
    iseki
        21
    iseki  
       2020-08-28 20:40:58 +08:00
    @optional JavaScript 不是有 async/await 吗,单论访问数据库这个比 Java 的 Thread 模式好; ThreadLocal 也许是个问题,但是我觉得也不是不能忍。
    ochatokori
        22
    ochatokori  
       2020-08-28 20:44:01 +08:00 via Android
    都 2020 年了,nodejs 早就支持多线程多进程了
    JerryCha
        23
    JerryCha  
       2020-08-28 21:12:34 +08:00
    @zengming00 mongo 不是关系型数据库吧
    IssacTomatoTan
        24
    IssacTomatoTan  
       2020-08-28 21:18:59 +08:00 via Android
    解决的方法总比问题多,公司也主推 Java, 作为前端的我还在孜孜不倦的找机会推荐 nodejs 也上了几个项目效果也挺好的。但是真的能玩起来的前端没几个。
    optional
        25
    optional  
       2020-08-28 23:45:48 +08:00 via Android
    @iseki async 处理事务麻烦点,也可以尝试 asynchooks,但是实际上并不好
    lihongming
        26
    lihongming  
       2020-08-29 01:55:24 +08:00 via iPhone
    不是很理解为什么数据库与用什么语言还有关系?

    数据库不是个独立系统吗?各种语言调用它的 API 来存取数据。
    fortunezhang
        27
    fortunezhang  
       2020-08-29 04:06:53 +08:00 via Android   ❤️ 1
    如果你只会 node,反而我觉得应该继续用 node,语言只是一种工具,学习其他语言需要的时间和精力足可以让你在 node 上深层次挖掘。这并不是让你固守己见,学习新知识更多的利用业余时间,当你拿出来的时候,它更应该是一把利器。
    forgottencoast
        28
    forgottencoast  
       2020-08-29 08:02:55 +08:00
    @zengming00
    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 密集型应用使用异步还是同步对性能也根本不会有太大的影响。
    ho121
        29
    ho121  
       2020-08-29 08:13:37 +08:00 via Android
    老板可能就是想让你写 java
    KuroNekoFan
        30
    KuroNekoFan  
       2020-08-29 08:28:27 +08:00 via iPhone
    可能国内的在做技术选型的人就是不喜欢 js,如果关注一下 nodejs 在服务端的应用,单就外国来说,实践(文章)还是很多的,当然我不在国外,也只是臆测
    Cbdy
        31
    Cbdy  
       2020-08-29 08:51:28 +08:00 via Android
    node 对关系数据库支持挺好的
    yazoox
        32
    yazoox  
       2020-08-29 10:01:11 +08:00
    @zengming00 #12 请教一下。为啥都说 node 在 js 上是单线程的?其他语言不也一样么?
    想多线程,createthread 啊,不都是这么解决的么?
    black11black
        33
    black11black  
       2020-08-29 10:08:47 +08:00
    @KuroNekoFan 生态还是一般,总结起来属于,做都可以做,但是没必要
    lihongming
        34
    lihongming  
       2020-08-29 10:25:24 +08:00 via iPhone
    @KuroNekoFan 来到北美才发现,除 FLAG 这种开源领导者以外,普通企业中最流行的是.Net 。Node 比国内流行一些,但也不如用 Ruby 的多。
    KuroNekoFan
        35
    KuroNekoFan  
       2020-08-29 10:36:50 +08:00
    @black11black @lihongming 总之就不是 everythin java 嘛,那就完事了😂
    freshgoose
        36
    freshgoose  
       2020-08-29 10:55:42 +08:00
    nodejs 的数据库 orm 还是太少,用起来也比较烦琐。能不入 nodejs 的坑就尽量不要入了。php/py/go 的生态都比 nodejs 要好
    guanhui07
        37
    guanhui07  
       2020-08-29 11:19:03 +08:00
    node 的框架 koa2 或 express 引入包 ,自己封装下 都可以把,不过生态确实一般
    baozijun
        38
    baozijun  
       2020-08-29 11:34:21 +08:00 via iPhone
    oracle database 的话,node 要单独下个超级大的依赖包
    rf99wSiT6IxH1Z23
        39
    rf99wSiT6IxH1Z23  
       2020-08-29 11:57:00 +08:00
    node.js 搭配 mongodb 很方便,MEAN/MERN 架构 h 还是很不错的,搭配关系型数据库的不多,有 typeorm
    wisetc
        40
    wisetc  
       2020-08-29 21:19:16 +08:00 via iPhone
    就告诉老板各大厂都用 nodejs 就好了,而且 nodejs 上手容易,部署简单很容易找到维护者。计算型的就不要用 nodejs 用 java,nodejs 主要用于处理异步请求,跟 nginx 的事件模型应用场景很像,高性能非阻塞是 nodejs 牛逼于 java 的地方。
    yukiball
        41
    yukiball  
    OP
       2020-08-31 10:18:46 +08:00
    感谢各位大佬的回复~Thanks♪(・ω・)ノ
    jifengg
        42
    jifengg  
       2020-08-31 18:12:36 +08:00
    哪一门语言好,还是要建立在你对它的熟悉程度,如果楼主是前端,对 js 很熟悉,那么转后端,非常建议用 nodejs 。
    libook
        43
    libook  
       2020-09-02 13:40:57 +08:00   ❤️ 1
    这两个问题如果从字面上理解的话,其前提都是假命题。

    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 来证明他可以不用担忧。
    haijianyang
        44
    haijianyang  
       2020-09-15 15:49:01 +08:00
    根据具体的业务场景选择语言,Node.js 的特点是适合网络 I/O 密集型应用,开发效率高,轻量级,如果有 CPU 密集型场景用 Go 。
    https://shimo.im/slides/r8jXRvtTgx6jxC9j
    leekafai
        45
    leekafai  
       2020-09-18 16:12:54 +08:00
    其实这两个问题跟 nodejs 没有什么关系
    用不用关系型数据库是你的业务决定的,如果你要做一个日志系统,那用文档数据库可能更顺手。
    你的业务中存在很重的运算需求,才需要去考虑可能存在的技术天花板,例如你是做图片处理,长文本分词这种,那肯定要对比下其他语言( nodejs 下有 c 的分词库跟很不错的图形库)。
    技术选型脱离了业务需求肯定是要掉坑的,把时间精力花在最重要的业务核心上比较重要。
    zy445566
        46
    zy445566  
       2020-09-24 11:42:01 +08:00
    数据库支持很好啊
    https://www.expressjs.com.cn/guide/database-integration.html
    CPU 密集照样干: https://www.v2ex.com/t/705067
    而且异步加解决 CPU 密集,性能又能上一个档次
    zy445566
        47
    zy445566  
       2020-09-24 11:52:26 +08:00
    接着上一条,这个是白话异步讲解异步模式的优势: https://www.zhihu.com/question/59739941/answer/182109996
    当然 node12 自从推出多线程,就可以使用多线程加异步来解决 CPU 密集问题了
    oliver2bao
        48
    oliver2bao  
       2020-11-17 11:11:51 +08:00
    我看到第一问,我就疑惑了,nodejs 操作什么数据库不都一样吗?大家都是操作数据库的接口实现的库,只是实现语言不一样罢了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2033 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 16:14 · PVG 00:14 · LAX 08:14 · JFK 11:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.