Resilience4j: объединение перегородки с TimeLimiter для синхронного внешнего системного вызова от Tomcat - PullRequest
0 голосов
/ 20 января 2020

У меня есть веб-приложение, работающее на сервере Tomcat, которое выполняет вызовы на внешний сервер. Теперь я хочу использовать Resilience4j TimeLimiter для ограничения времени ожидания ответа и дополнительно Bulkhead для ограничения количества параллельных вызовов на внешний сервер.

Мне не нужны асинхронные вызовы для во всяком случае, внешняя система как поток Tomcat должна ждать ответа или тайм-аута.

Как лучше всего объединить TimeLimiter и Bulkhead в этом сценарии? Нужен ли мне SemaphoreBulkhead или ThreadPoolBulkhead и как мне обернуть мой внешний системный вызов в Future, который необходим для TimeLimiter?

1 Ответ

1 голос
/ 30 января 2020

вы не можете объединить SemaphoreBulkhead и TimeLimiter, так как TimeLimiter не может остановить выполнение задачи, если она работает в том же потоке.

Поэтому вы можете комбинировать только TimeLimiter и ThreadPoolBulkhead. Но это имеет смысл, только если вы хотите иметь неблокирующий / асин c код и не блокировать ваш поток.

Если вы хотите блокировать код, вы можете просто использовать:

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

...