【问题标题】:Suggestion : Making parallel call from my service to another micro service建议:从我的服务并行调用另一个微服务
【发布时间】:2020-02-07 11:49:43
【问题描述】:

我有如下要求

  • 根据特定条件进行数据库调用并获取结果列表
  • 对于列表中的每条记录,对微服务进行 GET api 调用
  • 整合微服务的所有结果并给出响应

我想让第二步平行。现在我根据数据知道列表中不会出现超过 15 条记录。所以我想到了为此使用 executorservice。

Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors())

现在我不是很自信

  1. 使用ExecutorService 是我的方案的最佳方法。或者我应该使用别的东西
  2. 我应该创建一个像Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()) 这样的新执行器还是让容器使用@Autowired 注入一个托管执行器

【问题讨论】:

  • 当你说'创建一个像...这样的新执行器'时,你的意思是inline,还是在某些类构造函数等? ExecutorService 无疑是并行处理此类事情的合理方式。一个(可能)更好的选择(如果可能的话)是修改微服务以能够处理这样的批处理查询(多部分或类似)并让 that 处理线程要求(然后改为两个服务中最多有 15 个线程来处理这个问题,只有其中一个需要它)。
  • @user2478398 我正在创建内联。在我将对另一个微服务进行服务调用的方法中

标签: java spring spring-boot executorservice executor


【解决方案1】:

由于您有 List 的记录,您可以使用 parallelStream 对其进行迭代。

List<SomeObject> objectList = resultFromDB();
objectList.parallelStream()
          .map(obj -> makeApiCallInParallel(obj))
          .collect(Collectors.toList());

parallelStream 将并行执行 API 调用。并行调用的数量受 CPU 的线程数限制。

您可以使用 JVM 属性来增加它:

-Djava.util.concurrent.ForkJoinPool.common.parallelism=20

【讨论】:

    猜你喜欢
    • 2020-04-27
    • 2018-03-04
    • 1970-01-01
    • 1970-01-01
    • 2018-12-27
    • 2021-03-17
    • 2020-03-18
    • 1970-01-01
    • 2021-05-24
    相关资源
    最近更新 更多