Какова цель применения шаблона переборки в неблокирующем приложении?

Насколько я понимаю, шаблон Bulkhead - это способ изоляции пулов потоков. Следовательно, при взаимодействии с разными службами используются разные пулы потоков: если один и тот же пул потоков используется совместно, время ожидания одной службы может исчерпать весь пул потоков, нарушая связь с другими (работоспособными) службами. Использование других снижает воздействие.

Исходя из моего понимания, я не вижу причин для применения этого шаблона к неблокирующим приложениям, поскольку потоки не блокируются и, следовательно, пулы потоков в любом случае не будут исчерпаны.

Я был бы признателен, если бы кто-нибудь мог прояснить этот момент, если я что-то упускаю.

ИЗМЕНИТЬ (объясните, почему это не дубликат):

Есть еще один (более общий) вопрос о том, почему с использованием схем "Автоматический выключатель" и "Переборка" с Reactor. На вопрос был дан очень общий ответ, объясняющий, почему все декораторы Resilience4J актуальны при работе с Reactor.

С другой стороны, мой вопрос относится к шаблону Bulkhead, поскольку я не понимаю его преимуществ в сценариях, где потоки не блокируются.


person Rubasace    schedule 21.10.2020    source источник
comment
Отвечает ли это на ваш вопрос? Зачем использовать автоматический выключатель и переборку при работе с Spring Реактор?   -  person Martin Tarjányi    schedule 22.10.2020
comment
Спасибо за ответ @ MartinTarjányi. Я видел этот вопрос, но не думаю, что ответ действительно разрешит мои сомнения. Я до сих пор не понимаю, зачем нам нужны отдельные пулы потоков, если их потоки не будут заблокированы.   -  person Rubasace    schedule 22.10.2020


Ответы (1)


Шаблон Bulkhead предназначен не только для изоляции пулов потоков.

Вспомните закон Литтла: L = λ * W

Где:

L - среднее количество одновременных задач в системе массового обслуживания

λ - среднее количество задач, поступающих в систему массового обслуживания в единицу времени

W - среднее время обслуживания задачи в системе очередей

Шаблон Bulkhead больше касается управления L, чтобы предотвратить исчерпание ресурсов. Это можно сделать с помощью:

  • ограниченные очереди + пулы потоков
  • семафоры

Даже неблокирующие приложения требуют ресурсов для каждой параллельной задачи, которую вы, возможно, захотите ограничить. Семафоры могут помочь ограничить количество одновременных задач.

Шаблон RateLimiter предназначен для управления λ, а TimeLimiter - для управления максимальным временем, которое разрешено тратить задачам.

Адаптивная переборка может даже заменить RateLimiters. Посмотрите этот замечательный доклад Прекратите ограничение скорости! Управление мощностью сделано правильно Джоном Муром

В настоящее время мы разрабатываем AdaptiveBulkhead в Resilience4j, который динамически адаптирует ограничение параллелизма задач. Реализация сравнима с алгоритмами контроля перегрузки TCP, которые используют схему аддитивного увеличения / мультипликативного уменьшения (AIMD) для динамической адаптации окна перегрузки. Но AdaptiveBulkhead, конечно, не зависит от протокола.

person Robert Winkler    schedule 23.10.2020