Post Page Advertisement [Top]

Merhaba Sevgili Okurlar,    
Microservices aslında yazılımda bir mimari yaklaşımdır. Microservice Architecture olarak isimlendirilir. Biz kısaca yazımızda microservices olarak bahsedelim. Peki nedir bu yaklaşım ?


     Microservices kompleks işi çözmek için bir araya gelmiş, çok sayıda, belirli bir iş için özelleşmiş, bağımsız çalışabilen servisler topluluğudur. Servisler birbirine loosely coupled'dır ve Robert C.Martin'nin Single Responsibilty Prensibine uygun olarak  her bir mikroservis bağımsız olarak yazılım geliştirmeye, deploy etmeye bakım yapmaya(maintenance) ve test etmeye uygundur.




Okurken ne dinlemeli ?

    Gelişen teknoloji ile çok sayıda kullanıcının sistemleri kullanma ihtiyacı doğmuştur. Örneğin Netflix, Amazon, Facebook gibi şirketler dünya çapında müşteriye/kullanıcıya sahip, kesintisiz hizmet(Persistence) vermek zorundalar. Bu da yazılım dünyasında ölçeklenebilirliğin(Scalability)'in önemini artırmış ve microservices mimari pattern'nin oluşmasına katkıda bulunmuştur. Aslında tek sebep bu değildir. Domain-Driven Design'nın yaygınlaşması, CI/CD toollarının gelişmesi, Container ve Bulut teknolojileri ile platform ve infrasturcture otomasyonunu, ve bir de polygot programlama microservices mimarisinin oluşmasına katkıda bulunmuştur. Polygot programming diyorum çünkü farklı mikroservisleri istediğiniz dilde yazabilirsiniz. Bir servisiniz Java dilinde olurken diğeri .Net C# olabilir.  

    Microservislerin en önemli özelliği her bir servisin kendi veri tabanına sahip olmasıdır. Yine polygot programlama açısından baktığımızda bir servis MSSQL veri tabanı kullanırken başka bir servis Oracle kullanabilir. 




Microservices vs. Traditional Architecture


Microservices Architecture

Traditional Architecture (Monolith)

Her servis tek bir işe odaklanır. 
Payment Microservice, Ordering Microservice gibi. Her bir servisin domaini kendine özgüdür. Micro kelimesi küçük anlamına gelmez aslında buradan gelir her servisin kendi scope'u vardır. 

Geniş odak alanı. 
Yazılım, bir çok iş problemini tek alanda çözer. Bu da yazılımı tightly coupled yapar,   kod bağımlıkları artar.
Fault Isolation kolaydır.
Servislerin birinde hata olması durumunda diğer servisler cevap vermeye devam eder.

Fault Isolation zordur.
Yazılımın bir bölümünde hata olduğunda tüm sistem etkilenir.
Sistemi ölçekleme oldukça kolaydır.
Daha önce ölçekleme sanatı yazımda bahsettiğim gibi microservisler Y yönünde ölçekleme amacına hizmet eder.

Sistemi ölçekleme zordur. 
Tam anlamı ile ölçekleme zordur. X yönünde load balancing ile ölçekleme yapılabilir.
Takımlar kendi servis yaşam döngüsünü kendi belirleyebilir. 
Yazılım ekipleri kendi geliştirme ve deployment yaşam döngülerini kolaylıkla belirleyebilirler. Hızlı ve paralel yazılım geliştirmeye uygundur.

Yazılım ekipleri birbirlerine bağlı olarak hareket ederler.
Proje bütün olduğu için yazılım ekipleri release versiyonlarını ve geliştirmelerini yaparken diğer yazılım ekipleri ile kesişirler daha çok iletişim halinde olmalarını gerektirir.
Data domain ihtiyacına göre şekillenir. 
Her microservisin veri tabanı ihtiyaçlara göre tasarlanır ve tüm sistemi düşündüğümüzde data dağıtıktır.
Data yazılımın merkezindedir. 
Yazılım tasarlanırken veri tabanı ve data tasarımından başlandığı için yazılımın merkezinde yer alır.




Microservice Mimarisinin Avantajları

Ölçeklenebilir
Mikroservis Mimarisi ölçekleme ihtiyacı olan sistemler için mükemmel bir çözümdür.

Hızlı Yazılım Geliştirme
Agile development yapısına en iyi uyum sağlayan yazılım geliştirime mimarisidir. iş süreçleri açısından düşünecek olursak müşteri taleplerine hızlı yanıt vermek oldukça büyük bir artıdır.

Esnek
Bug fix ya da improvement gibi durumlarda tüm uygulamayı deploy etmek diğer ekipleri beklemek yerine sadece ilgili serviste  geliştirme yapılır ve deployment ve test gerçekleştirilebilir. Daha az side-effect oluşur.

Adaptasyonu Kolay
Yeni başlayan yazılımcılar tüm application'u kavramak yerine sadece ilgili servise odaklanarak kolaylıkla kavrayabilirler. Yeni ve farklı teknolojiler kolay adapte edilebilir.

Microservice Mimarisinin Dezavantajları

