loom 在 quarkus 中的基本应用 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yazinnnn
V2EX    Java

loom 在 quarkus 中的基本应用

  •  
  •   yazinnnn 2022-09-14 20:48:04 +08:00 2938 次点击
    这是一个创建于 1211 天前的主题,其中的信息可能已经有所发展或是发生改变。

    https://www.youtube.com/watch?v=514Ub0jNiII&ab_channel=Quarkusio

    前几天 Quarkus Insights 做了一场关于 loom 的应用

    p>有兴趣的朋友可以看一下(我没看完)

    看他们展示的 ppt 简单总结一下

    https://drive.google.com/file/d/1tcb4uX-UdssdPQeVRIftPl4cfQO8RYs1/view

    • Blocking 模型无法使用虚拟线程(简称纤程),因为 jdbc 会 pin 住 worker 线程
    • Reacitve 模型可以使用纤程,吞吐有所提升,同时保持比较简单的编程模型
    • 纤程模型 memory usage 比 reactive 和 blocking 都高
    • 纤程跑在 eventloop 线程会导致死锁
    • 纤程模型保持了简单模型,高并发(逊于 reactive),但是失去了高效

    此刻的感觉是 loom 目前实用度尚不及 kotlin 协程(虽然两者并不在同一条赛道上),毕竟都是 await

    但是 kotlin 因为是 cps 变换,所以保持了 reactive 的高性能及高效,也保持了简单模型

    不过 kotlin 也有引入新语言及方法染色的问题

    12 条回复    2022-10-03 21:53:06 +08:00
    TWorldIsNButThis
        1
    TWorldIsNButThis  
       2022-09-14 22:18:29 +08:00
    kotlin 无栈协程性能稍高于 loom ,其他地方看到的 bench 也是这个结论
    WispZhan
        2
    WispZhan  
       2022-09-14 23:20:11 +08:00
    如果项目里用到了 Reactive ,那么目前还是 Kotlin 胜了。

    ---

    最近把 Spring 项目迁移 Quarkus 的尝试失败了,晚点再看看,先收藏了。
    Jirajine
        3
    Jirajine  
       2022-09-14 23:39:23 +08:00
    纤程是啥,fiber 吗?为啥要用这么奇怪的生造词。
    NXzCH8fP20468ML5
        4
    NXzCH8fP20468ML5  
       2022-09-14 23:54:17 +08:00
    @Jirajine fiber 的说法来自 ruby ? ruby 的协程类就叫 Fiber
    反正就是协程各种变体呗。
    mind3x
        5
    mind3x  
       2022-09-14 23:56:11 +08:00
    @Jirajine 就是 fiber ,很早就这么叫了。20 年前 Win32 SDK 里就有 https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-createfiber ,当然 Win32 的 fiber 比较原始,需要用户代码自己主动 yield 。
    Jirajine
        6
    Jirajine  
       2022-09-15 00:01:35 +08:00
    @xxfye @mind3x 那就直接叫 fiber 啊,“纤程”这个译名,我还是第一次见。
    yazinnnn
        7
    yazinnnn  
    OP
       2022-09-15 06:08:33 +08:00 via Android
    @Jirajine jvm 以前有 fiber 实现,貌似是脸书做的
    loom 官方也自称纤程
    Project Loom: Fibers and Continuations for the Java Virtual Machine

    https://cr.openjdk.java.net/~rpressler/loom/Loom-Proposal.html
    zhangxzh
        8
    zhangxzh  
       2022-09-15 09:09:24 +08:00 via Android
    只支持阻塞式数据交互的一众数据库们一直在阻碍这些新技术的实用
    mind3x
        9
    mind3x  
       2022-09-15 14:00:11 +08:00 via Android
    @Jirajine 20 年前的书就这么译了
    guyeu
        10
    guyeu  
       2022-09-15 21:35:50 +08:00
    略看了一下,整理如下,欢迎指正

    编译阶段,Quarkus 分析代码,识别以下注解:
    - @RunOnVirtualThread
    - @Blocking
    - @NonBlocking

    `Virtual Thread`是 Java 的一种数据结构,和操作系统的线程没有对应关系。

    对于`@RunOnVirtualThrad`或`@Blocking`或`Reactive`类型的返回值,在执行到这个方法时,这个方法会向`Virtual Thread`注册一个`run()`操作,这个方法会被称为`Poller`的线程调度执行,这个过程中会转存(`park`)线程上下文(堆栈、ThreadLocal ),遇到阻塞逻辑时,`Virtual Thread`会`Pinned`,但不影响实际执行逻辑的线程,方法执行结束(阻塞逻辑完成)时,`Poller`会通过`unpark`操作把逻辑调度回`Carrier Thread`。

    对于`@Blocking`或者`Imperative`类型的返回值,这个方法会正常在`Workder`线程执行。


    **NEVER BLOCK THE EVENT LOOP**
    `Carrier Thread`也是一种`Event Loop`,阻塞`Event Loop`和阻塞`Reactive`模型的`Event Loop`会导致同样的后果(**Crash**)。

    ### 基准测试

    - 响应时间(阻塞模型的响应时间在 1000 并发时超过 5s ,virtual_thread 在 1200 并发时超过 5s ,reactive 模型在 1500 附近超过 5s )
    - 低并发(<1000 )时:reactive = virtual_thread > blocking
    - 中并发( 1000~1800 )时:reactive > virtual_thread > blocking
    - 高并发(>1800 )时:reactive > virtual_thread > blocking
    - 吞吐量
    - 低并发(<1000 )时:blocking = reactive = virtual_thread
    - 中并发( 1000~1800 )时:reactive = virtual_thread >> blocking
    - 高兵伐(>1800 )时:reactive virtual_thread >> blocking

    整体上数据远远优于阻塞模型,但略差于 reactive 模型,在响应时间上的差距比较明显。
    fox0001
        11
    fox0001  
       2022-10-03 21:16:13 +08:00
    看到很多文章一致唱好这个虚拟线程。看来生产使用仍有待验证、优化。
    fox0001
        12
    fox0001  
       2022-10-03 21:53:06 +08:00
    @Jirajine #3
    @xxfye #4
    @mind3x #5

    查了下,貌似官方正式定名为虚拟线程,即 virtual threads 。

    https://openjdk.org/jeps/425
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     4083 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 33ms UTC 10:15 PVG 18:15 LAX 02:15 JFK 05:15
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86