Modular Monolith ve Mikro Servisler

Hasan Doğan
4 min readSep 5, 2022

Bu yazıda, modüler yapı nedir? Modüler yapı ve monolit yapı ile modüler yapı ve Mikro servis mimarisi ilişkisine yoğunlaşacağız.

Uygulama oluştururken, sadece son kullanıcı tarafında değil, geliştirme aşamasında da en iyi geliştirme sürecini ve performansı elde etmek isteriz. Bu konuda mimarimiz önemli bir rol oynar.

Son zamanlarda mikro servisler mimarisi pek dillendirilsede her projeye veya ekibe avantajından çok dezavantajların ortaya çıktığını görmüş olabilirsiniz. Bu yüzden bir çok şirket veya takım bu mimariye geçmek istemez ya da geçemezler. Mikro servislere geçemeyen bu şirket/takım için modüler yaklaşım, mikro hizmetlerin bazı avantajlarından yararlanılmasını sağlayan bir tasarım tekniğidir. Çalıştığım şirkette de mikro servis mimarisinde bir çok proje olmasına rağmen uğraştığım projede aşağıda bahsedeceğim özellikler nedeniyle modüler yaklaşımı kullanmak daha akıllıca oldu.

Kısaca Monolitik Yapı

Modüler yapının öncesinden bahsedecek olursak sade monolitik yapıyı görürüz. Monolitik yapı tek bir proje üzerine geliştirme yapılmasıdır. Monolitik mimaride, kodun geliştirilmesini ve bakımını çok daha kolay hale getirmek için mantığımızı farklı katmanlara böleriz. Küçük geliştirme ekipleri tarafından geliştirilen küçük/orta projeler için neredeyse mükemmel bir mimaridir.

Bu yapıda bulunan bazı zorlukların çözümü için modüler yaklaşım oluşmuştur.

Modüler yaklaşımda oluşan zorluklar için de mikro servisler mimarisi yer alıyor. Ancak yukarıda bahsettiğimiz gibi ‘en iyi çözüm budur’ diye bir şey yoktur.

Modüler Yapı/Programlama Nedir?

Önce modüler yaklaşımı incelemeye çalışalım. Modüler yaklaşım/programlama, bir programın parça parça ayrılarak (DDD-bounded context) bağımsız, değiştirilebilir olmasını sağlayan bir tasarım tekniğidir. Bu yapıyı güneş enerjisi kullanmak isteyen bir ev gibi düşünebiliriz. Tüm çatıyı büyük bir panel ile kaplamaktansa küçük panelleri bir araya getirerek evin(ana proje) enerjisini güneşten karşılarız, tek büyük parça olursa uğraşacağımız sorunlar artacaktır.

Her bir modül istenen işlerin bir tarafını yürütmek için tüm gereksinimleri sağlar ve ayrı processlerde çalışır. Her modülün kendi iş mantığı vardır ve gerekirse veritabanı veya şeması olabilir. Bu şekilde, diğerlerini etkilemeden her modülün katmanlarını oluşturabilir ve değiştirebiliriz. Modüller ana proje tarafından algılanabilir olmalıdır.

Eğer monolitik yapıya aşinaysak ve mikro servis avantajlarının bazılarından yararlanmak istiyorsak ya da mikro servis mimarisine geçiş yapmak istiyorsak, ilk önce modüler yapıya geçmek çok yerinde hareket olabilir. Çünkü mikro servislere benzer bir modülerlik sağlarız.

Modüllerin nasıl ortaya çıkacağı konusundan Domain Driven Design konusunda bounded context’lerden faydalanabiliriz. Bounden context, domainin daha küçük problem parçacıklarını temsil eden sınırlardır; yani her şey, uygulamayı birbiriyle ilişkili iş bölümlerine ayırmakla ilgilidir. DDD, burada bize işin sınırlı bağlamlara nasıl bölünmesi gerektiğini anlatır. Bu konu hakkında detaylı bilgi için Martin Fowler’in bu yazısından faydalanabilirsiniz. Bu şekilde sık değişebilecek kısımlar daha bağımsız hale gelir ve tek başına işlevsellik kazanmış olur. Tabii ki tamamen bağımsız olmamalıdır. Çünkü tam bağımsız olduğunda diğer modüllere entegre olma konusunda bir sıkıntı vardır. Entegre etme noktasında modül, bazı bilgilere ihtiyaç duyacaktır ama bu ihtiyaç minimum düzeyde olmalıdır. Tasarım desenlerinde de(Design Patterns) göreceğiniz bir ilke ‘düşük bağımlılık, yüksek birliktelik’ (Loose coupling, high cohesion).

Monolitik yapı ile modüler yapıyı karşılaştırdığımızda, modüler yapı bize şunları sağlar:

  • Takımlar için iş tanımı daha kolay olur.
  • Daha iyi dağıtılmış bağımlılıklara sahiptir. Karmaşıklık azalır.
  • Code refactor daha kolay olur. Çünkü modüller iş paraçacıklarına göre ayrılmıştır.

Modüler Yapı vs Mikro Servisler Mimarisi

Mikro servis mimarisi hakkında bilgi edinmek isteyenler bu notumdan yararlanabilirler.

Modüler yapı , Mikro servis sistemlerden kesinlikle daha az karmaşıktır. Çünkü servisler farklı cluster/makinelerde bulunmazlar... Bu yüzden Mikro servisler, deneyimli ekibe ve gelişmiş alt yapıya ihtiyaç duyar. Karmaşıklık yüksek olursa, sürdürülebilirlik, okunabilirlik ve gözlemlenebilirlik o kadar azalır.

Projemizi test ederken mikro servis mimarisi daha kolaydır. Çünkü projeyi test etmek için modüler yapıda tüm projeyi çalıştırmamız lazım. Mikro servis projesinde sadece ilgili kısımı/kısımları çalıştırmamız yeterlidir. Bu konu ile beraber şunu da çıkartabiliriz; üretkenliğimiz mikro servis mimarisinde daha fazla olacaktır.

Modüler yapıda teknoloji heterojenliği sağlayamayız. Mikro servis mimarisi, ihtiyaçlara göre farklı teknoloji kullanmaya elverişlidir. Monolitik/Modüler mimaride performans için genelde çözüm olarak stored procedure’lere yöneliyorlar.

Uygulamanın dağıtılması konusunda kolaylık olarak modüler/monolitik yapısı daha kolaydır. Çünkü tek bir uygulama üzerine işlem yapılır. Tabi kolaylık bakımından baktık. Ama dağıtım konusunda bağımsızlık ihtiyacınız varsa tabi ki mikro servis mimarisi daha uygun olacaktır.

Ölçeklenebilirlik konusunda mikro servis daha avantajlıdır. Her iki mimaride de ölçeklenebilirlik vardır. Ancak modüler/monolitik yapıda sadece dikey ölçekleme yapılabilir, bu da istenmeyen (pahalı, donanımsal arttırım) bir çözümdür. Mikro servis mimarisinde yatay ölçekleme yapılabilir.

Mikro servis mimarisinde, servisler arası iletişim için ayrı bir efor gerekiyor. Ama modüler yapı da böyle bir uğraşa gerek yoktur, çünkü İstenilen işin/hedefin adresi belirlidir ve değişmeyecektir. Bu konu ile beraber mikro servis mimarisinde, serileştirme, şifreleme gibi ayrıca uğraş gerektiren konular vardır. Ayrıca modüller arasındaki daha kolay iletişim nedeniyle hata ayıklama(debug) çok daha kolaydır.

Dayanıklılık konusunda tabi mikro servisler öndedir. Çünkü bir hata ile karşılaşınca sadece ilgili birim devreden çıkarılır ve uygulama devam eder.

Özet olarak;

Yukarıdaki yararlardan çıkarsak; modüler yapı/programlama, mikro servisler mimarisine göre daha az karmaşıklık çıkartır. Küçük bir ekipseniz ve geliştirme süreciniz iyi geçsin istiyorsanız modüler programlama işinizi çözecektir. Ama bağımsızlık, dayanıklılık, ölçeklenebilirlik konuları öncelikleriniz ise mikro servis mimarisi daha uygun olacaktır.

Modüler yapı ile her modülü bir mikro servis olarak çıkarmamıza izin verir. Proje yeterince büyük olduğunda, tüm ölçeklendirme avantajlarını elde etmek için her modülü bir mikro hizmet olarak çıkarmak çok mantıklıdır. Bu yüzden monolitik mimariden, mikro servis mimarisine geçiş için modüler yapı bize büyük kolaylık sağlar.

Yine her şey ihtiyaçlara ve sizin bulacağınız çözüme kalır. Fred Brooks’un dediği gibi “No Silver Bullet”.

Modüler yapı ile ilgili daha derine inmek istiyorsanız bu makale serisini şiddetle öneririm.

Domain Driven Design hakkında daha fazlası için aşağıdaki linkten yararlanabilirsiniz.

--

--