java - 并行运行多个 HystrixCommand 的最佳方式

标签 java future hystrix

我有一个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() call 不会阻塞某些命令并延迟其他命令?

我问这个问题是因为我找不到任何相关文档。

<小时/>

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

最佳答案

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

<小时/>

我的初始代码是正确的:

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

关于java - 并行运行多个 HystrixCommand 的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57422476/

相关文章:

java - 如何访问 hystrix 仪表板?

spring-cloud - 我们可以在@FeignClient 的 fallback 或 fallbackFactory 中抛出异常吗

java - Hystrix 线程池属性

java - Spring - beans 生命周期

java - 你能让 JSP 在未声明的变量上崩溃吗?

java - 使用 KeyListener 更改字符串背景并在释放按键时将其设置回来 |类型 导师计划

java - 一旦对 Settable Future 对象调用 setException 方法,会发生什么?

c++ - 将工作项添加到数组或列表的非阻塞方式

java - 连接到另一个类时 AWT-EventQueue-0 java.lang.NullPointerException

vector - 试图在Rc <RefCell <... >>内部修改 future Vec