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

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

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

    数据库不是个独立系统吗?各种语言调用它的 API 来存取数据。
    fortunezhang
        27
    fortunezhang   56 天前 via Android   ❤️ 1
    如果你只会 node,反而我觉得应该继续用 node,语言只是一种工具,学习其他语言需要的时间和精力足可以让你在 node 上深层次挖掘。这并不是让你固守己见,学习新知识更多的利用业余时间,当你拿出来的时候,它更应该是一把利器。
    forgottencoast
        28
    forgottencoast   56 天前
    @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   56 天前 via Android
    老板可能就是想让你写 java
    KuroNekoFan
        30
    KuroNekoFan   56 天前 via iPhone
    可能国内的在做技术选型的人就是不喜欢 js,如果关注一下 nodejs 在服务端的应用,单就外国来说,实践(文章)还是很多的,当然我不在国外,也只是臆测
    Cbdy
        31
    Cbdy   56 天前 via Android
    node 对关系数据库支持挺好的
    yazoox
        32
    yazoox   56 天前
    @zengming00 #12 请教一下。为啥都说 node 在 js 上是单线程的?其他语言不也一样么?
    想多线程,createthread 啊,不都是这么解决的么?
    black11black
        33
    black11black   56 天前
    @KuroNekoFan 生态还是一般,总结起来属于,做都可以做,但是没必要
    lihongming
        34
    lihongming   56 天前 via iPhone
    @KuroNekoFan 来到北美才发现,除 FLAG 这种开源领导者以外,普通企业中最流行的是.Net 。Node 比国内流行一些,但也不如用 Ruby 的多。
    KuroNekoFan
        35
    KuroNekoFan   56 天前
    @black11black @lihongming 总之就不是 everythin java 嘛,那就完事了😂
    freshgoose
        36
    freshgoose   56 天前
    nodejs 的数据库 orm 还是太少,用起来也比较烦琐。能不入 nodejs 的坑就尽量不要入了。php/py/go 的生态都比 nodejs 要好
    guanhui07
        37
    guanhui07   56 天前
    node 的框架 koa2 或 express 引入包 ,自己封装下 都可以把,不过生态确实一般
    baozijun
        38
    baozijun   56 天前 via iPhone
    oracle database 的话,node 要单独下个超级大的依赖包
    cnscorpions
        39
    cnscorpions   56 天前
    node.js 搭配 mongodb 很方便,MEAN/MERN 架构 h 还是很不错的,搭配关系型数据库的不多,有 typeorm
    wisetc
        40
    wisetc   56 天前 via iPhone
    就告诉老板各大厂都用 nodejs 就好了,而且 nodejs 上手容易,部署简单很容易找到维护者。计算型的就不要用 nodejs 用 java,nodejs 主要用于处理异步请求,跟 nginx 的事件模型应用场景很像,高性能非阻塞是 nodejs 牛逼于 java 的地方。
    yukiball
        41
    yukiball   54 天前
    感谢各位大佬的回复~Thanks♪(・ω・)ノ
    jifengg
        42
    jifengg   54 天前
    哪一门语言好,还是要建立在你对它的熟悉程度,如果楼主是前端,对 js 很熟悉,那么转后端,非常建议用 nodejs 。
    libook
        43
    libook   52 天前   ❤️ 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   39 天前
    根据具体的业务场景选择语言,Node.js 的特点是适合网络 I/O 密集型应用,开发效率高,轻量级,如果有 CPU 密集型场景用 Go 。
    https://shimo.im/slides/r8jXRvtTgx6jxC9j
    leekafai
        45
    leekafai   36 天前
    其实这两个问题跟 nodejs 没有什么关系
    用不用关系型数据库是你的业务决定的,如果你要做一个日志系统,那用文档数据库可能更顺手。
    你的业务中存在很重的运算需求,才需要去考虑可能存在的技术天花板,例如你是做图片处理,长文本分词这种,那肯定要对比下其他语言( nodejs 下有 c 的分词库跟很不错的图形库)。
    技术选型脱离了业务需求肯定是要掉坑的,把时间精力花在最重要的业务核心上比较重要。
    zy445566
        46
    zy445566   30 天前
    数据库支持很好啊
    https://www.expressjs.com.cn/guide/database-integration.html
    CPU 密集照样干: https://www.v2ex.com/t/705067
    而且异步加解决 CPU 密集,性能又能上一个档次
    zy445566
        47
    zy445566   30 天前
    接着上一条,这个是白话异步讲解异步模式的优势: https://www.zhihu.com/question/59739941/answer/182109996
    当然 node12 自从推出多线程,就可以使用多线程加异步来解决 CPU 密集问题了
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1532 人在线   最高记录 5168   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 19ms · UTC 17:38 · PVG 01:38 · LAX 10:38 · JFK 13:38
    ♥ Do have faith in what you're doing.