Bulkhead Pattern Nedir? Tek Bir Servisin Tüm Sistemi Çökertmesini Nasıl Engellersiniz?
Tek bir yavaşlayan veya çöken servis tüm sistemi neden etkiler? Bulkhead Pattern, uygulamanın farklı iş yüklerini izole ederek bir bileşendeki sorunun diğerlerini etkilemesini engeller. Bu yazıda Bulkhead Pattern'in çalışma mantığını, gerçek production senaryolarını, Circuit Breaker ile farklarını ve Node.js/TypeScript uygulamalarında nasıl kullanılacağını inceliyoruz.

Bulkhead Pattern: Bir Servis Batınca Tüm Sistemin Batmasını Engelle
Şöyle bir senaryo düşün:
Sistemde üç farklı iş yükü var — kullanıcı girişi, ödeme işlemleri ve e-posta gönderimi. Bir gün e-posta sağlayıcısında problem çıkıyor. E-posta istekleri yavaşlıyor, timeout’lar oluşuyor, retry’lar devreye giriyor, kuyruklar doluyor. Ve bir süre sonra kullanıcılar giriş bile yapamamaya başlıyor.
Peki neden? Çünkü aslında çöken şey e-posta servisi değil — tüm sistem.
Gemiler Neden Batmaz?
Büyük gemiler tek parça değildir. Gövde, birbirinden izole bölmelere ayrılır. Bir bölüm su alsa bile diğer bölmeler etkilenmez, gemi batmaz.
Bulkhead Pattern tam olarak bu fikri yazılıma uygular. Bir bileşen sorun yaşadığında diğer bileşenlerin çalışmaya devam etmesini sağlar.
Sorun Nerede Başlıyor?
Çoğu uygulama tüm iş yüklerini aynı kaynak havuzlarına bağlar. Aynı database connection pool, aynı thread pool, aynı kuyruk. Bu durumda tek bir yavaşlayan servis bütün kaynakları tüketebilir.
await Promise.all([
sendEmail(),
generateReport(),
processPayment(),
]);
sendEmail yavaşlamaya başlarsa bekleyen iş sayısı hızla artar. Bir süre sonra diğer işlemler de kaynak bulamaz hale gelir. Sorun artık e-posta servisi değil, kaynak tükenmesidir.
Bulkhead Pattern Nasıl Çalışır?
Temel fikir basittir: her iş yüküne ayrı kaynak ayır.
Payment Pool → 20 Connection
User Pool → 20 Connection
Email Pool → 10 Connection
Email Pool tamamen dolsa bile diğer havuzlar etkilenmez.

TypeScript’te bunu sınırlı eşzamanlılık ile modelleyebilirsin:
function createBulkhead(maxConcurrent: number) {
let active = 0;
const queue: Array<() => void> = [];
async function execute<T>(fn: () => Promise<T>): Promise<T> {
if (active >= maxConcurrent) {
await new Promise<void>((resolve) => queue.push(resolve));
}
active++;
try {
return await fn();
} finally {
active--;
const next = queue.shift();
if (next) next();
}
}
function getActive() {
return active;
}
return { execute, getActive };
}
Her iş yükü için ayrı bir bulkhead oluşturursun:
const paymentBulkhead = createBulkhead(20);
const emailBulkhead = createBulkhead(10);
const userBulkhead = createBulkhead(20);
// E-posta yavaşlasa bile ödeme etkilenmez
async function processOrder(order: Order) {
await paymentBulkhead.execute(() => chargePayment(order));
await emailBulkhead.execute(() => sendConfirmationEmail(order));
}
Queue İzolasyonu
Kuyruk tabanlı sistemlerde bulkhead en net şekilde görünür.
Yanlış yaklaşım — tüm işler aynı kuyruğa giriyor:
Main Queue
├─ Email
├─ Payment
├─ Reports
└─ Notifications
E-posta işleri patladığında tüm kuyruk etkilenir, ödeme işleri de beklemede kalır.
Doğru yaklaşım — her iş yükü kendi kuyruğunu kullanır:
Email Queue
Payment Queue
Report Queue
Notification Queue

Altyapı Seviyesinde Bulkhead
Bulkhead sadece kod seviyesinde uygulanmaz. Kubernetes’te servis başına replica sayısını ayırmak da bir bulkhead uygulamasıdır:
payment-service → 3 replica
user-service → 3 replica
email-service → 1 replica
E-posta servisi yoğun yük altında kalsa bile ödeme servisine ayrılan kaynaklar korunur.
Circuit Breaker ile Farkı
Bu iki pattern sıkça karıştırılır ama farklı şeyleri çözerler.
Circuit Breaker: “Bu servis çalışmıyor, artık ona istek göndermeyelim.” Sorunu durdurur.
Bulkhead: “Bu servis çökerse diğer sistemler etkilenmesin.” Sorunun yayılmasını engeller.
En güçlü mimarilerde ikisi birlikte kullanılır. Circuit Breaker servisin çöktüğünü tespit eder, Bulkhead ise o çöküşün başka sistemlere sıçramasını önler.
Ne Zaman Kullanmalı?
Kritik ve kritik olmayan işler aynı kaynakları kullanıyorsa, harici servislerle yoğun entegrasyon varsa, kuyruk tabanlı işlemler söz konusuysa Bulkhead düşünmelisin. Özellikle ödeme sistemlerinde ve SaaS ürünlerinde neredeyse standart hale gelmiştir.
Özet
Tek bir yavaş servis tüm sistemi etkileyebilir — sorun genellikle servisin kendisi değil, ortak kaynakların tükenmesidir.
Bulkhead kaynakları bölerek izolasyon sağlar: ayrı pool, ayrı queue, ayrı worker.
Circuit Breaker ile birlikte kullanıldığında sistem çok daha dayanıklı hale gelir.
Bu serinin dört pattern’ını birlikte düşününce tablo netleşiyor: Retry geçici hataları çözer, Timeout sonsuz beklemeyi keser, Circuit Breaker çöken servise gitmeyi durdurur, Bulkhead ise bir bölüm çöktüğünde tüm sistemin onunla birlikte gitmesini engeller.
İlgili İçerikler