Teknik Belge

Mikroservislerde veri tutarlılığı için referans mimari önerileri

Servis sınırlarının veri sahipliğine göre belirlenmesi



Mikroservis mimarisinde parçalı işlemlerde iki aşamalı commit sıklıkla sorun çıkarır. Koordinatör hazırlık aşamasında katılımcılardan onay bekler, ancak ağ gecikmesi durumunda bazı servisler kilit açmaya devam edebilir. Bu durum kaynakların gereksiz yere kilitli kalmasına yol açar. Koordinatörün çökmesi hâlinde katılımcılar kararsız kalabilir ve işlem belirsiz bırakılabilir. Bu nedenle yeniden deneme mekanizmaları titizlikle tasarlanmalıdır. Ekipler ayrıca güvenilir günlük tutarak kararların sistematik kurtarılabilmesini sağlar. Yüksek ölçekli sistemlerde bu yaklaşım kullanılabilirlik açısından belirgin bedeller doğurabilir. Bu yüzden birçok mimar, senkron bağımlılık yerine daha esnek çözümlere yönelmektedir. Yine de bu tercih, veri bütünlüğü konusunda ek sorumluluklar getirir. Geliştiriciler, hangi işlemlerin kesin tutarlılık gerektirdiğini dikkatle belirlemelidir. Böylece sistem hem istikrarlı hem de verimli kalabilir. Sonuç olarak iki aşamalı commit, kontrollü kullanıldığında değerli bir araç olsa da dikkatsizce uygulandığında ciddi tutarsızlıklara yol açabilir.


Servisler arası nihai tutarlılık yaklaşımı, bütün servisin verisinin anında eşitlenmesini beklemeden çalışmasına izin verir. Bu model, geniş erişilebilirlik isteyen sistemlerde önemli bir seçenektir. Bir servis veriyi güncellediğinde, diğer servisler bu değişikliği mesaj aracılığıyla bir süre sonra öğrenir. Ancak bu gecikme sürecinde kullanıcılar bayat verilerle karşılaşabilir. Örneğin bir sipariş onaylandığında, stok servisi henüz güncellenmemiş olabilir. Bu tür durumlar, uygulamanın geri bildirim akışında dikkatle ele alınmasını gerektirir. Geliştiriciler genellikle iyimser durum gösterimleri kullanarak bu boşluğu kapatmaya çalışır. Ayrıca güvenli işleyiciler yazmak, aynı mesajın birden fazla kez işlenmesi durumunda tutarlılığı korur. Ağ hataları ve mesaj kayıpları planlanarak tasarlanmazsa, veri sapmaları zamanla büyüyebilir. Bu nedenle izleme ve mutabakat süreçleri otomatik olarak çalıştırılmalıdır. Sonuçta nihai tutarlılık, doğru bir şekilde uygulandığında hem performansı hem de esnekliği güçlendirir.


Saga deseni, dağıtık iş akışlarını bağımsız yerel işlemlere bölerek yönetir. Her adım tamamlandığında bir sonraki adım başlatılır, herhangi bir adım başarısız olursa önceki adımların düzeltilmesi gerekir. Bu geri alma işlemlerine telafi işlemi denir ve sıklıkla ters yönde çalışan işlevler olarak tasarlanır. Örneğin ödeme alındıktan sonra rezervasyon başarısız olursa, sistem ödemeyi iade eden bir telafi işlemi çalıştırır. Ancak bazı işlemler kesin olarak geri alınamaz, örneğin gönderilmiş bir e-posta. Bu durumda ekipler işlevsel bir telafi tanımlamak zorunda kalır. Saga karma yaklaşımıyla uygulanabilir ve her biri ayrı avantajlar sunar. Orkestrasyonda merkezi bir koordinatör adımları yönetirken, koreografide servisler olayları izleyerek ilerler. Telafi işlemlerinin yeniden çalıştırılabilir olması, hataların kurtarılması açısından kritiktir. Ayrıca her adımın durumunun izlenebilir olarak saklanması, sürecin tutarlı ilerlemesini sağlar. Sonuç olarak saga deseni, dağıtık işlemleri esnek biçimde yönetmek için güçlü bir araçtır.


Olay kaynaklı mimaride mesajların doğru sırada işlenmesi, veri tutarlılığı açısından temel bir konudur. Olaylar, farklı bölümlerden geldiğinde ağ gecikmeleri nedeniyle beklenmedik sırada ulaşabilir. Örneğin bir ürünün güncellenmesi olayı, oluşturulma olayından önce işlenirse sistem tutarsız bir duruma düşebilir. Bu sorunu çözmek için sürüm bilgileri kullanılabilir. Kafka gibi kuyruk tabanlı sistemler, aynı anahtara ait olayların sıralı işlenmesini sağlar. Ancak farklı anahtarlar arasındaki sıralama genellikle garanti edilmez. Geliştiriciler, ilişkili olayları aynı bölüme yönlendirerek bu sorunu önleyebilir. Yinelenen olaylar da ek bir zorluk oluşturur ve işleyicilerin idempotent olmasını gerektirir. Olay sırasının bozuk olduğunu fark etmek için mutabakat kontrolleri yapılabilir. Bazı ekipler, eksik olayları tamponlamak için ara katmanlar kullanır. Sonuç olarak olay sıralaması, disiplinli bir tasarım gerektiren önemli bir konudur.


