Java 同时调用 5000 个第三方接口并异步返回每个接口的执行结果,如何实现?

2022-09-27 15:39:40 +08:00
 wenbingkun
同时调用 5000 个第三方接口,异步获取每个接口执行结果,有什么好的 Java 实现思路吗?
每个接口的执行时间大概在 5 分钟以上
7271 次点击
所在节点    Java
81 条回复
kubylo
2022-09-27 19:47:15 +08:00
就直接 io 多路复用搞呗,这还需要考虑啥吗
msaionyc
2022-09-27 19:56:49 +08:00
分批做也可以,这种事情也没有要求你必须几分钟内全部做完吧

另外我觉得设备上的更新接口也可以改下,触发之后立即返回,然后就开始更新,等个若干分钟之后再调用一次,如果已经是新版本了就返回已更新就可以了,如果之前失败了或者还没成功就果断时间重试。
zifangsky
2022-09-27 20:54:52 +08:00
典型的分布式处理场景,按机房维度分别部署多个实例处理就行了
janus77
2022-09-27 20:59:21 +08:00
没必要 5000 个同时开始吧?用线程池,哪个执行完了就空出线程再执行一个新的啊
ration
2022-09-27 21:15:47 +08:00
调接口通知服务器更新,通知成功直接返回。服务器上应该监听更新完成的程序。更新完成后回调给另一个记录更新成功的接口。
iseki
2022-09-27 21:30:09 +08:00
异步了也分一下批,免得把机器带宽打满了,还是要传好久才能传完,先把一部分传好从不所有机器都挤牙膏强
yeqizhang
2022-09-27 21:30:54 +08:00
我觉得 27 楼说的对。
我觉得 future task 没啥用吧,task 没执行完,线程也是在排在线程池队列中,直接设置线程池超大的话,内存设置大点就行?
ychost
2022-09-27 22:04:40 +08:00
用 NIO 就好了,比如 WebFlux
lchqfnu
2022-09-27 22:06:58 +08:00
DeferredResult
是不是跟我这个问题类似
https://www.v2ex.com/t/878147
fox0001
2022-09-27 22:23:36 +08:00
如果每台服务器有开始执行的接口,也有接口可以获取执行的状态,包括正在执行、执行成功、执行失败。那就简单了。for 循环一遍所有开始执行的接口,再每隔 1 分钟或 30 秒遍历所有获取结果的接口,直到所有服务器都获取了执行完毕的结果。

如果每台服务器的接口需要等待完成,才能获取结果,就只能是楼上的那些方案了。弄个线程池去逐批执行,或者
@dqzcwxb #28 的方案,或者 Go 协程那些
fanxasy
2022-09-27 22:56:30 +08:00
vertx.io 解君愁
bxb100
2022-09-27 23:36:31 +08:00
没有包袱的建议使用 19 的 virtual thread, 否则就是异步那一套
jones2000
2022-09-27 23:40:28 +08:00
任意一台服务器把下好固件包存盘, 同一个网段的服务器, 先在自己内网找是否有匹配的固件包,有就在这台服务器上下载,没有再去外网调用第 3 放接口下。下完也存盘,供其他服务器下载。
zzxgz
2022-09-28 00:30:01 +08:00
用 ansible 会不会方便点?
lingly02
2022-09-28 00:53:50 +08:00
用 ansible 把固件和更新程序发到 50 台机器上,每台机器负责更新 100 台。这样程序用简单的多线程就搞定了。只是要计算一下瞬时带宽,不要影响正常业务通信
yhvictor
2022-09-28 02:10:30 +08:00
5000 个线程并不会有任何问题,带来的内存开销并不大。
如果 5000 个线程解决不了,nio ,fiber 一样解决不了。
zeni123
2022-09-28 06:13:05 +08:00
可以 5000 个线程 因为同时被阻塞了 调度压力应该不打
jorneyr
2022-09-28 08:23:02 +08:00
@zzxgz Ansible 每个任务都会起一个进程,如果是耗时任务增加 -B -P 实时心跳检测的话每个任务还会多出 2 个进程,5000 个任务这会导致进程风暴吧。
dzdh
2022-09-28 09:06:30 +08:00
难道不是生成批次 ,然后消费批次,然后最终页面通知吗
byte10
2022-09-28 09:19:52 +08:00
@kubylo 你看看评论区就知道要考虑啥,因为没人知道 NIO 呗,只知道多线程。
@Jooooooooo 5000 个不算啥,5w 都不是问题,多路复用就可以了,NIO 。
@Vegetable NIO 就可以了,不一定要协程。

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

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

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

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

© 2021 V2EX