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

有实际使用 SpringWebFlux 的大佬分享下经验吗?

  •  
  •   magese ·
    magese · 2024-01-02 15:41:04 +08:00 · 4181 次点击
    这是一个创建于 368 天前的主题,其中的信息可能已经有所发展或是发生改变。

    孤陋寡闻了,这玩意好像出了挺久了😅;

    我是最近在对接 openai api 的时候偶然了解到的,看了下感觉挺有意思的。

    有没有实际使用过的大佬来说一下相较于 SpringMVC 有哪些优劣势?是否能够完全平替掉 MVC ?

    可以的话我想直接在自己项目来试试水了。

    第 1 条附言  ·  2024-01-04 17:03:33 +08:00

    感谢各位大佬的倾囊相授,用AI总结了一下各位的看法:

    SpringWebFlux是一个响应式编程框架,相较于SpringMVC有以下优劣势:并发量大、资源消耗少、功能强大是优势;编程模型复杂、学习成本高、调试麻烦是劣势。它不能完全替代SpringMVC,适用场景主要是处理高并发的无数据库依赖的情况,如网关。对于复杂业务和团队技术不够过硬的项目来说,引入该框架可能会增加维护成本。总体而言,个人玩玩还行,但在商业项目中需谨慎选择使用,并根据具体需求权衡利弊

    那我就只在自己项目对接OpenAI的地方玩玩就好了

    29 条回复    2024-02-16 17:36:43 +08:00
    Leviathann
        1
    Leviathann  
       2024-01-02 15:51:20 +08:00   ❤️ 1
    I think Project Loom is going to kill reactive programming.

    查查说这句话的人是谁
    chendy
        2
    chendy  
       2024-01-02 15:55:27 +08:00   ❤️ 1
    17 年还是 18 年刚出的时候体验过一把,还做过一点简单的测试
    个人体验得出的结论:自己学习学习玩无所谓,除非团队技术过硬或者业务足够简单,否则不要在商业项目中尝试
    因为这玩意解决的是’用多线程扛高并发线程过多扛不住‘的问题,当时测试,一样的最简单接口,一样的压力,响应时间接近,但是 webflux 的内存使用相当少
    代价就是换了个姿势的回调地狱,业务简单还好,业务复杂度套上这玩意的复杂度真的就是杀人级别的存在,没点实力和闲心根本 hold 不住
    yazinnnn0
        3
    yazinnnn0  
       2024-01-02 15:56:42 +08:00
    不能平替

    优势是并发量大, 消耗资源少, 功能强大

    劣势是编程模型复杂, 复杂点的业务你要写成 monad 地狱, 虽然并发量大,但是一般业务瓶颈在数据库, 利用不到 reactive 的最大优势

    写着玩可以随便试, 用 kotlin 协程可以稍微拯救一下 monad 地狱

    loom 也不是银弹, loom 是增强 blocking 的方案, 不是增强 reactive 的方案
    DoctorDeng
        4
    DoctorDeng  
       2024-01-02 16:03:12 +08:00
    可以学习,学习,没啥特殊需要一般不会使用。我之前的项目也就网关这种需要性能的模块用了。WebFlux 使用成本高,引入 WebFlux 后相关依赖的所有组件都得支持 Reactive 。另外 WebFlux 的代码阅读调试麻烦,不像同步方式那么容易让人理解,最后 WebFlux 使用对开发人员要求较高,用的不好,程序性能搞不好会倒退。
    Wien
        5
    Wien  
       2024-01-02 16:09:37 +08:00
    没啥用。20 年的时候项目改造中用过,IO 密集型应用能压榨机器 CPU ,减少内存。
    chrisia
        6
    chrisia  
       2024-01-02 17:01:20 +08:00
    千万别用 WebFlux ,代码简直就是地狱,学习成本也是巨高,文档基本都是英文,调试麻烦。唯一的好处是装逼。
    cloud107202
        7
    cloud107202  
       2024-01-02 17:03:48 +08:00   ❤️ 1
    就个人经验,95% 的场景都用途不大,pre-loom 时期 reactive 框架解决的主要是针对 request-per-thread 这种场景造成的线程开销过多问题。

    比如说,你的应用恰好是一个并发请求量偏大的场景,下层又恰好是一个可以异步的东西比如某些云数据商的异步 SDK (而非 block JDBC 为主的调用),使用 webflux 是一个合适的选择。除此之外可以说都不太适合,因为引入这套框架在带来一点线程资源开销的节省之外,会引入代码风格的巨变。这很像在 js 工程写一个 async 函数,会从调用点起在整个调用链路上做一个比较大的“类型污染/风格污染”,下层调用也充斥着 Mono<T> / Flux<T> 的情况,个别场景比如针对自己无法改造的 block API 还需要对线程与调度器更深一层理解,在合适的时候通过 publishOn() 函数切换 Scheduler

    不久的将来 loom 成熟后,reactive 框架唯一的好处就剩下上一段后半段表述的:一套强类型与显示的声明式逻辑处理链路风格。这个见仁见智,在我的经验下全司几乎所有的后端研发都比较反感这一套东西,其中绝大多数人是因为不懂也不想去理解里面的设计思路。可能有一定 FP 经验接触过比如接触过 scala 里面 ZIO/Cat Effect3 那种 effect system 的人会舒适些
    chrisia
        8
    chrisia  
       2024-01-02 17:09:54 +08:00
    在我看来这玩意就不适合后端用,一旦使用了整条链路都要返回 Mono/Flux ,看了好多代码比回调地狱还恐怖,一个 Mono 类里面看看有多少个方法,导致我 IDE 智能提示都卡。这种风格前端倒是可以用用。loom 出来这玩意就没啥用了,反人类的东西。
    chrisia
        9
    chrisia  
       2024-01-02 17:11:24 +08:00
    如果是写网关应用,那 WebFlux 还是有较大的价值。但我为何非要用这套晦涩的东西写网关?
    chrisia
        10
    chrisia  
       2024-01-02 17:13:32 +08:00
    BTW 我选择 kotlin
    BBCCBB
        11
    BBCCBB  
       2024-01-02 17:24:44 +08:00
    放弃这个. 这种玩意儿不是给人用的...
    kuituosi
        12
    kuituosi  
       2024-01-02 17:30:48 +08:00
    主要是网关高并发
    mmdsun
        13
    mmdsun  
       2024-01-02 19:01:03 +08:00 via iPhone
    上家公司全线都是反应式架构设计,连 APP ,前端都是 Rxjava 、Rxjavascript 这种。

    目前做的 OpenAI 相关项目也是用的这个 SpringWebflux ,处理 SSE 流相关的太方便了。个人感觉替代 MVC 不是问题。唯一不足就是对程序员要求较高。(其实这个学学函数式编程就行)
    a3mao
        14
    a3mao  
       2024-01-02 19:08:49 +08:00
    关键是看能力,完全可以替换
    txzh007
        15
    txzh007  
       2024-01-02 19:29:52 +08:00
    函数式编程对人的要求挺高的,自己写个项目练手挺好的.
    dlmy
        16
    dlmy  
       2024-01-02 19:46:10 +08:00
    之前使用 WebFlux + Disruptor 编写了一个 Dispatch 程序,其中存在许多问题,且代码难以调试,导致开发效率很低,因此 WebFlux 是很难替换掉 MVC 的。
    flmn
        17
    flmn  
       2024-01-02 21:35:12 +08:00
    作为行业标准的 Spring 推 WebFlux 这么多年也没用起来不是没有原因的。

    Java 21 出来后,WebFlux 更没有前途了。
    kytrun
        18
    kytrun  
       2024-01-02 21:49:22 +08:00 via Android
    我们在用,小公司,一年开发体验下来只有一个好处:并行调用多个接口比用 CompletableFuture 简洁点
    silentsky
        19
    silentsky  
       2024-01-02 22:00:43 +08:00 via Android
    掌握了响应式编程就没什么难度 一般用下网关
    srx1982
        20
    srx1982  
       2024-01-02 22:02:00 +08:00
    如果你自己玩可以用,在公司千万别用,学习成本高不说,只要业务稍微有点复杂,多访问几个数据源再加点各种计算之类的,维护成本几何级上升
    hdfg159
        21
    hdfg159  
       2024-01-03 08:10:01 +08:00 via iPhone
    学习成本很大,团队很难适应,自己玩玩还行,有其他替代品
    Geekerstar
        22
    Geekerstar  
       2024-01-03 09:30:35 +08:00
    jetlinks 有用这个
    imokkkk
        23
    imokkkk  
       2024-01-03 09:33:23 +08:00
    不太好理解 即使你搞明白了 你的同事们 后续维护这个项目的人 很难保证能看的懂
    shuimugan
        24
    shuimugan  
       2024-01-03 10:17:22 +08:00
    调研过,用了就相当于回到 2017 年之前的 nodejs 还没到 8.0 lts(async/await 进入稳定版)前代码中的回调地狱,当然这个 async/await 也是抄 2012 年.NET Framework 4.5 的。所以一般也就面试问问看看是不是真的有人脑子抽了选型用这个。知道它能干嘛的,确实需要解决问题的,大概率也会换个语言把要做的事情做了。
    java123
        25
    java123  
       2024-01-03 10:52:12 +08:00
    用 Vert.x 或者 Quarkus 吧
    byte10
        26
    byte10  
       2024-01-03 14:44:31 +08:00
    java 21 出来之后 ,它就没啥用了。响应式编程,设计的思想挺有意思的,暂时想不到有啥特别场景非要用它的,以前是为了解决 IO 密集型,现在 loom 虚拟线程出来之后,这需求被替代了。

    如果你的数据库还是同步 IO 的话,那么还是要回到多线程上来😂。

    要玩的话 直接上 vert.x ,可以体验一下。vert.x 非常好玩,而且最新 4.5 版本支持虚拟线程了,任君选择。
    mysunshinedreams
        27
    mysunshinedreams  
       2024-01-03 16:30:08 +08:00
    使用门槛还是挺高的,非核心项目自己拿来练手还是可以的,核心项目维护人员一多,就容易出现失控的局面
    Yzzm
        28
    Yzzm  
       2024-01-03 17:22:26 +08:00
    主要是网关这种不依赖数据库的情况下用一下,业务还是正常的 mvc
    ychost
        29
    ychost  
       323 天前
    实际项目中深度用过 Webflux (后面慢慢用 kotlin 的 Coroutine 重构了),最后还是推荐用 kotlin 的 Coroutine ,项目合作开发,很多人写得 reactor 代码一言难尽,简单的逻辑硬是写了一抹多代码
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1105 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 23:45 · PVG 07:45 · LAX 15:45 · JFK 18:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.