Hexagonal mimari: iş mantığını dış dünyadan portlar ve adaptörlerle ayırmak
Hexagonal mimari nedir, port ve adaptörler iş mantığını veritabanı ve arayüzden nasıl ayırır? Çalışma biçimi, örnek akış ve katmanlı mimariden farkı.
Hexagonal mimari nedir?
Hexagonal mimari, port ve adaptör mimarisi (ports and adapters) olarak da bilinir. Uygulamanın iş mantığını merkeze koyar ve veritabanı, web arayüzü, mesaj kuyruğu, harici servis gibi her dış unsurla yalnızca tanımlı bağlantı noktaları üzerinden konuşturur. Böylece iş kuralları, hangi teknolojinin kullanıldığından etkilenmez.
Altıgen şekli yalnızca çizimde kolaylık sağlar; kenar ya da katman sayısı bir anlam taşımaz. Asıl fikir, çekirdeğin bir tarafta, dış dünyanın öteki tarafta durması ve aralarındaki sınırın açıkça tanımlanmasıdır.
Port ve adaptör ne demek?
Port, çekirdeğin dışarıyla konuşmak için tanımladığı arayüzdür. Çekirdek kendi diliyle ne istediğini söyler; kimin cevap vereceğini bilmez. Yönüne göre ayrılır:
- Birincil (sürücü) portlar: Dışarıdan çekirdeği çağıran girişler. Örneğin bir sipariş oluşturma işlemi.
- İkincil (sürülen) portlar: Çekirdeğin dışarıdan istediği hizmetler. Örneğin siparişi kaydetmek ya da ödeme almak.
Adaptör, bir portun belirli bir teknolojiyle gerçekleştirilmiş halidir. Bir HTTP denetleyicisi, komut satırı aracı ya da test kodu birincil adaptör olabilir. İlişkisel veritabanına yazan sınıf, bir bellek içi sahte kayıt ya da harici ödeme servisine istek atan istemci ikincil adaptördür. Aynı port için birden fazla adaptör yazılabilir ve çekirdek değişmez.
Nasıl çalışır?
Bağımlılık yönü her zaman çekirdeğe doğrudur. Çekirdek, adaptörleri tanımaz; adaptörler çekirdeğin portlarını tanır ve onlara uyum sağlar. Bu, bağımlılığı tersine çevirme ilkesinin uygulamasıdır.
Bir istek geldiğinde birincil adaptör bunu çekirdeğin anlayacağı bir çağrıya çevirir. Çekirdek iş kuralını işletir, gerekirse ikincil bir port üzerinden veri ister. O portun arkasındaki adaptör veritabanına gider, sonucu çekirdeğin dilindeki nesnelere dönüştürüp geri verir. Çekirdek hiçbir aşamada SQL, HTTP ya da kuyruk protokolüne dair bilgi taşımaz.
Küçük bir örnek
Örneğin bir sipariş uygulamasında çekirdek, siparişin stok kontrolünden geçmesi ve toplam tutarın hesaplanması gibi kuralları içerir. Çekirdek bir sipariş deposu portu tanımlar: siparişi kaydet, siparişi getir.
Canlıda bu port, bir veritabanı adaptörüyle karşılanır. Testlerde ise aynı port, bellekte çalışan sahte bir adaptörle karşılanır; böylece iş kuralları veritabanı kurmadan hızlıca sınanır. Yarın veritabanı değişirse yalnızca adaptör yeniden yazılır. Aynı çekirdek hem web arayüzünden hem toplu içe aktarma betiğinden çağrılabilir, çünkü bu girişlerin her biri ayrı birincil adaptördür.
Katmanlı mimariden farkı
Geleneksel katmanlı yapıda sunum, iş ve veri katmanları üst üste dizilir ve bağımlılık yukarıdan aşağıya akar. İş katmanı veri katmanına doğrudan bağımlı olduğu için veritabanı değişiklikleri iş koduna sızar ve test için çoğu zaman gerçek veritabanı gerekir.
Hexagonal yaklaşımda ise veri erişimi de bir dış ayrıntıdır; çekirdek ona bağımlı değildir. Temiz mimari (Clean Architecture) ve soğan (onion) mimarisi aynı bağımlılık yönü fikrini paylaşan yakın akrabalardır. Farklar çoğunlukla çizim ve adlandırmadadır; ortak hedef, iş mantığını çerçeve ve altyapıdan bağımsız kılmaktır.
Ne zaman uygundur, ne zaman gereksizdir?
Uzun ömürlü, iş kuralları zengin ve farklı kanallardan çağrılan uygulamalarda fayda sağlar: birden fazla arayüz, değişmesi muhtemel dış hizmetler, sık sınanması gereken kritik kurallar gibi durumlarda. Alan odaklı tasarımla (domain-driven design) birlikte sıkça kullanılır.
Çok basit, veri girişi ağırlıklı uygulamalarda fazladan arayüz ve dönüştürücü kod yük getirir. Her şeyi portlaştırmak da aşırı mühendisliğe yol açar. Pratik yol, gerçekten değişme ihtimali olan ya da sınama güçlüğü yaratan sınırlarda port tanımlamaktır.
Mindset programlarında nerede karşınıza çıkar?
Hexagonal (Ports and Adapters) Mimari eğitimi, hexagonal mimarinin temelleri, uygulama çekirdeği tasarımı, birincil adaptörler, ikincil adaptörler, test stratejisi ve sözleşme doğrulama ile refaktör vakaları ve ekip pratikleri modüllerinden oluşur.
İlgili Mindset programı
Hexagonal (Ports and Adapters) Mimari
Sık sorulan sorular
Hexagonal mimari ile mikroservis mimarisi aynı şey mi?
Hayır. Hexagonal mimari bir uygulamanın iç yapısını düzenler; mikroservis ise uygulamanın hangi bağımsız servislere bölüneceğiyle ilgilidir. Birlikte kullanılabilirler: her mikroservis kendi içinde hexagonal yapıda tasarlanabilir. Tek parça (monolit) uygulama da hexagonal olabilir.
Altıgen şeklinin bir anlamı var mı?
Şeklin kenar sayısı bir anlam taşımaz. Altıgen, çekirdeğin çevresine farklı portları yerleştirebilmek için çizimde kullanılan çok kenarlı bir gösterimdir. Önemli olan sınır fikridir; kaç port olacağını uygulamanın ihtiyacı belirler. Bir uygulamada az, bir diğerinde çok port bulunabilir.
Adaptörlerde iş kuralı yazılabilir mi?
Yazılmamalıdır. Adaptör yalnızca çeviri yapar: dış formatı çekirdeğin diline ve tersine çevirir. İş kuralı adaptöre kayarsa aynı kural farklı giriş noktalarında tekrarlanır ve testi zorlaşır. Karar verme mantığı çekirdekte kalmalıdır; adaptör ince tutulur.
Hexagonal mimari test yazmayı nasıl kolaylaştırır?
Çekirdek dış bağımlılıklara portlar üzerinden eriştiği için testte bu portlara sahte adaptörler takılabilir. Böylece iş kuralları veritabanı, ağ ya da harici servis olmadan hızlı çalışan testlerle doğrulanır. Gerçek adaptörler ise ayrı, daha az sayıda entegrasyon testiyle sınanır.