【问题标题】:Best way to run multiple HystrixCommand in parallel并行运行多个 HystrixCommand 的最佳方法
【发布时间】:2019-12-16 17:57:15
【问题描述】:

我有一个List<HystrixCommand<?>>> commands,执行这些命令并收集结果以使命令并行运行的最佳方法是什么?


我尝试过这样的事情:

List<Future<?>> futures = commands.stream()
    .map(HystrixCommand::queue)
    .collect(Collectors.toList());

List<?> results = futures.stream()
    .map(Future::get)
    .collect(Collectors.toList());

这是否并行运行命令?

即在同一线程上调用HystrixCommand.queue() 后跟Future.get() 时,.get() 调用不会阻塞某些命令并延迟其他命令?

我问是因为我找不到任何文档。


我也看过HystrixCollapser,但这仍然需要在createCommand 方法中创建和运行各个命令(如上)。

【问题讨论】:

    标签: java future hystrix


    【解决方案1】:

    好的,我已经对此进行了调查并弄清楚了...通过创建一些简单的示例而不是调试生产代码...


    我的初始代码是正确的:

    List<Request> requests = ...; // some expensive requests
    List<HystrixCommand<?>>> commands = getCommands(requests);
    
    List<Future<?>> futures = commands.stream()
        .map(HystrixCommand::queue)
        .collect(Collectors.toList());
    
    List<?> results = futures.stream()
        .map(Future::get)
        .collect(Collectors.toList());
    

    这些命令确实是并行运行的。

    .get() 方法确实阻塞,但由于所有命令都已排队(在任何 .get() 调用之前)它们都在运行(或排队运行)。

    假设第二个命令比第一个命令完成得更快。第一个.get() 将阻塞,但当它最终返回时,第二个.get() 调用将立即返回,因为第二个命令能够在第一个命令阻塞时完成。 (假设核心尺寸 >=2。)


    关于HystrixCollapser,我误解了API。 HystrixCollapser 用于将许多 HystrixCollapser 实例组合成一个 HystrixCommand,而不是相反。所以我不得不修改我的代码以用HystrixCollapser而不是HystrixCommand来包装我的请求:

    List<Request> requests = ...; // some expensive requests
    List<HystrixCollapser<?>>> commands = getCommands(requests);
    
    HystrixRequestContext context = HystrixRequestContext.initializeContext();
    try {
        List<Future<?>> futures = commands.stream()
          .map(HystrixCollapser::queue)
          .collect(Collectors.toList());
    
        List<?> results = futures.stream()
          .map(Future::get)
          .collect(Collectors.toList());
    } finally {
      context.shutdown();
    }
    

    JMH benchmarks and full example source here

    【讨论】:

      猜你喜欢
      • 2015-09-21
      • 1970-01-01
      • 2013-04-20
      • 2018-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-20
      相关资源
      最近更新 更多