Spring Boot 当数据集或负载增加时,CompleteableFuture需要更长的时间

xxls0lw8  于 2023-01-30  发布在  Spring
关注(0)|答案(1)|浏览(154)

我有一个需求,我需要为100个用户调用2个API。第一个API是一个oauth API,用于生成令牌,需要2秒,第二个调用是使用生成的令牌调用实际API,需要8-9秒。因此,总的来说,为一个用户处理两个API需要大约10秒。
我已经写了下面的代码片段使用CompleteableFuture逻辑来实现并行执行的目标,总运行时间为100个用户将大约等于10-15秒。
如果只有10个用户,则呼叫的总时间为11秒(一个用户所需的时间为10秒)。
对于20个用户,总时间为25秒((一个用户花费的时间为10秒)。
然而,如果有100个用户(满负荷),呼叫所有100个用户的总时间约为100秒(呼叫一个用户的时间仍然只有10秒)
我的问题是,尽管调用是以并行模式进行的,但为什么总时间会增加?
有什么方法可以改进这个时间吗?我希望100个用户的时间少于30秒。

Executor executor = Executors.newFixedThreadPool(100);

List<CompleteableFutures<listA>> futures = userlist.stream.map(req->CompleteableFuture.supplyAsync(()-> methodToCallBothApis(reg.getUserId(),executor))).collect(Collectors.toList());

List<listC> outputList = futures.stream.map(CompleteableFuture::join).collect(Collectors.toList());
gwo2fgha

gwo2fgha1#

所有的调用不是并行发生的。可完成的未来使代码异步,即主线程不等待结果可用。然而,并行性取决于你有多少CPU内核,网络带宽等。
在您的情况下,您正在进行100个网络调用,这些调用将以异步方式进行,但不一定以并行方式进行。因此,您可能看不到您希望的速度。

相关问题