Dağıtık önbellek, sık erişilen verileri ana veritabanından ayırarak performansı artırır. Ancak önbellek ile kaynak veritabanı arasında veri farkı oluştuğunda, uygulama eski bilgi sunabilir. Bu uyumsuzluk, genellikle güncelleme işlemlerinde önbelleğin geç yenilenmesinden kaynaklanır. Yazma sonrası silme stratejileri bu sorunu azaltmak için kullanılır. Örneğin bir kayıt güncellendiğinde ilgili önbellek anahtarı hemen silinebilir. Ancak eşzamanlı okuma ve yazma işlemleri tutarsızlıklara yol açabilir. Bir okuma işlemi eski veriyi önbelleğe yazarken, başka bir güncelleme doğru veriyi kaydetmiş olabilir. Bu tür durumlar için sürüm numaraları mekanizmaları kullanılabilir. Önbellek süresinin ayarlanabilir tutulması da sapmaların etkisini sınırlar. Ayrıca önbellek isabet oranları düzenli izlenerek sorunlar erken tespit edilebilir. Sonuç olarak dağıtık önbellekte tutarlılık, bilinçli bir strateji ve kapsamlı izleme ile sağlanabilir.


Dağıtık servis mimarisinde her servisin kendi veritabanına sahip olması temel bir ilke olarak kabul görür. Ancak bu izolasyon, veri tutarlılığını ciddi biçimde zorlaştıran bir risk alanı yaratır. Mikroservisler arası çağrılarda tek bir ACID transaction uygulanamadığı için sipariş ve ödeme gibi ilişkili veriler farklı zamanlarda güncellenebilir. Bu durumda bir adım tamamlanmış görünürken diğeri yarım kalabilir. Geliştiriciler bu tür yarım kalmış işlemleri tespit etmekte gecikebilir. Saga desenleri bu boşluğu kapatmak için sıkça tercih edilir. Ancak her telafi adımının ayrı hata senaryosu olduğunu unutmamak gerekir. Sonuç olarak izolasyonun sağladığı esneklik, ancak dikkatli tasarlandığında kalıcı bir fayda üretir.


Yinelemeye dayanıklı mesaj işleme, iletişim kaynaklı tekrarların zararsız kılınması için kritik bir stratejidir. Her mesaja benzersiz bir tanımlayıcı atandığında, tüketici önceden işlenmiş kimlikleri bir tabloda saklayarak yinelenen mesajları görmezden gelebilir. Bu yaklaşım en çok ödeme ve envanter benzeri kritik alanlarda büyük değer taşır. Tekrar denetimi ile iş mantığı tek bir işlem içinde çalıştırıldığında mükerrer kayıt riski ortadan kalkar. Kimi mimariler bunun için outbox tablosunu kullanır. Bu sayede veri değişikliği ile olay gönderimi atomik hale gelir. Ancak tekil kimliklerin sınırsız büyümesi disk maliyetini artırabilir. Dolayısıyla belirli bir saklama süresi belirlemek yararlı olur. Sonuçta idempotensi, mimarinin her katmanında düşünülmesi gereken temel bir niteliktir.


Mesajlaşma altyapıları kaybolan veya tekrarlanan mesajlar oluşturabilir ve bu durum tutarlılığı doğrudan tehdit eder. Bağlantı sorunları, aracı sunucu çökmeleri ve acknowledgement gecikmeleri olayın kaybolmasına yol açabilir. Bu riski azaltmak için yayıncılar genellikle retry mekanizmalarına yönelir. Ancak bu mekanizma mükerrer teslimatları birlikte getirir. Dayanıklı kuyruklar, kalıcı depolama ve onay protokolleri sayesinde kayıp ihtimali düşürülebilir. Alıcı tarafta ise sıra numaraları ve dead letter kuyrukları takibi artırır. Olayların sıralaması değiştiğinde durum makineleri yanlış geçişler üretebilir. Bu yüzden sıralama gereksinimleri net biçimde tanımlanmalıdır. Özetle kayıp ve yineleme problemleri, tek bir çözümle yalnızca katmanlı bir stratejiyle çözülebilir.


