Bulkhead Pattern Nedir?
Yazılım dünyasına bulkhead terimi aslında gemicilikten gelmektedir. Gemiler inşa edilirken taban kısımları bölmelere ayrılır. Bunun asıl sebebi gemiye girecek suyun diğer bölmelere etki edip oralarda da hasar bırakmasını önlemek ve ilgili sorunu kontrol altına almaktır. Böylelikle su belli bölgede kalarak geminin batması önlenir.
Yazılım dünyasında da bulkhead pattern aslında aynı görevi görmektedir. Olabilecek problemlerin etki alanını küçülterek sistemin diğer mekanizmalarının işlemeye devam etmesini sağlamaktır.
Örneğin bir e-ticaret platformumuzun olduğunu ve bu platformumuzun order-service ve payment-service isminde 2 adet mikroservisinin olduğunu düşünelim. Order-service’in görevi geçmiş siparişleri listelemek ve yeni sipariş yaratmak, payment-service’in göreviyse ilgili bilgilerle ödeme işlemini tamamlamak olsun. Bir sipariş geldiğinde order-service sipariş ödemesini tamamlamak için payment-service’i çağırıyor. Fakat payment-service’in içindeki bazı problemler ve yavaşlıklardan dolayı işlerini çok geç hallettiğini düşünelim. Bu durumda order-service’e gelen yeni sipariş istekleri aslında payment-service’e bağlı olduğundan dolayı yavaşlayacak ve bir süre sonra bu yavaşlık sebebiyle uygun thread sayımız oldukça azalacak ve bu threadler payment-service’ten gelen cevapları bekliyor olacak. Bu durumda “geçmiş siparişlerim” isteğini gönderen kullanıcılar etkilenmiş olacak boşta uygun threadimiz olmadığı için. Sonuç olarak payment-service’te oluşan bir yavaşlık sadece “sipariş oluştur” isteğini etkilemek yerine aslında “geçmiş siparişlerim” isteklerini de bloklamış oldu.
Bulkhead patterni createOrder() methodu için uyguladığımızda, bulkhead patternin konfigürasyonunda belirtilen sayıda eş zamanlı isteklerin bu methoda ulaşmasına izin veriyor. Bu yüzden createOrder() işlemleri thread pooldaki tüm threadleri kullanamayacağı için beklemek zorunda kalacak ve tüm threadleri işgal etmediğinden sistemin geri kalan kısımlarına gelen istekler karşılanabilecek.
Bulkhead Dizayn Çeşitleri
- Semamphore Dizayn: Servise gelen eş zamanları istekleri sınırlandırarak, belirlenen eşiğe ulaştığında, gelen diğer istekleri reddeder.
- ThreadPool Dizayn: Bu dizayn belirli thread sayısına sahip bir ThreadPool ve buna ek olarak bir Queue yapısı ile gelir. ThreadPool dolduğunda direk olarak istekler reddedilmez edilmez ve ilgili Queue’da bekletilir. Queue ve ThreadPool dolduğunda o zaman istekler reddedilmeye edilmeye başlar.