我正在开发具有以下操作流程的微服务:
一个请求来执行一些任务。经过一些预处理后,我知道我需要执行一些任务,比如 10 个。现在任务彼此独立,因此可以并行执行。每个任务都有一些处理步骤和一些外部 API 调用。在所有任务完成后,需要返回组合结果。
这是一个请求,所以显然这个微服务也可以并行处理许多这样的请求。
这里的 API 调用是最耗时的操作,其他工作的执行时间相对较少。所以我想以一种可以并行执行尽可能多的任务的方式来设计它,因为对于 API 调用来说,大多数任务都会被阻止。
我看到的一个简单解决方案是使用一个使用 ExecutorService 的线程池,但这似乎不是一个理想的解决方案,因为假设我创建了一个包含 32 个线程的线程池,并且我得到了 60 个任务。因此,即使这 32 个任务因 api 调用而被阻止并且没有使用太多 CPU 时间,但一次只会执行 32 个任务。
这是否可以在不破坏单个单元任务的情况下实现?
最佳答案
最佳线程数取决于服务器拥有的核心数和 I/O 工作负载所花费的时间。参见 http://baddotrobot.com/blog/2013/06/01/optimum-number-of-threads/计算那个。
简而言之,它指出:threads = number of cores * (1 + wait time / service time)
时间必须来自您的观察和测量。
对于其余部分,您可以使用 CompletableFuture
如评论中所述,或者您可以使用 Executors
类别:Executors.newFixedThreadPool(<num of threads>);
关于java - 在等待 api 调用完成时并行调用 N 阻塞 api 调用以充分利用 CPU 的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56039251/