Birden çok düğümde paylaşılan kaynaklara eşzamanlı erişim, race condition sık rastlanan hale getirir. Yerel süreç içindeki kilit yapıları, ağ üzerinden çalışmaz. Böyle durumlarda dağıtık önbellek temelli lock veya Zookeeper gibi çözümler kullanılır. Fakat kilit süresinin dolması ve client çöküşleri beklenmedik durumlar yaratabilir. Fencing token kullanımı bu riski büyük ölçüde hafifletir. Kilidi tutan geçersiz bir tokenla güncelleme yapması engellenir. İyimser kilitleme ise sürüm alanlarıyla çakışmaları belirler. Hangi stratejinin tercih edileceği iş yükünün rekabet oranına bağlıdır. Sonuç olarak kilitleme, basit bir teknik olmaktan çıkıp özenli bir mimari kararıdır.


Ağ bölünmesi anında CAP kuramı gereği consistency ve erişilebilirlik arasında bir tercih yapmak zorunda kalırız. Ayrılan düğümler birbirinden bilgisiz olmadan veri eklemeye devam ederse çelişen durumlar oluşur. Güçlü tutarlılık tercih edildiğinde sistem kimi çağrıları geri çevirmek durumunda kalır. Eventual consistency ise kullanıcıya geçici uyumsuz veriler gösterebilir. Bu kararın doğru alınması iş ihtiyaçlara bağlıdır. Bankacılık sistemleri çoğunlukla doğruluğu önceliklendirirken, sosyal medya servisleri sürekliliği önceler. Ayrışma sonrası uzlaştırma süreçleri tasarlanmalıdır. Kısaca ağ bölünmesi durumları baştan hesaplanmamış sistemleri büyük tehlikelerle karşı karşıya getirir.


Mikroservis mimarisinde tutarlılığın temel kavramları


Mikroservis mimarisinde her servis genellikle kendi veritabanını barındırır, bu da tek bir işlemin birden fazla veri deposunu kapsadığı durumlarda tutarlılığı karmaşıklaştırır. Monolitik yapılarda veritabanı işlemleri ACID özellikleriyle garanti edilir, oysa dağıtık ortamda ağ gecikmeleri, servis kesintileri ve kısmi hatalar belirir. Bu noktada eventual consistency yaklaşımı, yani nihai tutarlılık, birçok ekip tarafından kabul gören bir model haline gelmiştir. Sistemin anlık olarak her zaman aynı veriyi göstermesi yerine, belirli bir süre içinde tüm kopyaların eşitleneceği garanti edilir. Bu yaklaşım, performans ve ölçeklenebilirlik açısından ciddi kazanımlar sunar. Ancak her iş senaryosu için bu modelin uygun olmayabileceği unutulmamalıdır. Örneğin bir bankacılık işleminde bakiye bilgisinin anlık doğruluğu temel gerekliliğe sahipken, bir ürün inceleme sayısının birkaç saniye gecikmesi pek çok durumda kabul edilebilir. Dolayısıyla tutarlılık gereksinimleri her servis ve her veri akışı için ayrı ayrı belirlenmelidir. Bu temel kavramların iyi anlaşılması, sonraki tasarım kararlarının tutarlı bir temele oturtulmasını sağlar.


En çok düşülen tutarlılık tuzakları


Mikroservis projelerinde en bilinen hatalardan biri, dağıtık işlemleri tek bir veritabanı transaction'ı gibi düşünmek ve iki servis arasında iki aşamalı commit (two-phase commit) mekanizmasını ilk tercih olarak uygulamaktır. Bu yaklaşım, servislerin birbirine sıkı biçimde bağlanmasına ve ağ arızalarında sistemin tamamının işlevsiz kalmasına yol açabilir. Bir diğer yaygın hata, olay yayınlama ile veritabanı güncellemesinin bağımsız işlemlerde yapılmasıdır; veritabanı kaydı başarılı olurken mesaj broker'ına gönderim kesildiğinde sistemde kalıcı tutarsızlıklar oluşur. Ayrıca idempotent olmayan tüketici servisler, aynı mesajın birden fazla kez işlenmesi durumunda çift kayıt veya yanlış bakiye gibi veri bozulmalarına neden olabilir. Birçok ekip ayrıca hata durumlarında telafi (compensation) işlemlerini eksik düşünerek ilerler ve saga desenini yanlış uygular. Son olarak, izleme ve gözlemlenebilirlik altyapısının ihmal edilmesi tutarsızlıkların tespit edilmesini zorlaştırır. Bu hataların farkında olmak, ekiplerin daha güvenilir sistemler kurmasının ilk adımıdır.


Deneyimli mimarlardan öneriler

