Monolithic Applications vs. Micro Services

Ali Kizildag
Kariyer.net Tech
Published in
2 min readNov 17, 2018

--

İçerisinde birbiri ile bağımlı veya bağımsız modüller bulunduran, tek instance olarak sunucu(lar) üzerinde çalışan uygulamalara monolithic uygulamalar diyoruz. Sadece tek katmandan oluşan uygulamalara da monolithic uygulamalar denilmektedir. Günümüzde bir çok uygulama monolithic yapıda çalışmaktadır. Monolithic yapıların; tek bir code base üzerinden geliştirilmesi, deployment esnasında sadece bir release paketi oluşturulması gibi avantajları bulunmaktadır. Peki bu yapılar beraberinde hangi sınırlamaları getiriyor ve ne gibi verimsizliklere sebebiyet veriyor beraber inceleyelim.

  1. Ölçeklenebilirlik(Scalability)

Ölçeklenebilirlik, monolithic yapılarda yüksek maliyetli ve verimsiz olabilmektedir. Uygulamalarımızın herhangi bir modülünde yaşanan bir dar boğaz nedeni ile veya başka bir sebepten dolayı ölçeklendirmek istediğimizde, bir bütün olarak ölçeklendirmek zorunda kalırız. Bu da gereksiz yere diğer modülleri de ölçeklendirdiğimiz anlamına gelir ve verimsiz kaynak kullanımlarına sebebiyet verir.

Daha somut bir örnek üzerinden incelersek; içerisinde Account, Product Search ve Basket Service isimli 3 adet servisleri olan monolithic bir E-commerce uygulamamız olduğunu farz edelim. Muhtemelen bu uygulamada en çok kullanılan modül, Product Search Service içerisindeki ürün arama/listeleme modülü olacaktır. Diyelim ki E-ticaret uygulamamızın kullanıcı sayısı arttı ve ürün arama/listeleme modülünde büyük bir dar boğaz oluştu. Uygulamamızı dikey olarak ölçeklendirmek istediğimizde uygulamanın bir instance’ını kopyalayıp yeni sunuculara deploy etmek zorunda kalırız. Bu durumumda Product servisinin yanı sıra diğer az kullanılan servisleri de gereksiz yere dikey olarak ölçeklendirmiş oluruz.

Monolithic Application

2. Çeviklik (Agility)

Günümüzde gereksinimler oldukça hızlı değişmektedir. Uygulamalarımız değişen gereksinimlere hızlı adapte olmalıdır. Monolithic uygulamalar içerisindeki modüller üzerinde değişiklik yapmak maliyetli ve risklidir. Özellikle değişiklik yaptığımız modül diğer modüllerle strongly coupled (sıkı sıkıya bağlı) ise yaptığımız değişiklik diğer modülleri de etkileyecektir. Ayrıca bu tarz hataları yakalayabileceğimiz unit testlerimiz veya regresyon testlerimiz yoksa hatayı ancak production’da fark edebiliriz. Dolayısıyla bu durum hem bakım, hem test hem de deployment maliyetlerini arttıracak ve zaman kaybına sebebiyet verecektir.

3. Kullanılabilirlik ( Availability)

Monolithic uygulamalarda uygulamanın tüm modülleri tek bir instance olarak host edildiğinden, sunucuda veya network üzerinde yaşanacak bir problem sonucu tüm modüller erişilemez olabilir.

4. Deployment

Monolithic uygulamalar tek bir release paketi ile bir bütün olarak deploy edilir. Uygulama içerisinde yapılan küçük/büyük geliştirmeleri(bu bir bug fix olabilir veya yeni bir feature olabilir) production’a göndermek istediğimizde değişiklik yapılmayan kısımlar da gereksiz yere gönderilmiş olacaktır. Bu da geçiş esnasında yapılan geliştirme ile alakası olmayan modüllerde availability, fault-tolerance açısından problemler meydana getirebilir.

5. Hata Toleransı (Fault-Tolerance)

Monolitchic uygulama içerisindeki herhangi bir modülde hata meydana geldiğinde bu modüle bağlı diğer modüller de düzgün çalışmayabilir veya tüm modüller tek bir veritabanına bağlı ise veritabanından kaynaklanan bir problem nedeni ile tüm modüller yine erişilemez olacaktır.

--

--