一个聚合接口,如何才能优化时延

2021-10-26 22:18:01 +08:00
 luxinfl
接口逻辑中会调用 6,7 次外部接口查询数据,然后再把结果汇总。现在用的是 parallelStream 来分别调用这几个外部接口,但是效果貌似不太好。还有什么其他方法可以并行调用的?
4369 次点击
所在节点    程序员
30 条回复
pushyzheng
2021-10-26 22:20:18 +08:00
Reactor 挺适合这种场景的
Jooooooooo
2021-10-26 22:21:39 +08:00
并行调用耗时就是最慢的那个接口, 这个角度没啥可优化的点了.
luxinfl
2021-10-26 22:37:43 +08:00
@pushyzheng 有点太复杂了,不太适合吧。我应用场景就是并发调用接口

@Jooooooooo 实现不太一样吧,有时候还会碰到从连接池获取连接超时。。
luxinfl
2021-10-26 22:42:31 +08:00
主要是测试压测有个时延要求,p95 要到 50ms ,但是这个服务需要调用多个外部接口。没什么优化经验。。用了 parallelStream ,增大的连接池的 defaultMaxPerRoute 。效果不是太好,就在想是不是 parallelStream 有什么缺陷
urzz
2021-10-26 22:45:46 +08:00
建议不要用 parallelStream ,ForkJoinPool 是全局共用的。。
luxinfl
2021-10-26 23:09:44 +08:00
@urzz 如果定义那个 ForkJoinPool 有啥问题么
urzz
2021-10-27 01:13:56 +08:00
你如果可以保证没有别人用 parallelStream ,那可以。要不然这种在 parallel 中进行 io 调用的,是可能会导致阻塞的

这种情况下,可以尝试自己定义线程池,然后用 CompletableFuture.supplyAsync ,配合 CompletableFuture.allOf(...).join() 等待线程结束获取结果。建议改完后压一波试试
w7938940
2021-10-27 01:31:51 +08:00
Fibers + Channel
VHacker1989
2021-10-27 08:20:41 +08:00
分布式
aeiou520
2021-10-27 08:58:23 +08:00
CompletableFuture?
siweipancc
2021-10-27 09:01:45 +08:00
多线程加阻塞同步器,怕并发太大可以塞信号量
nl101531
2021-10-27 09:11:24 +08:00
@luxinfl 这个用的是 forkjoin 公共线程池,你系统用的多,就可能排队阻塞
Aliberter
2021-10-27 09:53:22 +08:00
自定义线程池+CountDownLatch ,说到底总耗时还是取决于最慢的那个接口的响应时间。
wolfie
2021-10-27 09:54:26 +08:00
可以自定义 ForkJoinPool

forkJoinPool.execute(e -> {
someList.parallelStream()
})
hingbong
2021-10-27 10:20:16 +08:00
用 parallelStream 都会自定义 ForkJoinPool 吧,问题不大
Vegetable
2021-10-27 10:22:59 +08:00
先做好日志确认一下,确认是否「总用时~=耗时最长的外部服务」,如果是的话,就没什么优化的空间了,如果不是再排查吧,按理说这么做没问题。
Chinsung
2021-10-27 11:09:07 +08:00
查数据就是并发+缓存,没啥别的办法。
8355
2021-10-27 14:26:48 +08:00
除非提前调用直接查 不然并行调用还是会以最慢的接口时间
如果因为网络或者机器位置的关系找运维给你加代理网关会好很多
xiang0818
2021-10-27 15:09:12 +08:00
这个没办法解决的,外部接口的调用时间在于别人服务器对你的响应时间。
night98
2021-10-27 18:30:19 +08:00
提前聚合

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

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

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

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

© 2021 V2EX