在等待api调用完成时,并行调用N个阻塞api调用以充分利用CPU的最佳方法是什么?

Rah*_*l D 5 java concurrency microservices

我正在开发一种微服务,其操作流程如下:

在此处输入图片说明

请求执行一些任务。经过一些预处理后,我知道我需要执行一些任务,比方说10。现在,这些任务彼此独立,因此可以并行执行。每个任务都有一些处理步骤和一些外部API调用。在完成所有任务后,需要返回合并的结果。

这是一个请求,因此很明显,此微服务也可以并行获得许多这样的请求。

在这里,API调用是最耗时的操作,相对而言,其他工作执行的时间要短得多。因此,我希望以一种可以并行执行许多任务的方式进行设计,因为对于API调用,大多数任务将被阻塞。

我看到的一个简单解决方案是使用一个使用ExecutorService的线程池,但这似乎不是理想的解决方案,因为假设我创建了一个包含32个线程的线程池,并获得60个任务。因此,即使这32个任务被阻止进行api调用并且不占用大量CPU时间,一次也只能执行32个任务。

是否可以在不破坏单个任务的情况下实现?

Eri*_*ric 1

您将必须进行一些基准测试来找出最适合您的设置。您可能想要研究使用ThreadPoolExecutor它可以根据池中可用的线程数量来增加和减少线程数量。您可以在基准测试中调整一些参数,即corePoolSizemaximumPoolSize