【问题标题】:Resilience4j: Combine Bulkhead with TimeLimiter for a synchronous external system call from TomcatResilience4j:将 Bulkhead 与 TimeLimiter 相结合,以实现来自 Tomcat 的同步外部系统调用
【发布时间】:2020-01-30 22:36:35
【问题描述】:

我有一个在 Tomcat 服务器中运行的 Web 应用程序,它执行对外部服务器的调用。 现在,我想使用 Resilience4j 的 TimeLimiter 来限制响应的等待时间,另外使用 Bulkhead 来限制对外部服务器的并行调用量。

我不需要异步调用外部系统,因为 Tomcat 线程必须等待响应或超时。

在这种情况下结合TimeLimiterBulkhead 的最佳方式是什么?我是否需要SemaphoreBulkheadThreadPoolBulkhead?如何将我的外部系统调用包装在Future 中,这是TimeLimiter 所需的?

【问题讨论】:

    标签: java resilience4j


    【解决方案1】:

    您不能将 SemaphoreBulkhead 和 TimeLimiter 结合使用,因为如果 TimeLimiter 正在运行同一线程,则它无法停止任务的执行。

    因此,您只能组合 TimeLimiter 和 ThreadPoolBulkhead。但只有当你想要一个非阻塞/异步代码而不阻塞你的线程时才有意义。

    如果你想阻塞代码,你可以使用:

    CompletableFuture.supplyAsync(() -> service.method()).get(1, TimeUnit.SECONDS);
    

    如果您想要非阻塞代码并且可以使用 Java9 或更高版本,您可以这样做:

    CompletableFuture.supplyAsync(() -> service.method()).orTimeout(1, TimeUnit.SECONDS);
    

    新的orTimeout 运算符与 Resilience4j TimeLimiter 相当。

    如果你必须使用 Java8 并且想使用 Resilience4j,那就这样做

    ThreadPoolBulkhead bulkhead = ThreadPoolBulkhead.ofDefaults("sample");
    TimeLimiter timeLimiter = TimeLimiter.of(Duration.ofSeconds(1));
    
    ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(3);
    CompletableFuture<String> future = timeLimiter
        .executeCompletionStage(scheduler, 
            bulkhead.decorateSupplier(() -> service.method())).toCompletableFuture();
    

    TimeLimiter 允许使用您自己的 ScheduledExecutorService,而新的 orTimeout 运算符则不允许。

    我建议阅读这篇博文 -> http://iteratrlearning.com/java9/2016/09/13/java9-timeouts-completablefutures.html

    【讨论】:

      猜你喜欢
      • 2020-09-23
      • 1970-01-01
      • 2021-06-23
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      • 2017-07-27
      • 1970-01-01
      • 2021-11-24
      相关资源
      最近更新 更多