簡體   English   中英

Resilience4j:將 Bulkhead 與 TimeLimiter 相結合,用於來自 Tomcat 的同步外部系統調用

[英]Resilience4j: Combine Bulkhead with TimeLimiter for a synchronous external system call from Tomcat

我有一個在 Tomcat 服務器中運行的 Web 應用程序,它執行對外部服務器的調用。 現在,我想使用 Resilience4j 的TimeLimiterTimeLimiter響應的等待時間,另外還有一個Bulkhead來限制對外部服務器的並行調用量。

我不需要對外部系統的異步調用,因為無論如何 Tomcat 線程都必須等待響應或超時。

在這種情況下,結合TimeLimiterBulkhead的最佳方法是什么? 我是否需要SemaphoreBulkheadThreadPoolBulkhead以及如何將外部系統調用包裝在TimeLimiter所需的Future中?

您不能將 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM