Bulkhead chia tài nguyên thành các ngăn tách biệt để một phần hỏng không kéo theo toàn bộ. Tên lấy từ vách ngăn khoang tàu: một khoang ngập nước thì tàu vẫn nổi.
Trong hệ thống, ngăn tách có thể ở nhiều mức:
- Connection pool riêng cho từng dependency. Nếu dịch vụ báo cáo dùng chung pool với dịch vụ thanh toán, báo cáo treo sẽ hút hết kết nối và thanh toán chết theo. Tách pool là bulkhead rẻ nhất.
- Thread pool hoặc semaphore riêng cho từng nhóm lời gọi, có giới hạn đồng thời rõ ràng.
- Cụm máy riêng cho từng nhóm khách hàng (cell-based architecture): một cell hỏng chỉ ảnh hưởng số khách trong cell đó.
- Tách luồng đọc và luồng ghi, tách API công khai và API nội bộ.
Khác circuit breaker: circuit breaker phản ứng theo thời gian — phát hiện lỗi rồi ngắt lời gọi tới dependency đang hỏng. Bulkhead là cấu trúc tĩnh — giới hạn sẵn tài nguyên mỗi phần có thể chiếm, kể cả khi chưa có lỗi nào. Hai thứ bổ sung cho nhau: bulkhead chặn lây lan, breaker dừng dòng chảy tới chỗ hỏng.
Blast radius là phạm vi ảnh hưởng khi một thành phần hỏng. Bulkhead là công cụ chính để thu nhỏ nó. Kỹ thuật đi xa hơn là shuffle sharding: gán mỗi khách hàng một tổ hợp node ngẫu nhiên thay vì một cell cố định. Với 8 node chọn 2, số tổ hợp là 28, nên hai khách hàng bất kỳ hiếm khi trùng đủ cả hai node — một khách gây quá tải chỉ ảnh hưởng phần nhỏ khách còn lại.
Cái giá phải trả: tài nguyên bị chia nhỏ nên hiệu suất sử dụng thấp hơn so với dùng chung một pool lớn.