Miroservices Tasarım İlkeleri

Mikro servislerin daha stabil olarak çalışması için uyulması gereken tasarım ilkeleri; Uyumluluk, Bağımsızlık, Merkezilik, Esneklik, İzlenebilirlik ve otomasyon'dur. Bu ilkelerin her birinin ayrı ayrı olarak hayata geçirilmesi uygulama geliştirme, güncelleme, versiyonlama, yayınlama vb. ihtiyaçların karşılanmasında önemli rol oynar.

Uyumluluk

Mikro servislerin güçlü bir bütünlüğe sahip olması gereken bir mimaridir. Tek bir odak noktası belirlenmelidir. Çalışma prensipleri tutarlı ve bir odağa sahip olmalıdır. Her bir API'nin odağı olmalı ve giden, gelen işlemlerin tek bir amaç için çalışması gerekir. Böylelikle her bir API'nin tek bir sorumluluğu olur oluşabilecek API üzerindeki değişikliklerin sadece o kısım için geçerli olacağını belirtir. Ve API'nin hizmetini kontrol edilmesini sağlar.

Mikro servislerin tüm parçalarının tek bir amacı vardır ve onu yerine getirirler. Güçlü bir bütünlüğe sahiptir ve güçlü uyum sağlarlar. Karmaşıklığı minimuma indirir ve geliştiricilerin daha az kod içerisinde daha anlaşılır olarak çalışmasına imkan verir.

Uyumluluk uygulama geliştirme sürecinde uygulamanın amacına, anlaşılmasına, sürdürülebilmesine ve genişletilmesine olanak sunar. Uygulama modüllerinin iyice öğrenilmesi, bu modüller için en iyi mikro servislerin yazılması ve diğer geliştirici ekiplere kolay bir şekilde aktarılması konusunda gayet başarılı sonuçlar doğar. Ve işlevsel bütünlüğe sahip uygulamalar ortaya çıkar.

Uyum mikro servis arasında işbirliği sağlanmasını amaçlar. Mikro servislerin nasıl davranacağı konusunda cevaplar verir ve geliştirilmesine katkı sunar. Oluşabilecek olan özel durumlar için nasıl çözüleceği konusunda nasıl davranmaları gerektiğini bilir ve uygular. Birlikte çalışmaları prensibini hayata geçirir.

Her Mikro servisin direk olarak veri tabanına bağlanması gerekmez ve Ana tablo ile direk bağlantı kurmalarına ihtiyaç olmayabilir. Bazı Mikro servislerin kendine ait bir veritabanı olmalıdır. Daha sonra bu veritabanlarındaki veriler bir servis ile ana tablolara aktarılması sağlanır. Bu kısımda yapılacak olan kurguya göre oluşabilecek bir veri kaybı söz konusu olmaz ve veriler ana veri tabanına sağlıklı bir şekilde aktarılması sağlanır. Burada ki servislerimizin daha da bölünmesi gereken durumların olabileceğini fark etmek gerekir.

Geliştirme süreçlerinde ortaya çıkabilecek talep ve değişiklikliklerden dolayı sadece ilgili API güncellenir. API'nin işlevselliği artar ve geliştirerek her bir mikro serviste yüksek uyum sağlanmış olur. Mikro servislerin boyutu ve kapsamı kontrol edilebilir olur.

Mikro servilerin yüksek uyum içerisinde olduğu sürede güncellemeler rahatlıkla yapılabilir hatta yeniden yazılabilir. Çünkü bağımsız ve daha küçük bir kod parçası ile daha az zamanda işlem yapma olanağı sunulur. Uygulamanın tümü yüksek oranda ölçeklenebilir, esnek ve güvenilir hale gelir. Tüm sistemi ölçeklendirmek yerine küçük kod parçacıklarını ölçeklendirilerek ve daha doğru sonuçlar ortaya çıkar. Bu değişiklik ve ölçeklendirmeleri yaparken diğer mikro servisler etkilenmez.

Bağımsızlık

Mikro servisler birbirlerine bağlı olmayan yapılar şeklinde hazırlanmalıdırlar. Herhangi bir mikro serviste değişiklik olduğu zaman diğer mikro servislerin etkilenmemesi gerekir. Aksi halde herhangi bir mikro serviste yapılacak olan güncelleme diğer bağlantılı mikro servislerin çalışmasını durdurabilir. Mikro servislerin gevşek olabilmeleri için birbirlerine olan bağımlılıkları minimum düzeyde olmalıdır. Mikro servisler arasında iletişimi sağlamak en önemli amaçlardandır. İş algoritmasına göre iletişimi tasarlamak gerekir.

Mikro servisler birbirlerinden bağımsız tasarlandıklarından dolayı olduğunda birbirleri ile olan bağlantıların hatırlanmasına gerek olmaz. Yapılan iyileştirme ve güncelleştirme sonucunda ortaya versiyon farkı çıkmasına rağmen sistem güncellemesi sonrası dahi sistemde herhangi bir özel durum oluşturmaz ve herhangi bir kesintiye uğramaz.

Her mikro servisin kendine ait bir veritabanı olmalıdır. Bu veri tabanı ile diğer mikro servisler arasında veri paylaşması sağlanır. Ortak bir veri tabanı üzerinden veri paylaşılmamalıdır. Çünkü mikro servisler arasındaki sıkı bağlılıklar durumu ortadan kalmasını engeller ve herhangi bir güncelleme olduğu zaman bağlantının kesilmesi ile sonuçlanabilir.

Mikro servisler ağ üzerinden birbirleriyle iletişime geçebilirler. Fiziksel olarak bir bağlantılarının olması gerekmez. Birbirlerine doğrudan bağlı olmadıkları durumlarda ağ üzerinden iletişime geçmektedirler. Mikro servisler başka Mikro servisler ile iletişime geçerek senkronize olabilirler. Birbirleriyle iletişime geçtikleri zaman birbirlerine yanıt vermeleri gerekebilir. Bağımsız olduklarından dolayı verilen görev tamamlanmadan geriye cevap verirler. İşlemler Mesaj Kuyrukları gibi diğer araçlar ile sıraya alınarak işlenir. Görevi sıraya göre ilerleyen mikro servis daha sonra Mesaj Kuyrukları ile iletişime geçerek asıl mikro servise cevap verir. Arada bulunan mesaj kuyrukları mikro servislerin birbirleri ile olan iletişim araçlarına dönüşür.

Mikro servisler mesaj kuyruklarını dinleyerek görevlerini alırlar ve yerine getirirler. Tamamlanan her görev ise diğer mikro servisler tarafından dinlenerek görevi yerine getirir. Burada mikro servisler birbirleri ile doğrudan konuşmak yerine bir mesaj kuyruğunda bulunan iletilere üzerinden işleme geçer. Verileri mesaj kuyrukları ile senkronize ederek güncelleme işlemleri başarılı bir şekilde gerçekleşir. Mikro servislerin bağımsız olarak geliştirilmesine, yönetilmesine ve dağıtılmasına olanak sunulmuş olur.

API üzerinden mikro servislerin çalışabilmesi ile iletişim protokollerini kullanarak .Net tabanlı bir mikro servis ile Java tabanlı bir mikro servisin konuşması sağlanabilir. Dikkat edilmesi gereken şey ilgili mikro servis arasındaki sabit ve kabul edilmiş bir arayüzün olmasıdır. Herhangi bir mikro servis güncellendiğin de geriye dönen veri biçiminde herhangi bir değişiklik olmayacağından geliştirmeler de bağımsız olarak yapılması sağlanacaktır. Burada hangi yazlım dilinin kullanıldığı önemli değildir.

Mikro servislerin birden fazla ekip tarafından aynı zaman diliminde geliştirilmesine olanak sağlar. Geliştirici kiplerinin geliştirme süreçleri basitleşir ve güncellemeler kolay olarak sisteme uygulanır.

Merkezilik

Uzun süreli olarak devam eden mikro servislerin süreçlerinin yönetilmesi gerekir. Herhangi bir mikro servisin başarısız olduğunda yada zaman aşımına uğradığında yeniden mikro servisin çalışma denemesi ve işlemin telafi edilmesi sağlanmalıdır.

Mikro servislerin çalışması sıralı yada paralel olarak gerçekleşebilir. Bazen bir mikro servis birden fazla mikro servise yönlendirilmesi gerekebilir. Bu yönlendirmeler incelenir ve iş kuralına göre işleme alınır. Herhangi bir kuralı karşılanmaz ise istisna olarak tasarlanmış olan iş kurallarına göre tekrardan işleme alınır.

Mesaj filtreleri ile mikro servislerin çalışır ve oluşabilecek olan istisnai sonuçların belirlenen kurallara göre tekrardan işleme alınması sağlanır.

Esneklik

Mikro servislerin en temel ilkelerinden birisi esnek olarak tasarlanmasıdır. Mikro servis mimarisinde esneklik, bir mikro servisin birden fazla iş yaptığı zamanlarda iletişimde olduğu herhangi bir mikro servisin başarısız olduğunda, ortaya çıkan özel olaydan dolayı sistemde bulunan diğer mikro servislerin etkilenmemesidir.

Mikro servisler tasarım aşamasında ortaya çıkabilecek tüm özel durumların tespit edilmesi gerekir. Bu tür özel durumlar olası hatalar, zaman aşımı vb. olaylardan dolayı ortaya çıkabilir. Bu özel durumlar karşısında sistemin başarısızlıklarını giderecek önlemler alınmalıdır. Görevini yerine getiremeyen mikro servis için alınan önlemler devreye girmeli ve bu başarısızlığı hızlı olarak giderilmesini sağlayacak bir sistem tasarlanmalıdır. Burada ortaya çıkabilecek olan özel durumlar sistem yoğunluğu, bağlantı kopyası yada üçüncü part bir uygulamanın yanıt vermemesinden kaynaklanabilir. Mikro servislerin çalışmasını bozabilir.

Birbirleriyle bağlı olarak çalışan mikro servisler de zaman aşımları sorunu ile sık sık karşılaşılır. Zaman aşımı konusu herhangi bir mikro servisin cevap vermesi gereken süre içerisinde cevap vermez ve başarısızlıkla sonuçlanır. Cevap vermeyen mikro servisin kapalı olduğu sonucuna ulaşılır.

Her mikro servisin tanımlanacağı zaman aşımı süresi farklı olarak değerlendirilebilir. Bunun dışında tüm mikro servisler için standart bir zaman aşımı süreli belirlenmelidir. Bağlantı kopmaları, ağ gecikmeleri gibi olası özel durumlar konusunda bilgi sahibi olunmasını sağlayacaktır. Olası özel durumların log olarak tutulması gerekir. Mikro servislerin çalışma zamanında olası karşılaştıkları özel durumların izlenmesine yardımcı olacaktır. Sorunların hızlı ve güvenli olarak giderilmesine katkı sağlayacaktır.

Mikro servis hizmetlerinden herhangi birisinin iş yükü vb. sebeplerden dolayı yanıt vermesi gibi durumlar ortaya çıkacağı zaman bu hizmetin görevini yerine getirecek olan başka bir senaryonun bulunması gerekir. Mikro servis çalışmadığı zaman alternatif olarak onun görevini yerine getirecek olan başka bir mikro servis işlemleri gerçekleştirerek sistemi devam ettirir.

Cevap vermeyen mikro servisler cevap verebilir duruma geldikleri zaman alternatif olan çalışan senaryolar pasif edilir ve ilgili mikro servisler görevlerini yerine getirmeye devam eder. Mikro servisler esnek olmalı ve gelen verileri doğrulamalı ve olası hatalara göre bir önlemi var ise hayata geçirebilmelidir.

İzlenebilir

