Короткий ответ
Bulkhead изолирует ресурсы (пулы соединений, потоки) для разных зависимостей так, чтобы перегрузка/сбой одной зависимости не исчерпывала общий ресурс и не блокировала работу с остальными.
Как это работает подробнее
Вместо одного общего пула соединений/потоков на все исходящие вызовы выделяют отдельный пул с ограниченным размером под каждую зависимость; если пул для зависимости A исчерпан, вызовы к B продолжают использовать свой отдельный пул.
Пример кода
example.py
payment_pool = httpx.Client(limits=httpx.Limits(max_connections=10))
analytics_pool = httpx.Client(limits=httpx.Limits(max_connections=5))Что использовать на практике
- Практика. Применяют вместе с таймаутами и circuit breaker — bulkhead ограничивает «ширину» ущерба, а breaker снижает число бесполезных попыток к деградировавшей зависимости.
Подводные камни
- Риск. Использовать единственный общий thread pool для вызовов к десяткам внешних сервисов; делать bulkhead слишком маленьким, что искусственно ограничивает throughput даже при здоровой зависимости.