Java 中并发请求多个接口怎样才能效率最高呢?

2020-03-26 15:38:34 +08:00
 noble4cc

在 Java 中并发的请求多个接口,把请求来的数据做个聚合然后返回,如果是调用了 api1 然后再调用 api2 再调用 api3,这种方式可能大多数时间都在网络 IO 上了,而且随着接口的变多性能不断下降 如果是在 go 中直接用协成就可以了,请求五个 api 和请求一个 api 耗时可能差不多(前提 api 平均耗时都一样)

java 中该如何编写代码呢?使用线程池的话肯定提高效率有限,因为线程不是协成,数量不会太多,并发量大了都在线程池里排队了

使用 NIO httpclient 可能效果好些,但是都必须写 callback,怎么判断所有的 api 都把结果成功返回了,然后我们要聚合接口,callback 写起来有些难受

java 中这种场景应该很多见,一般会怎么处理呢?

8980 次点击
所在节点    Java
43 条回复
guyeu
2020-03-26 16:23:43 +08:00
线程池+CompletableFuture+聚合操作
pursuer
2020-03-26 16:26:16 +08:00
使用 Kotlin,C#的 async await,使用 Java Promise 库自己封装或者等待 Project Loom
guyeu
2020-03-26 16:28:15 +08:00
CompletableFuture 自带一个线程池,自己写的话可能比协程别扭一点,但是效率差不多
xuanbg
2020-03-26 17:12:44 +08:00
其实还是前端直接调各个接口拿数据效率高,前端 JS 天然就是异步模式的。
coer
2020-03-26 18:01:21 +08:00
callback+CompletableFuture ?
jamlee
2020-03-26 18:14:02 +08:00
RxJava 比较适合这种事情吧
areless
2020-03-26 18:22:13 +08:00
nginx lua 抗下大半
Artiano
2020-03-26 18:29:22 +08:00
RxJava zip,用 Kotlin async/await 特别爽
123444a
2020-03-26 18:32:59 +08:00
肯定是 callback 丫大哥,多线程不需要加锁
123444a
2020-03-26 18:48:48 +08:00
callback 都是在 io 线程的,然后唤醒工作线程在工作线程判断收完 response 没,然后记得设置超时也要 callback
CoderGeek
2020-03-26 18:52:48 +08:00
Future rx
araaaa
2020-03-26 18:53:18 +08:00
rxjava spring reactor
th00000
2020-03-26 18:55:30 +08:00
异步可解
xhinliang
2020-03-26 18:57:23 +08:00
CountDownLatch
gz911122
2020-03-26 19:00:24 +08:00
rxjava 了解一下

或者 kotlin 协程
Kipp
2020-03-26 19:10:43 +08:00
最近也同样遇到这个问题 mark
yeqizhang
2020-03-26 21:50:16 +08:00
futuretask 短板是时间最长的那个接口
liuliuluk
2020-03-26 21:53:16 +08:00
以往项目中是用 Future,mark 一下 JDK8 新特性
micean
2020-03-26 22:07:37 +08:00
java 的 vertx 可以这么用

CompositeFuture.all(请求 1,请求 2...)
.compose(结果集 -> 处理结果集,返回最终结果)
.setHandler(成功时的处理最终结果,至少一项请求失败时处理异常)

和 java 自带的 CompletableFuture 相比,只用了 1 个线程,无阻塞。
mosliu
2020-03-26 23:54:10 +08:00
jdk8
CompletableFuture allof

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

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

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

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

© 2021 V2EX