Son Haberler
Anasayfa / AGILE & SCRUM / Microservice Mimarisi

Microservice Mimarisi

Microservice tek bir sorumluluğa sahip olan, tek iş yapan ve yaptığı işe ait sorumlulukları yürüten modüllere ayrılmış projelerdir. Bu servisler birbirinden bağımsız olarak bakımı yapılabilir, izlenebilir (monitoring) ve dağıtılabilir yapıya sahip olmalıdır.

Daha iyi anlamamız için Monolithic Architecture (yani Katmanlı Mimari olarak isimlendirdiğimiz yapı) ile karşılaştırarak birbirlerine göre avantaj ve dezavantajlarını kıyaslayabiliriz.

Monolithic Architecture :

Avantajları :

  • Eğer uygulama küçükse yönetilebilirlik ve monitoring (yani izleme) herhangi bir yerde bir sıkıntı olursa debug etmek daha kolaydır.
  • Küçük çaplı bir proje olduğu için bakımı kolaydır.
  • Katmanlar birbirine yakın olduğu için haberleşme kolaydır.
  • Transaction yönetimi kolaydır.

Dezavantajları :

  • Hangi dille başladıysak mesela C# olsun, o zaman tüm projeyi C# diliyle geliştirmek zorundayız veya bir framework kullanıyorsak bu framework’e bağlıyız.
  • Uygulamanın büyüdükçe projeyi yönetilebilir olmasının zorlaşması.
  • ÖLÇEKLENDİRME PROBLEMİ (SCALE ETMEK) : Bir e-ticaret sitesi düşünelim; Kullanıcılar bir e-ticaret sitesinde en çok nereyle meşgul ? Anasayfa, Ürünler, Ürün Detay sayfaları. Genellikle bir e-ticaret sitesinde sipariş ekle sayfası, sepete ekle sayfaları daha az görünen sayfalardır. Eğer uygulamam bir darboğaza girdiğinde ( yani çok fazla istek vs geldiğinde) ve burada Scale işlemi gerçekleştirmek istediğinde sadece ürün sayfalarını göstermekten sorumlu olan sayfaları Scale yapamazsın. Projenin tamamını Scale yapmak zorundasın.

 

Microservice Architecture :

Birbirinden bağımsız olarak hayatlarını sürdürebilen, gelişebilen ve birbiri ile haberleşebilen servislerdir.

Avantajları :

  • Microservices’ler bağımsızca deploy edilebilir. Yani herhangi bir Microservice yapısında yapılan değişiklik doğrudan deploy edilebilir ancak bu monolithic yapıda mümkün değil çünkü orada bir katmanda yapılan değişiklik gerçekleşmesi için diğer katmanlarda yapılan işlemlerinde tamamlanması gerekir.
  • Microservices’ler bağımsızca Scale edilebilir. Scale In veya Scale Out duruma göre gerçekleştirilir.
  • Microservices’lerimizdeki hata izolasyonunun düşük olması. Bu şu anlama geliyor. Bir microservice herhangi bir bir microservice Down olduğunda uygulamanız hayatta kalmaya devam eder. Örneğin; birden fazla microservices olsun. Herhangi biri sepet esnasında indirimden sorumlu olsun yani kullanıcı bir indirim kodu girdiğinde indirim gerçekleşecek. Eğer bu microservice Down olursa uygulama hayatta kalmaya devam eder. Kullanıcılar sadece sepet esnasında indirim uygulayamazlar. Ama bir monolithic mimaride herhangi bir yerde bir hata olduğunda uygulamanın tamamını etkileyebilir.
  • Microservice kullanımı  sonucunda daha küçük bir codebase oluşacağı için Teams’lere kodun daha kolay anlaşılabilmesi için imkan tanır ve projenin daha basit şekilde sürdürülebilmesine olanak tanır.

Dezavantajları :

  • Birbirinden bağımsız servisler olduğu için bu servisler arasındaki iletişim daha complex olacak ve yönetmek çok daha zor olacak.
  • Her servisin kendine ait bir veritabanı olacağından dolayı burada transaction ciddi bir şekilde başımızı ağrıtabilir.Burada SAGA gibi çeşitli Design Pattern’ler uygulayarak Distribute Transaction tarafında her bir soruna karşılık çeşitli patternlar var ve bunları kullanarak bu sorunu aşmaya çalışıyoruz. Ama Monolithic Mimaride genellikle tek bir veritabanı olduğu için orada çok fazla transaction ile ilgili bir problemimiz yoktur.
  • Projeyi debug etmek çok daha zor bir hale geliyor.
  • Monitoring : Projemizi izlemek istediğimizde, loglamak istediğimizde ve bunları bir araya getirmek Monolithic Mimariye göre çok daha zordur.

Microservice arasında iletişim nasıl gerçekleşir ?

Microservice’ler arası iletişim senkron ve asenkron olarak gerçekleşir.

Senkron İletişim (Synchronous Communication) : Bir microservice diğer bir microservice’e istek yaptıktan sonra eğer sonucu bekliyorsa bu senkron bir iletişimdir.

Asenkron İletişim (Asynchronous Communication) :  Asenkron iletişimde ise genellikle bizim bir Message Broker (Örnek : RabbitMQ) sistemimiz vardır. Bir microservice başka bir microservice ile iletişime geçmek istediğinde Message Broker sistemine bir mesaj gönderir ve bu mesajı dinleyen diğer bir microservice ise o mesajı alır. Yani kısaca burada bir servis mesaj gönderdiğinde sonucunu beklemez.