Deneyimli mimarların önerisi, tutarlılık ihtiyacını tasarımın ilk aşamasında analiz ederek her iş akışını ayrı ayrı sınıflandırmaktır. Outbox deseni, veritabanı güncellemesi ile olay kaydını aynı yerel transaction içinde atomik olarak saklayarak mesaj gönderiminde oluşan kopukluğu büyük ölçüde önler. Tüketici tarafında ise her mesaj için benzersiz bir kimlik tutarak tekrar işlemeyi engellemek mümkündür. Saga desenini uygularken orkestrasyon ile koreografi arasındaki farkı iyi değerlendirmek, ekibin büyüklüğüne ve iş akışının karmaşıklığına göre uygun modeli vermeye yardımcı olur. Telafi işlemlerinin her adım için baştan planlanması da hata senaryolarında sistemin öngörülebilir kalmasını sağlar. Ayrıca dağıtık izleme araçları ve korelasyon kimlikleri kullanarak bir işlemin servisler arasındaki yolculuğunu takip etmek önemli bir avantaj sağlar. Periyodik olarak çalışan mutabakat (reconciliation) işleri, beklenmedik farkları erken aşamada yakalayarak düzeltme sürecini kolaylaştırır.


Maliyet ve bütçe planlaması


Mikroservislerde veri tutarlılığını sağlamanın maliyeti, yalnızca yazılım geliştirme süresiyle sınırlı değildir; mesaj broker'ları, olay depoları, izleme araçları ve ek test altyapısı da bütçeye ciddi yük getirir. Bulut tabanlı bir mesajlaşma servisi kullanıldığında, mesaj hacmine bağlı olarak aylık işletme giderleri beklenmedik ölçüde artabilir. Bu nedenle ekiplerin, tutarlılık seviyesini yükseltmenin maliyetle iş değerini karşılaştırarak karar vermesi gerekir. Her servis için güçlü tutarlılık zorunlu tutulduğunda, altyapı ve geliştirme maliyetleri katlanarak büyüyebilir. Öte yandan kritik olmayan veri akışlarında nihai tutarlılık tercih edildiğinde, hem işletme maliyeti düşer hem de sistemin esnekliği artar. Bütçe planlamasında, ilk yıl için pilot bir kapsam belirleyip gerçek yük verileriyle maliyet tahminini güncellemek faydalı olur.


Trafik dalgalanmalarında tutarlılık


Tutarlılık mekanizmalarının başarısı, sistemin trafiğin arttığı anlarda nasıl davrandığına da bağlıdır. Kampanya dönemleri, bayram tatilleri veya yıl sonu gibi mevsimsel zirvelerde mesaj kuyrukları hızla birikebilir ve tüketici servisler gecikmeli işlemeye girebilir. Bu nedenle ekiplerin, yük testlerini bu dönemlerin öngörülen hacmini baz alarak yapması önemlidir. Kuyruk derinliği ve işleme gecikmesi için uyarı eşikleri tanımlamak, sorunların büyümeden fark edilmesini sağlar. Ayrıca bakım pencerelerini ve veri senkronizasyon işlerini yoğunluk dışı saatlere planlamak hem performansı hem de tutarlılığı korumaya yardımcı olur. Büyük yeniden işleme (replay) operasyonları gerektiğinde ise bu işlemlerin kademeli olarak yapılması sistemin kararlılığını korur.


Okurların merak ettikleri konular

Okurların en çok sorduğu konulardan biri, mikroservislerde her zaman nihai tutarlılığın yeterli olup olmadığıdır; cevap, verinin önemine ve iş kuralının gerektirdiği garantiye bağlıdır. Bir diğer soru, dağıtık transaction'ların tamamen terk edilmesi gerekip gerekmediğidir; genellikle hayır, ancak küçük ve kontrollü kapsamlarda kullanılmalıdır. Ekipler ayrıca olay sıralamasının korunup korunmadığını nasıl kontrol edeceklerini sorar; bu konuda bölüm anahtarları ve sıralı kuyruklar önemli rol oynar. Veri tutarsızlığı tespit edildiğinde ilk yapılması gereken, sorunun kaynağını adım adım belirlemek ve ardından telafi veya düzeltme sürecini başlatmaktır. Son olarak, küçük bir ekip için en uygun başlangıç noktasının genellikle basit bir outbox ve idempotent tüketici yapısı olduğu, zamanla gereksinim arttıkça daha gelişmiş desenlere evrilebileceği söylenebilir.

Yanıtla
Dogal olarak guzel bir paylasim, boyle devam.
Yanıtla
Mikroservislerde veri tutarlılığı için referans ile ilgili faydali bir degerlendirme olmus, eline saglik.
Yanıtla
Bu konuda daha once hic bu kadar faydali bir belge okumamistim.
Yanıtla
Bu konuda daha once hic bu kadar bilgilendirici bir veritabani okumamistim.
Yanıtla

Forumdan Konular