Modular Monolith Nedir? Domain Boundary ve Evrimsel Mimari Perspektifi

Modular Monolith, genellikle Microservices’e alternatif olarak konumlandırılsa da, gerçekte daha temel bir problemi çözmeye çalışır: domain boundary’lerin doğru tanımlanması.

modular-monolith-architecture

Çoğu sistemde problem dağıtık olup olmamak değil, domain’in yanlış bölünmesidir. Bu nedenle Modular Monolith, dağıtımı değil bağımlılık yönetimini optimize eder.

Core Problem: Coupling vs Cohesion

Bir sistemin sağlıklı olup olmadığını belirleyen en kritik iki metrik:

  • Cohesion: Aynı modül içindeki bileşenlerin birlikte ne kadar anlamlı olduğu
  • Coupling: Modüller arası bağımlılık seviyesi

Microservices genellikle coupling’i azaltmak için kullanılır. Ancak yanlış domain ayrımı yapıldığında, coupling sadece process boundary’nin dışına taşınır.

Yani:

In-process coupling → network coupling’e dönüşür

Bu da sistemi daha karmaşık hale getirir, daha basit değil.

Modular Monolith’in Asıl Gücü: Boundary Enforcement

Modular Monolith’in değeri, tek deploy olmasında değil, boundary’leri enforce edebilmesindedir.

İyi tasarlanmış bir sistemde:

  • Her modül kendi domain modeline sahiptir
  • Başka modüllerin internal state’ine erişemez
  • Sadece tanımlı contract’lar üzerinden iletişim kurar

Bu noktada kritik soru:

Bu boundary’leri nasıl enforce edeceksin?

Enforcement Teknikleri

  • Assembly bazlı ayrım (.NET projeleri)
  • Internal visibility (internal / friend assemblies)
  • Interface bazlı erişim
  • Application layer üzerinden erişim zorunluluğu

Eğer bu kurallar compile-time’da enforce edilmiyorsa, zamanla ihlal edilir.

Data Ownership Problemi

Microservices’in en güçlü iddialarından biri “her servis kendi datasına sahip olmalı” yaklaşımıdır.

Modular Monolith’te ise genellikle tek bir database vardır. Ancak bu, data ownership olmadığı anlamına gelmez.

Doğru yaklaşım:

  • Logical data ownership
  • Schema-level separation
  • Direct table access’in engellenmesi

En büyük anti-pattern:

Her modülün her tabloya erişebilmesi

Bu durum sistemin modülerliğini tamamen yok eder.

Transaction Yönetimi: Hidden Advantage

Modular Monolith’in en büyük ama en az konuşulan avantajlarından biri transaction yönetimidir.

Tek process içinde:

  • ACID transaction’lar doğal olarak desteklenir
  • Eventually consistency ihtiyacı azalır
  • Saga pattern gibi karmaşık çözümler gerekmez

Microservices’te ise:

  • Distributed transaction zordur
  • Eventual consistency zorunlu hale gelir
  • Data consistency trade-off’a dönüşür

Communication Model: In-Process vs Network

Modular Monolith:

  • Method call → düşük latency
  • Strong typing → compile-time safety

Microservices:

  • HTTP / messaging → yüksek latency
  • Serialization/deserialization maliyeti
  • Network failure riskleri

Buradaki kritik fark şudur:

Network her zaman en zayıf halkadır

Evrimsel Mimari: Ne Zaman Parçalamalısın?

En doğru yaklaşım genellikle sistemin baştan Microservices olarak tasarlanmaması, zamanla evrilmesidir.

Parçalama için sinyaller:

  • Bağımsız scaling ihtiyacı
  • Takım bazlı ownership gereksinimi
  • Deployment bottleneck’leri

Bu sinyaller yoksa, Microservices erken bir optimizasyondur.

Insight

Yanlış bölünmüş bir sistemi Microservices yapmak, problemi çözmez. Sadece problemi dağıtır.

Sonuç

Modular Monolith, basit bir mimari tercih değil, sistemin doğru evrimleşmesini sağlayan bir stratejidir.

Asıl mesele monolith vs microservices değil, boundary’lerin ne kadar doğru tanımlandığıdır.

By tanju.bozok

Software Architect, Developer, and Entrepreneur

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir