3

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

 2 years ago
source link: https://www.v2ex.com/t/810773
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

V2EX  ›  程序员

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

  luxinfl · 1 天前 · 2471 次点击
接口逻辑中会调用 6,7 次外部接口查询数据,然后再把结果汇总。现在用的是 parallelStream 来分别调用这几个外部接口,但是效果貌似不太好。还有什么其他方法可以并行调用的?
22 条回复    2021-10-27 19:25:10 +08:00

pushyzheng

pushyzheng   1 天前

Reactor 挺适合这种场景的

Jooooooooo

Jooooooooo   1 天前

并行调用耗时就是最慢的那个接口, 这个角度没啥可优化的点了.

luxinfl

luxinfl   1 天前

@pushyzheng 有点太复杂了,不太适合吧。我应用场景就是并发调用接口

@Jooooooooo 实现不太一样吧,有时候还会碰到从连接池获取连接超时。。

luxinfl

luxinfl   1 天前

主要是测试压测有个时延要求,p95 要到 50ms ,但是这个服务需要调用多个外部接口。没什么优化经验。。用了 parallelStream ,增大的连接池的 defaultMaxPerRoute 。效果不是太好,就在想是不是 parallelStream 有什么缺陷

urzz

urzz   1 天前

建议不要用 parallelStream ,ForkJoinPool 是全局共用的。。

luxinfl

luxinfl   1 天前

@urzz 如果定义那个 ForkJoinPool 有啥问题么

urzz

urzz   1 天前

你如果可以保证没有别人用 parallelStream ,那可以。要不然这种在 parallel 中进行 io 调用的,是可能会导致阻塞的

这种情况下,可以尝试自己定义线程池,然后用 CompletableFuture.supplyAsync ,配合 CompletableFuture.allOf(...).join() 等待线程结束获取结果。建议改完后压一波试试

w7938940

w7938940   1 天前

Fibers + Channel

VHacker1989

VHacker1989   18 小时 57 分钟前 via Android

aeiou520

aeiou520   18 小时 20 分钟前

CompletableFuture?

siweipancc

siweipancc   18 小时 16 分钟前 via iPhone

多线程加阻塞同步器,怕并发太大可以塞信号量

nl101531

nl101531   18 小时 7 分钟前 via iPhone

@luxinfl 这个用的是 forkjoin 公共线程池,你系统用的多,就可能排队阻塞

Aliberter

Aliberter   17 小时 25 分钟前

自定义线程池+CountDownLatch ,说到底总耗时还是取决于最慢的那个接口的响应时间。

wolfie

wolfie   17 小时 24 分钟前

可以自定义 ForkJoinPool

forkJoinPool.execute(e -> {
someList.parallelStream()
})

hingbong

hingbong   16 小时 58 分钟前

用 parallelStream 都会自定义 ForkJoinPool 吧,问题不大

Vegetable

Vegetable   16 小时 55 分钟前

先做好日志确认一下,确认是否「总用时~=耗时最长的外部服务」,如果是的话,就没什么优化的空间了,如果不是再排查吧,按理说这么做没问题。

Chinsung

Chinsung   16 小时 9 分钟前

查数据就是并发+缓存,没啥别的办法。

8355

8355   12 小时 51 分钟前

除非提前调用直接查 不然并行调用还是会以最慢的接口时间
如果因为网络或者机器位置的关系找运维给你加代理网关会好很多

xiang0818

xiang0818   12 小时 9 分钟前

这个没办法解决的,外部接口的调用时间在于别人服务器对你的响应时间。

night98

night98   8 小时 48 分钟前

WispZhan

WispZhan   8 小时 7 分钟前

最直接的解 CompletableFuture ,这玩意写起来贼恶心。
比较优雅的解 Kotlin 协程

makdon

makdon   7 小时 53 分钟前

无解,就算你的六七个接口都没有互相依赖,全并行一起请求外部,
访问外部来回 rtt 也是要耗时的,外部接口再稍微慢一点你的 p95 就到不了 50ms 了
除非把机房搬外部接口提供方机房旁边,不然跨一下地域轻轻松松就过 50ms 了,不过你这个 case 还有 6 ,7 次外部接口,也不知道是不是同一个提供商,不是的话机房都搬不动了

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

北京到上海:38ms
上海到广州:40ms
北京到广州:53ms

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK