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

2022-09-27 15:39:40 +08:00
 wenbingkun
同时调用 5000 个第三方接口,异步获取每个接口执行结果,有什么好的 Java 实现思路吗?
每个接口的执行时间大概在 5 分钟以上
7241 次点击
所在节点    Java
81 条回复
allenzhangSB
2022-09-27 16:40:28 +08:00
你这是拿面试题来问的吧
liuymf
2022-09-27 16:41:22 +08:00
@angryfish 瞎猜是爬虫....
wenbingkun
2022-09-27 16:46:53 +08:00
@v2eb
@angryfish
@allenzhangSB
@liuymf 详细需求已附言
superchijinpeng
2022-09-27 16:48:16 +08:00
建议滚动更新
abc0123xyz
2022-09-27 16:49:27 +08:00
moshiyeap100
2022-09-27 16:49:41 +08:00
CompletableFuture 异步线程池,最后汇总下执行结果。
liuymf
2022-09-27 17:04:00 +08:00
@wenbingkun

1.把个更新服务单独出去部署; (避免批量调用的时候影响其它服务)
2.时效性要求不是很严格的话 慢慢调试找出一个合理的调用数量; 比如一次 100 个 慢慢循环
3.时效性要求搞的话; 集群: 10 台 每台 500 个
dqzcwxb
2022-09-27 17:07:52 +08:00
CompletableFuture+自定义 ForkJoinPool
Kasumi20
2022-09-27 17:14:56 +08:00
lock set status(id, statu)
lock get status(id, statu)

for 1..5000 {
thread {
set status(id, false)
await call api
set status(id, true)
}
}
registerrr
2022-09-27 17:17:39 +08:00
搞个队列吧,5000 个一起上,虽然可能也能行,但总是觉得有点莽
allenzhangSB
2022-09-27 17:24:03 +08:00
这附言中的需求, 感觉更适合客户端定时扫接口判断是否需要更新固件, 然后更新后上报, 也可以用消息广播,
即使是服务端调用过去, 也不需要阻塞 5 分钟, 设计成通知机制, 通知需要更新固件, 然后更新结果上报(或者服务端定时调接口获取更新结果)
Morii
2022-09-27 17:37:20 +08:00
为什么不是

监听 + 广播 + 结果上报?
wanacry
2022-09-27 17:41:30 +08:00
内存会不会爆
jorneyr
2022-09-27 18:14:22 +08:00
Go 的协程做这个比 Java 的线程更合适,或者升级到 Java 19 也支持虚拟线程了,性能提高很多。
jorneyr
2022-09-27 18:15:52 +08:00
@registerrr 搞个队列吧,5000 个一起上,虽然可能也能行,但总是觉得有点莽。
感觉队列好像也不太好,楼主说每个接口的执行时间大概是 5 分钟,队列只能保证并发量,这样会导致总的运行时间非常长。
treblex
2022-09-27 18:36:19 +08:00
a 通知 b 开始更新
5 分钟后
b 通知 a 更新结果

类似订单系统里那个回调流程
darkengine
2022-09-27 19:12:29 +08:00
我建议换个思路。下发固件下载地址和固件的 md5 让设备自己下载,校验 MD5 之后自行更新,这样还能用上 CDN 。
sutra
2022-09-27 19:17:34 +08:00
“同时”是怎么一个定义。
能否查询更新状态。

使用生产者消费者模式,把这些 tasks 摊平,让消费者去执行更新和查询状态。
CnpPt
2022-09-27 19:24:25 +08:00
看出来回复里大多数人都没接触过 BMC ,我管理过 500+物理机,这是切实的需求,但是频次很低,我选择拆分主机,同时更新少量主机,战线拉长
MrKrabs
2022-09-27 19:27:23 +08:00
开 5000 个线程,有问题再说

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

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

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

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

© 2021 V2EX