Mikro servis hizmetleri izlenebilir olmalıdır. Sistem durumunun kontrol edilebilmesi açısından önemlidir. Geliştirilen uygulamalara göre mikro servisler ve bu mikro servisler ile bağlantılı altı mikro servisler vb. bir yapı ortaya çıkacaktır. Ortaya çıkacak bu çoklu yapıda mikro servislerin izlenmesi önem kazanmaktadır.

Mikro servislerin izlenmesi için merkezi izleme sistemi tasarlanmalı ve uygulamanın çalışması sırasında ortaya çıkan izleme verilerini elde etmelidir. Ortaya çıkabilecek herhangi bir mikro servisin özel durumunu izlemeli, ve sistem özellikleri de izlenebilir olarak merkezi izleme sisteminde gösterilmelidir. Elde edilen veriler loglanır ve ileriye dönük iyileştirmelerde yararlı olur. Olası meydana gelecek olan hatalar bu tür izlemeler sonucunda hızlı olarak fark edilir.

Mikro servislerin sürekli olarak kontrol edilmesi ve olası erişememe, özel hata, geç cevap verme vb. sonuçlarını görmek ve izlemek uygulamanın her işleminin günlüğe kaydedilmesi önemlidir. Elde edilecek olan bu verilerin sayesinde uygulama üzerinde hızlı ve güvenilir olarak güncellemeler yapılır ve sistemin güvenli çalışmasına katkı sunar. İzleme ekibi toplanan bu verileri görebilir ve değerlendirebilir. Ortaya çıkan bu veriler ayrıca sunucu özelliklerinin belirlenmesi ve mikro servislerin ölçeklenmesi için kullanılabilir.

Sistemin izlenmesi uygulamanın maliyetini, sunucu özelliklerini, mikro servis özelliklerini ve uygulamayı kullanacak olan kişi sayısı gibi bir çok talebe uygun olarak veri verir ve bu veriler doğrultusunda en doğru biçimde uygulamalar hayata geçirilir. Gelecekte sistemin nelere ihtiyaç duyacağı önceden öngörülür, ileriye dönük daha sağlıklı planlamalar yapılarak hayata geçirilir. Hatta sistemde en çok hangi mikro servisler kullanılıyor ise tespit edilir ve gerekli geliştirme ve önlemler öncelik sırasına göre alınır.

Otomasyon

Mikro servislerde otomatik çalışan araçlara ihtiyaç vardır. Bu otomatik araçlar ile testlerin sürekliliği, mikro servislerin birbirleriyle olan işbirliği gibi bir çok ihtiyacın kontrol edilmesi sağlanır. Testlerinin sürekli manuel olarak yapılması oldukça karmaşık, zor ve zaman alıcı hale gelebilir. Otomatik olarak test eden araçları belirtilen API'lerin testlerini yapar ve geriye bildirim döner. Tüm sistem ve mikro servisler bir bütün olarak kontrol altında tutulur.

Bu tür otomatik kontroller mikro servis sistemleri arasındaki sanal ve fiziksel hedeflerin sürekli birbiri ile çalışabilir olarak ayakta tutar ve ne iş yapacağı önceden belirlendiği için bu mikro servisler yapılandırılır, testleri de sağlanır. Otomatik sistemler çalıştığı sürece mikro servis kontrolleri ile sistemin stabil olarak çalışması sağlanır.

Bir mikro servis hizmetinde dağıtılmış olan ve birden fazla hizmet metodu bulunan mikro servisler sistemine sahip bir sistem bulunur. Böylesine dağıtılmış bir mimari ile geliştirilen uygulamaların manuel olarak entegrasyon, test gibi işlemlerin yapılması hem zor, hemde ciddi zaman alıcı boyutlara ulaşabilir. Uygulamanın çalışma güveni tam olarak elde edilemez. Bu tür sorunları aşabilmek için otomasyon araçları kullanımı zorunludur ve Otomasyon görevinin uygulanması için sürekli olarak entegrasyon ve dağıtım araçlarının kullanılması gerekir.