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

2021-10-26 22:18:01 +08:00
 luxinfl
接口逻辑中会调用 6,7 次外部接口查询数据,然后再把结果汇总。现在用的是 parallelStream 来分别调用这几个外部接口,但是效果貌似不太好。还有什么其他方法可以并行调用的?
4588 次点击
所在节点    程序员
30 条回复
WispZhan
2021-10-27 19:10:53 +08:00
最直接的解 CompletableFuture ,这玩意写起来贼恶心。
比较优雅的解 Kotlin 协程
makdon
2021-10-27 19:25:10 +08:00
无解,就算你的六七个接口都没有互相依赖,全并行一起请求外部,
访问外部来回 rtt 也是要耗时的,外部接口再稍微慢一点你的 p95 就到不了 50ms 了
除非把机房搬外部接口提供方机房旁边,不然跨一下地域轻轻松松就过 50ms 了,不过你这个 case 还有 6 ,7 次外部接口,也不知道是不是同一个提供商,不是的话机房都搬不动了

随便搜了一下时延的经验值
腾讯云:

北京到上海:38ms
上海到广州:40ms
北京到广州:53ms
az402
2021-10-28 09:06:36 +08:00
<groupId>com.jd.platform</groupId>
<artifactId>asyncTool</artifactId>
<version>1.4.1-SNAPSHOT</version>

可以看一下这个,前段无意中发现的。
还没仔细看,貌似不错。
jorneyr
2021-10-28 11:27:02 +08:00
CompletionService 或者 CompletableFuture 挺好用的,还可以自己传入 ThreadPoolExecutor
snappyone
2021-10-28 13:35:19 +08:00
p95 要到 50ms , 你先确定下你依赖的那几个接口能到这个速度吗
luxinfl
2021-10-28 21:32:45 +08:00
@hingbong 项目里面真的好多 paralleStream 都没有自定义线程池。每个 parallel 都自定义一个是不是不太好
@Vegetable 奇怪的是,每个并发流时间都不高,但是最终却很高,怀疑是用了共享线程池的缘故
@WispZhan @aeiou520 @urzz 我用的 CompletableFuture 然后自定义线程池,但是用了 get()方法,感觉就和 Future 差不多的样子
urzz
2021-10-28 23:35:58 +08:00
@luxinfl #26 原理是差不多的,都是异步同时请求接口,而不是串行。只不过这种方式可以将任务丢进线程池,而不是每次 new 线程跑。
不过这种方式是否能满足你需求也是母鸡的。。毕竟这种聚合接口的耗时要看你依赖接口的
billly
2021-10-29 09:25:42 +08:00
之前看过 linkedin/parseq ,看起来还行,没用过
luxinfl
2021-10-29 09:43:23 +08:00
@billly 现在改用 CompletableFuture 试试会不会好,实际用起来,感觉并发流不太好。
KuroNekoFan
2021-10-29 10:31:04 +08:00
试试 nodejs(

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

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

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

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

© 2021 V2EX