Microservislerde Sınırlı Bağlam
Sınırlı bağlam (bounded context), bir modelin ve o modeldeki terimlerin tek ve net bir anlam taşıdığı sınırdır. DDD'nin temel fikri şudur: büyük bir sistemde her şeyi kapsayan tek bir model kurulamaz, çünkü aynı kelime şirketin farklı bölümlerinde farklı anlamlara gelir. Çözüm, sistemi her birinin kendi modeli ve kendi dili olan bağlamlara ayırmaktır.
Bir e-ticaret sisteminde "ürün" kelimesini düşün:
Katalog bağlamında ürün; adı, açıklaması, fotoğrafları ve kategorisi olan bir şeydir.
Stok bağlamında ürün; depodaki rafı, adedi ve yeniden sipariş eşiği olan bir kalemdir.
Fiyatlandırma bağlamında ürün; liste fiyatı, indirim kuralları ve vergi oranı olan bir şeydir.
Kargo bağlamında ürün; ağırlığı ve boyutları olan bir pakettir.
Bunların hepsini tek bir Urun sınıfına ve tek bir tabloya koyarsan elli alanlı, herkesin değiştirdiği, kimsenin tam anlamadığı bir yapı çıkar. Sınırlı bağlamlarla her bağlam kendi Urun modelini tutar, yalnızca kendi ihtiyacı olan alanlarla. Hepsi aynı ürün kimliğiyle (ID) birbirine bağlanır.
Her bağlamın içinde ortak dil (ubiquitous language) geçerlidir: yazılımcılar ve iş birimi aynı terimleri aynı anlamda kullanır, kodda da aynı adlar geçer. Sınır, bu dilin geçerli olduğu yerin bittiği noktadır.
Mikroservislerle ilişkisi: bir sınırlı bağlam, bir mikroservisin doğal sınırıdır. Kendi modeli, kendi verisi ve kendi dili olduğu için tek sorumluluk ve gevşek bağlılık kendiliğinden sağlanır. Bire bir eşleşme şart değildir (büyük bir bağlam birkaç servise bölünebilir), ama bir servisin birden fazla bağlama yayılması genellikle hatadır. Önceki sorundaki kullanıcı örneği de buydu: aynı kişi kimlik bağlamında "hesap", sipariş bağlamında "müşteri"dir.
Sınırlar nasıl bulunur? Şu işaretlere bakılır:
Dil değişimi: aynı kelime farklı anlamda kullanılmaya başlıyorsa ya da aynı şeye farklı ad veriliyorsa bir sınır geçilmiştir.
Organizasyon yapısı: farklı departmanlar ve farklı uzmanlar çoğu zaman farklı bağlamlara işaret eder.
İş süreçleri: event storming atölyelerinde olaylar zaman çizgisine dizilir; olayların kümelendiği ve sorumluluğun el değiştirdiği yerler sınırları gösterir.
Birlikte değişen veriler: aynı işlemde tutarlı kalması gereken veriler aynı bağlamda durur.
Bağlamlar birbirinden kopuk değildir; aralarındaki ilişkiler bağlam haritası (context map) ile belirlenir. Bir bağlam başka birinin modelini kendi diline çevirmek için arada bir çeviri katmanı (anti-corruption layer) kullanır, böylece karşı tarafın modeli kendi modelini bozmaz.
Sınırları baştan doğru çizmek zordur ve yanlış çizilen sınırı mikroserviste düzeltmek pahalıdır. Bu yüzden alanı yeni tanıyorsan modüler bir monolitle başlayıp bağlamlar netleştikçe servislere ayırmak sık önerilen bir yoldur.
Paylaş: URL Kopyala