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

标签 java concurrency microservices

我正在开发具有以下操作流程的微服务:

enter image description here

一个请求来执行一些任务。经过一些预处理后,我知道我需要执行一些任务,比如 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/

相关文章:

java - 尝试从java访问MySQL,但它不工作

java - android:带有自定义颜色的默认不确定进度条的xml

java - 我的平铺 map 未在 libgdx 中渲染

angular - 无法获取 jhipster 网关主页

java - 相对持久性单元注入(inject)?

c# - 是否有并发无锁阻塞队列的实现?

c++ - 使用 OnDraw() 的 MFC 并发

go - WaitGroup.Wait() 超时

mysql - 微服务中心化数据库模型

spring-boot - Spring Boot + Tomcat - 微服务解决方案