[英]resilience4j bulkhead skipping fallback method for certain type of exceptions
[英]Resilience4j: Combine Bulkhead with TimeLimiter for a synchronous external system call from Tomcat
我有一個在 Tomcat 服務器中運行的 Web 應用程序,它執行對外部服務器的調用。 現在,我想使用 Resilience4j 的TimeLimiter
來TimeLimiter
響應的等待時間,另外還有一個Bulkhead
來限制對外部服務器的並行調用量。
我不需要對外部系統的異步調用,因為無論如何 Tomcat 線程都必須等待響應或超時。
在這種情況下,結合TimeLimiter
和Bulkhead
的最佳方法是什么? 我是否需要SemaphoreBulkhead
或ThreadPoolBulkhead
以及如何將外部系統調用包裝在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.