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

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

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

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

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

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

8985 次点击
所在节点   Java  Java
43 条回复
RRRSSS
RRRSSS
2020-04-08 19:51:03 +08:00
Completable<Void> f = CompletableFuture.allOf(task1, task2, task3); // 这里注意要使用线程池
f.get(); // 这里消耗的时间是 task1 、task2 、task3 的最大值

Stream.of(future1, future2, future3).forEach(dd -> dd.thenAccept(e -> {
// 处理数据
}));
guisheng
guisheng
2020-05-23 15:41:14 +08:00
楼主最后使用了什么方式呢?我目前采用的是 spring webclient 的 Mono.zip 来组合请求发送。
noble4cc
noble4cc
2020-05-23 16:39:23 +08:00
@guisheng NIO 的 httpclient+队列吧,编写起来也不太麻烦,毕竟不是 golang

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

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

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

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

© 2021 V2EX