Java 目前实现全异步的方式有哪些

2021-07-25 10:20:35 +08:00
 ljzxloaf

除了 callback

7823 次点击
所在节点    Java
48 条回复
ikas
2021-07-25 10:44:27 +08:00
1.各种基于 Reactor 模型的框架 /库
2.内置的 java.util.concurrent.CompletableFuture/或者使用其的框架 /库
passerbytiny
2021-07-25 10:57:48 +08:00
Java 本体的是 Task/Executor/Future 框架,基于线程池,可满足全部异步编程模型,但是编码易用性几乎为零。

三方框架大多都有编码友好的异步编程组件,通常都是基于 Java 本体的那个框架。如果你用 Spring,那么 @Async 就是用来做异步编程的,编码很容易,但是不支持全部异步编程模型。 @Async 的异步方法只能再抛出事件,不能返回 Futute,或者说仅支持 callback 模式,不支持 await 模式。
uselessVisitor
2021-07-25 11:07:20 +08:00
Vert.x
xuqd
2021-07-25 11:16:34 +08:00
JDBC 会比较麻烦,别的还好
golangLover
2021-07-25 11:17:25 +08:00
@passerbytiny 为什么说编码易用性为 0,completablefuture 不好用吗?
passerbytiny
2021-07-25 11:32:35 +08:00
@golangLover 你得手写代码配置执行器 /线程池。此外可以对比下其他语言的异步语法。
sagaxu
2021-07-25 11:40:01 +08:00
JVM 生态上 vertx + kotlin coroutines,丝般顺滑
ljzxloaf
2021-07-25 11:41:12 +08:00
@passerbytiny #2 web 应用哪里用得着 @Async,都是基于 nio 包装个异步接口调用,@Async 本质是线程池,用这个处理 io 肯定是不行的
ljzxloaf
2021-07-25 11:43:32 +08:00
@sagaxu #7 求实战经验,这俩学习成本都不低啊
passerbytiny
2021-07-25 11:47:25 +08:00
@ljzxloaf 你家 Web 应用该不是只有 Web 入口跟 SQL 两层吧。此外,IO 异步跟异步编程是两码事。
1194129822
2021-07-25 11:53:59 +08:00
异步?简单的事情更简单,复杂的事情更复杂,而且总有一个链路要处理背压,如果无数请求都直接传给数据库,系统还有什么稳定性可言。只要涉及到 jdbc,现在 java 中异步也就是个玩具罢了。unix 的哲学就是同步比异步好。全链路异步,不用 jdbc,使用 redis, mogodb 之类(也是 epoll 模拟),只有 win 有 iocp, 而且异步的压力最终也会到 os 和 db 上。
spring 的 reactor,你去看看呗。也就几百个运算符。
ipwx
2021-07-25 12:09:33 +08:00
Actor model 很好用的。不过我不太熟 java,jvm 上只知道一个 akka 。
ljzxloaf
2021-07-25 12:11:05 +08:00
@passerbytiny #10 web 应用不就这两层吗,就是收发数据啊,中间的 get/set 难道还需要分成几个任务去跑?这就没必要了吧?
ikas
2021-07-25 12:25:19 +08:00
哈哈,笑死了..什么是传说中的技术..所谓的难其实就是想要 await 与 async 么
janus77
2021-07-25 12:28:36 +08:00
看看第三方的协程库吧,纯 java 实现,我记得有一些
ljzxloaf
2021-07-25 12:45:57 +08:00
@ikas #14 有啥好笑的。。如果要传说中的技术我谷歌搜下就完事了,就是想知道生产实践中是什么情况。比如什么 ddd 、servicemesh 这些,对我来说就是传说中的技术,因为没在实践中看到过。传说中的技术就是没有生产实践过的技术
Jooooooooo
2021-07-25 13:06:33 +08:00
CompletableFuture 已经很好用啦

什么 A, B 都做完再做 C 用这个写起来已经够便捷了
ccde8259
2021-07-25 13:44:18 +08:00
目前生产实践用的是线程池挂 Job,然后 CountDownLatch 回来,可惜不按代码行数发工资。
进一步就是用 JUC 下的 CF,但是写起来还是有点难受,因为需要把大量同步代码封装成返回 CF 的调用。
再进一步就是 Vert.x 的 Future,版本到 4.0 几乎所有 API 都支持 Future 返回。then 等链式调用对于 Callback Hell 有所缓解。
妥协之选就是 Quarkus 。Route Layer 往下都是 Vert.x 实现,往上则是 RESTEasy 的 JAX-RS 实现。IO Thread 跟 Work Thread 分开,实现 IO 异步业务同步。
Project Loom 都不知道延期了多久,能不能赶得上 JDK17 这个 LTS……毕竟最终目标是写同步代码用异步执行。
sagaxu
2021-07-25 13:48:29 +08:00
@ljzxloaf 学习成本也还好,vertx 就是 jvm 版的 nodejs,用起来姿势差不多。kotlin coroutine 花一天了解一下 suspend 和 dispatcher,正常使用没问题了。两者的粘合,vertx 官方有专门的支持,vertx 4.0 之后基本是无缝的了。但跟 spring 粘合使用的时候,就有点儿脏了,spring 注入的是单例,而 vertx 讲究的是不要跨 context,一般同 verticle 内办事,跨 verticle 得走 rpc 。
VHacker1989
2021-07-25 13:49:56 +08:00
reactor 和 rxjava 都实现了 reactivex,rxjava 兼容性好,能在 Android 上跑,但后端生态肯定 reactor 好,从数据库层的 r2dbc,web 层 webflux,不少 rpc,消息队列,http client 都支持 reactor,真正的全链路响应式

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/791594

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX