Москва: проверенные б/у ноутбуки с гарантией и проверкой перед оплатой
+7 906 722-94-45

Главная → Статьи → Bulkhead pattern: изоляция сбоев

Bulkhead pattern на практике: изоляция сбоев в распределённых системах

Как работает bulkhead pattern: изоляция ресурсов (thread pools, connection pools, memory) для предотвращения каскадных отказов и практические паттерны применения.

Прямой ответ

Bulkhead pattern — изоляция ресурсов для предотвращения каскадных отказов (bulkhead — «отсек корабля» — bulkhead — «один отсек затоплен — корабль плывёт» — bulkhead — микросервисы — «один сервис упал — остальные работают» — bulkhead); аналогия: корабль (bulkhead — «отсеки» — bulkhead — «один отсек затоплен — остальные целы» — bulkhead — «корабль не тонет» — bulkhead — микросервисы); проблема, которую решает: каскадные отказы (bulkhead — «один сервис упал — все упали» — bulkhead — «сервис A зависит от B, B упал — A упал» — bulkhead — микросервисы — «каскадный отказ» — incident — bulkhead); механика: изоляция ресурсов (bulkhead — «отдельные ресурсы для каждого сервиса» — bulkhead — «сервис A — свой пул, сервис B — свой пул» — bulkhead — ёмкость — «один пул исчерпан — другие работают» — bulkhead); типы изоляции: (1) Thread pool isolation (bulkhead — «отдельные thread pools» — bulkhead — «сервис A — 10 потоков, сервис B — 10 потоков» — bulkhead — Hystrix — «Hystrix — thread pool isolation» — Hystrix — bulkhead); (2) Connection pool isolation (bulkhead — «отдельные connection pools» — bulkhead — «сервис A — 10 соединений, сервис B — 10 соединений» — bulkhead — ёмкость — «один пул исчерпан — другие работают» — bulkhead); (3) Memory isolation (bulkhead — «отдельные memory limits» — bulkhead — «сервис A — 1 ГБ, сервис B — 1 ГБ» — bulkhead — k8s — «k8s — memory limits» — k8s — bulkhead); (4) Semaphore isolation (bulkhead — «семафоры» — bulkhead — «сервис A — 10 семафоров, сервис B — 10 семафоров» — bulkhead — Hystrix — «Hystrix — semaphore isolation» — Hystrix — bulkhead); когда bulkhead: микросервисы (микросервисы — «микросервисы — bulkhead» — микросервисы — bulkhead), внешние зависимости (bulkhead — «внешний API — bulkhead» — bulkhead — retry — «внешний API упал — bulkhead» — bulkhead), критические сервисы (bulkhead — «критический сервис — bulkhead» — bulkhead — incident — «критический сервис не должен падать» — bulkhead); когда НЕ bulkhead: монолит (bulkhead — «монолит — bulkhead оверхед» — bulkhead — техдолг — «bulkhead для монолита» — оверхед — техдолг), простые случаи (bulkhead — «bulkhead не нужен» — bulkhead — техдолг — «bulkhead оверхед» — техдолг); антипаттерны: bulkhead без мониторинга (метрики — «bulkhead сработал» — метрика — алерт — алерты — «пул исчерпан» — incident), bulkhead для всего (bulkhead — «bulkhead для всего» — bulkhead — «оверхед» — техдолг — «bulkhead только для критического» — bulkhead), bulkhead без fallback (bulkhead — «пул исчерпан — fallback» — bulkhead — retry — «fallback обязателен» — retry).

Практика: bulkhead в микросервисах

Thread pool isolation (bulkhead — Hystrix (Hystrix — «Hystrix — thread pool isolation» — Hystrix — @HystrixCommand(threadPoolKey = "serviceA", threadPoolProperties = { @HystrixProperty(name = "coreSize", value = "10") }) (Hystrix — «10 потоков для serviceA» — Hystrix — bulkhead); Connection pool isolation (bulkhead — отдельные пулы (bulkhead — «serviceA — пул 10, serviceB — пул 10» — bulkhead — ёмкость — Postgres — «отдельные connection pools» — Postgres); Memory isolation (bulkhead — k8s (k8s — resources: limits: memory: 1Gi (k8s — «1 ГБ на под» — k8s — bulkhead); Semaphore isolation (bulkhead — Hystrix (Hystrix — @HystrixCommand(commandProperties = { @HystrixProperty(name = "execution.isolation.strategy", value = "SEMAPHORE"), @HystrixProperty(name = "execution.isolation.semaphore.maxConcurrentRequests", value = "10") }) (Hystrix — «10 семафоров» — Hystrix — bulkhead); Fallback (bulkhead — пул исчерпан (bulkhead — fallback (retry — «пул исчерпан — fallback» — retry — Hystrix — @HystrixCommand(fallbackMethod = "fallback") (Hystrix — «fallback метод» — Hystrix); Мониторинг (метрики: «pool utilization», «fallback count» — метрики — алерты — алерты — «пул исчерпан» — incident).

Практический сценарий: микросервис с внешним API — bulkhead

Контекст: микросервис (микросервисы), зависимость от внешнего API (bulkhead — «внешний API» — bulkhead — retry), боль: внешний API упал (bulkhead — «внешний API упал» — bulkhead — все потоки ждут (bulkhead — «потоки исчерпаны» — bulkhead — микросервис упал (bulkhead — «микросервис упал» — incident); решение — bulkhead: (1) Thread pool isolation (bulkhead — Hystrix (Hystrix — «10 потоков для внешнего API» — Hystrix — bulkhead); (2) Timeout (retry — @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "5000") (Hystrix — «timeout 5 с» — Hystrix — retry); (3) Fallback (bulkhead — @HystrixCommand(fallbackMethod = "fallback") (Hystrix — «fallback метод» — Hystrix — retry); (4) Circuit breaker (retry — внешний API упал (retry — circuit breaker открыт (retry — «не слать запросы» — retry); (5) Мониторинг (метрики — «pool utilization», «fallback count» — метрики — алерты — алерты); результат: внешний API упал (bulkhead — 10 потоков исчерпаны (bulkhead — fallback (retry — «fallback сработал» — retry — микросервис работает (bulkhead — «микросервис не упал» — bulkhead — circuit breaker (retry — «не слать запросы» — retry); вывод: bulkhead решили задачу (внешний API упал — микросервис работает — bulkhead — ADR — «bulkhead без fallback» — антипаттерн — техдолг).

FAQ

Bulkhead против circuit breaker — в чём разница и как связаны? Bulkhead (bulkhead — изоляция ресурсов (bulkhead — «отдельные пулы» — bulkhead — «один пул исчерпан — другие работают» — bulkhead); Circuit breaker (retry — «не слать запросы к упавшему сервису» — retry — «сервис упал — circuit breaker открыт» — retry); разница: bulkhead — изоляция (bulkhead — «отдельные пулы» — bulkhead, circuit breaker — отключение (retry — «не слать» — retry); связь: часто вместе (bulkhead — bulkhead + circuit breaker (bulkhead — retry — «изоляция + отключение» — bulkhead — retry); «bulkhead вместо circuit breaker» — нет (разные паттерны — bulkhead — retry — часто вместе — ADR — техдолг).

Какие типы bulkhead бывают и когда какой использовать? Thread pool isolation (bulkhead — «отдельные thread pools» — bulkhead — Hystrix — «Hystrix» — Hystrix — когда: изоляция потоков (bulkhead — «потоки» — bulkhead); Connection pool isolation (bulkhead — «отдельные connection pools» — bulkhead — ёмкость — когда: изоляция соединений (bulkhead — «соединения» — bulkhead); Memory isolation (bulkhead — «отдельные memory limits» — bulkhead — k8s — когда: изоляция памяти (bulkhead — «память» — bulkhead); Semaphore isolation (bulkhead — «семафоры» — bulkhead — Hystrix — когда: лёгкая изоляция (bulkhead — «семафоры легче потоков» — bulkhead); «один тип для всего» — нет (разные ресурсы — разные типы — bulkhead — ADR — техдолг).

Как настроить fallback для bulkhead? Fallback (bulkhead — пул исчерпан (bulkhead — fallback (retry — «пул исчерпан — fallback» — retry — Hystrix — @HystrixCommand(fallbackMethod = "fallback") (Hystrix — «fallback метод» — Hystrix); Fallback-логика (bulkhead — «пул исчерпан — fallback» — bulkhead — вернуть кэш (bulkhead — «кэш вместо внешнего API» — bulkhead — Redis — вернуть дефолт (bulkhead — «дефолт вместо внешнего API» — bulkhead — вернуть ошибку (bulkhead — «ошибка вместо внешнего API» — bulkhead); «bulkhead без fallback» — антипаттерн (пул исчерпан — ошибка — bulkhead — fallback обязателен — retry — ADR — техдолг).

Когда bulkhead действительно нужен, а когда — оверхед? Нужен: микросервисы (микросервисы — «микросервисы — bulkhead» — микросервисы — bulkhead, внешние зависимости (bulkhead — «внешний API — bulkhead» — bulkhead — retry, критические сервисы (bulkhead — «критический сервис — bulkhead» — bulkhead — incident); Оверхед: монолит (bulkhead — «монолит — bulkhead оверхед» — bulkhead — техдолг, простые случаи (bulkhead — «bulkhead не нужен» — bulkhead — техдолг); «bulkhead для всего» — антипаттерн (оверхед — техдолг — «bulkhead только для критического» — bulkhead — ADR — техдолг).

Источники: Microsoft Azure patterns (bulkhead), Martin Fowler (bulkhead), Hystrix docs — ссылки в шапке.