Karmaşıklık
Servis bazında bakıldığında sistem daha anlaşılır ve sade hale gelir. Fakat büyük resme baktığımızda Tek bir monolitic uygulamayı parçalara bölerek küçük servislerin iş bölümü ve haberleşmesi yönetilmesi daha karmaşık hale gelir. Aşağıdaki görsel Netflix'in mikroservis mimarisinin genel yapısıdır.



Artan Maliyet 
Servislerin farklı sunuculara deploy edilmesi bir çok runtime environment ve CPU, RAM demek ve bu da artan maliyet olarak görülür.

Performans
Bütün bir uygulamaya kıyasla dağıtık yapıda olan mimari haberleşmesi farklı sunucularda servislerin barınması yüzünden performans düşüklüğü yaşanabilir.

Microservice Mimarisinde Yaşanabilecek Zorluklar

Dağıtık bir mimari tasarlamak
Alışılan yazılım kalıbının dışına çıkmak zor olabilir. Monolitic yapıda olan bir mimari dağıtık hale getirmek ve her bir domainin çok doğru belirlenmesi gerekir. Her servisin ne iş için özelleşeceği tasarlanmalı ve diğer servisleri ile etkileşimleri düşünülmelidir.

Deployment 
Microservis mimarisini geçmeyi düşünüyorsanız manuel deployment sizi oldukça zorlayacaktır. Eskiden tek olan uygulamanız bir çok farklı servise bölünüp sayıları arttığı için size uygun bir CI/CD alanı oluşturup otomatik deployment yapmalısınız.

Monitoring ve Logging
Artık bu mimari ile birlikte monitoring ve logging büyük önem kazanıyor. Her bir servisinin durumunu takip etmek için bir monitoring alt yapısı kurulmalı. Logging yazılım geliştiriciler için en kritik noktalardan biri haline geliyor. Sistemde oluşan hata merkezi loglama sayesinde kolayca bulunabilir.

Debugging
Bir çok servis birbiri ile haberleşip iş akışını tamamladığı için debugging artık eskisi kadar kolay olmayacaktır.

Integration Testing
Debugging'e benzer şekilde test için de bir çok servis birbirine ihtiyaç duyduğu için test aşaması da eskiye göre zor olabilir.

Konfigürasyon Yönetimi
Bir çok farklı servis var ve bu servislerin de dev, test ve prod ortamları olduğunu düşünürsek servis konfigürasyonlarını merkezi olarak yönetmek gerekecektir.

Bir çok servisten data toplamak (Retrieve Data From Several Microservices)
Kullanıcıya sunulacak son data bir kaç mikroservisin veri tabanından gelmesi gerekebilir. Böylece bir çok mikroservis ile etkileşimde olup data toplayan  çözümler bulmalıyız. API Gateway ya da CQRS with query/reads tables gibi.

İletişim
Servislerin birbirleri ile, API Gateway ile haberleşmesi ya da mobil ya da web uygulamaları ile haberleşme yöntemlerinin doğru belirlenmesi ve yönetiminin sağlanması gerekir.


Veri tutarlılığının sağlanması (Consistency)
Daha önce de bahsettiğimiz gibi her bir servisin kendi veri tabanı olmalıdır ve bir servis diğer servisin veri tabanına direct olarak erişemez hal böyle olunca ACID transaction olacak işlemlerde tutarlılık nasıl sağlanabilir? Saga Pattern ya da benzeri çözümler olsa da eğer kritik gördüğünüz işleriniz varsa örneğin finans kritik işler gibi bu işlemleri bölünmeye uğratmamalısınız. CAP Teoremi'ninde söylediği gibi ya Availability ya da Consistency'den birini seçmeliyiz. İlerleyen yazımda sizlere daha detaylı bahsedeceğim.

Microservice Mimarisini Seçmeli miyiz ?
  • Yüksek transaction'a mı sahipsiniz ? Kesintisiz hizmet mi vermelisiniz ?
  • Organizasyonunuz kendi kendine yetebilen takımlara bölünmeye hazır mı ? Takımlar bu servisleri geliştirmek için gerekli bilgiye sahip mi ?
  • Deployment'i insansız yapacak bilgi ve donanımınız var mı ?
  • Hangi yazılımlarınız microservice mimarisine çevrilmeli ? Çevrilebilir ?
  • Artan maliyet için bütçeniz var mı ?
Okuduğunuz için teşekkür ederim. Hoşça kalın.




Kaynaklar:
https://medium.com/hashmapinc/the-what-why-and-how-of-a-microservices-architecture-4179579423a9
https://phoenixnap.com/kb/introduction-to-microservices-architecture
https://tanzu.vmware.com/microservices
https://www.clariontech.com/blog/5-best-technologies-to-build-microservices-architecture
https://blog.api.rakuten.net/microservices-architecture/
https://www.guru99.com/microservices-tutorial.html
https://docs.microsoft.com/en-us/dotnet/architecture/microservices/architect-microservice-container-applications/distributed-data-management
https://eng.uber.com/microservice-architecture/



Hiç yorum yok:

Yorum Gönder

Bottom Ad [Post Page]