Sorunun Tarihçesi
Dağıtık deadlock tespiti, 2010'ların ortalarında monolitik mimarilerden ince taneli mikro hizmetlere geçiş sırasında kritik bir endişe olarak ortaya çıktı. Erken dağıtık sistemler, yüksek kullanılabilirlik ve bölüm toleransı gerektiren bulut yerel ortamlar için yetersiz kalan zaman aşımına dayalı iptallere veya merkezi kilit yöneticilerine dayanıyordu. Chandy-Misra-Haas algoritması, dağıtık grafiklerde kenar takip etmenin teorik temellerini oluşturdu, ancak pratik uygulamalar gürültülü ağ koşullarında ve heterojen hizmet yığınlarında zorluklar yaşadı. Modern mimariler, merkezi koordinasyon olmadan çalışan otonom tespit mekanizmaları talep etmektedir.
Problem
Mikro hizmet ekosisteminde, işlemler sıklıkla birden fazla hizmet ve kalıcılık teknolojisini kapsayarak, Hizmet A'nın PostgreSQL'de bir kilit tutarken Hizmet B'yi beklediği ve Hizmet B'nin de Hizmet A'yı beklediği dağıtık döngüler yaratmaktadır. Merkezi deadlock dedektörleri, mikro hizmetlerin özerklik ilkelerini ihlal ederek tek hata noktaları ve ağ noktaları oluşturur. Zaman aşımına dayalı yaklaşımlar, yüksek gecikme koşullarında yanlış pozitiflerle karşılaşmaktadır ve yavaş işlemleri gerçek deadlock'lardan ayırt edememektedir. Temel zorluk, düzensiz, bölünmüş bir grafikte döngüleri tespit etmeyi gerektirir; burada düğümler başarısız olabilir veya bildirimsiz hale gelebilir.
Çözüm
Mimari, Kubernetes aracılığıyla dağıtılan Envoy yan hizmetleri içinde yerleştirilmiş Chandy-Misra-Haas dağıtık kenar takip etme algoritmasını kullanır. Her yan hizmet, yerel bir bekleme grafiğini sürdürür ve döngüleri tespit etmek için senkronize gRPC çağrı zincirleri boyunca Lamport zaman damgaları ile birlikte sorgu mesajları yayar. Redis kümeleri, sorgu kaybını yönetmek için TTL süresiyle geçici bekleme ilişkilerini depolarken, Kafka iş öncelik puanlarını saklayan etcd'de mağdur seçimlerine göre çözüm komutlarını yayınlar. Sistem, kontrol düzlemi bölünmeleri sırasında sorgu yayılımı için dedikodu protokollerini kullanarak, güvenliği riske atmadan canlılığı sağlar.
Problem Tanımı
Yüksek frekanslı bir ticaret platformunda Kara Cuma etkinliği sırasında, ödeme düzenleme hizmeti döviz kurları üzerinde kilitleme yaparken ardışık hatalar yaşadı. Java tabanlı FX hizmeti, bir Go tabanlı uyum doğrulayıcı ile senkronize olduğunda, mevcut yönlü bağımlılık, 15.000 eş zamanlı işlemi on sekiz dakika boyunca dondurdu. Gelir kayıpları 2 milyon doları geçti, çünkü hizmetler arasındaki senkronize REST çağrıları deadlock'a neden oldu, bu da AWS altyapısında ardışık devre kesici hatalarını tetikledi. Olay, veritabanı düzeyindeki zaman aşımının, heterojen teknoloji yığınlarını kapsayan hizmetler arası döngüleri tespit etmedeki yetersizliğini ortaya çıkardı.
Değerlendirilen Farklı Çözümler
Başlangıçta, tüm kaynak kilitlerini hizmetler arasında takip eden küresel bir işlem yöneticisi olarak merkezi bir Oracle RAC veritabanı dağıtmayı düşündük. Bu yaklaşım, standart grafik algoritmaları kullanarak basit döngü tespiti ve anında çelişki çözümü sağladı. Ancak, bu, 99.999% kullanılabilirlik garantisi gerektiren felaket bir hata noktası oluşturmuş ve her işlem başına 200ms ek gecikme getirmiştir. Ağ bölünmeleri sırasında, yöneticinin kullanılamaz hale gelmesi, tüm ödeme işlemlerinin küresel olarak dondurulmasına neden oldu, sorunu izole etmek yerine.
Ekip, beş saniyeyi aşan herhangi bir işlemi sonlandırmak ve jitter ile yeniden denemek için agresif bir zaman aşım stratejisini değerlendirdi. Bu, koordinasyon yükünü ortadan kaldırdı ve Istio sanal hizmet yapılandırmaları dışında hiçbir altyapı değişikliği gerektirmedi. Ne yazık ki, yüksek yük altında %40 yanlış pozitif iptal ile büyük thrashing'e neden oldu, çünkü meşru yavaş sorgular deadlock olarak yanlış bir şekilde algılandı. Ortaya çıkan yeniden deneme fırtınaları hizmet ağını aşırı yükleyerek, orijinal deadlock'lardan daha kötü bir sıkışıklık yarattı ve gecikme SLA'larını ihlal etti.
Dağıtık bir kenar takip etme mekanizmasını, uygulama kodunu değiştirmeden hizmet ağında sorgu mantığını enjekte etmek için Envoy WASM filtreleri kullanarak analiz ettik. Her yan hizmet, 30 saniyelik TTL'li yerel bir Redis akışına bekleme kenarlarını yayınlayacakken, arka planda çalışan bir ajan, Chandy-Misra-Haas sorguları kullanarak döngüleri kontrol edecekti. Mağdur seçimi, yüksek gelirli işlemlerin önceliklendirilmesi için etcd'den iş kritikliği puanları sorgulayarak gerçekleştirilir, böylece düşük öncelikli toplu işler önce sonlandırılır. Bu mimari, %100'den düşük tespit gecikmesi vadediyor ve dedikodu tabanlı sorgu iletim yöntemleriyle tamamen AWS bölgesel kesintileri yaşatmaya dayanıyordu.
Seçilen Çözüm ve Neden
Kenara takip etme yaklaşımını seçtik çünkü bu, hizmet özerkliğini korudu ve merkezi koordinasyonun kullanılabilirlik risklerini ortadan kaldırdı. Çözüm, ana çerçeve yükseltmeleri gerektirmeden hizmet örneği sayısı ile yatay olarak ölçeklendi, ve WASM filtreleri, kod değişiklikleri olmaksızın %Java ve %Go mikro hizmetleri için çok dilli destek sağladı. Tespiti altyapı katmanına entegre ederek, deadlock çözümünü iş mantığı evriminden ayırdık ve tespit yeteneklerinin bağımsız olarak ölçeklenmesine olanak tanıdık.
Sonuç
Dağıtım sonrasında, deadlock kaynaklı kesintiler altı aylık işletim süresince sıfıra indi, iki büyük satış olayı dahil. Tespit gecikmesi, 20 kat trafik zirveleri sırasında bile %85'lik p99 ile stabil kaldı, otomatik çözüm yüksek öncelikli işlemlerin %99.98'ini korurken simüle edilmiş bölgesel kesintiler sırasında. Geliştirici verimliliği arttı, ekipler özel zaman aşımı mantığını kaldırdı, olay müdahale süresini saatlerden otomatik saniyelere düşürerek yıllık tahmini 5 milyon dolarlık gelir kaybını önledi.
Gerçek dağıtık deadlock'ları ve ağ gecikmesi jitter veya sıradışı sorgu tesliminden kaynaklanan yanlış pozitifleri nasıl ayırt edersiniz?
Adaylar sıklıkla, bekleme bağımlılıklarının sebeplerini belirlemek için sorgu mesajlarında vektör saatleri veya Lamport zaman damgalarının gerekliliğini göz ardı ederler. Mantıksal zaman damgaları olmadan, gecikmeli bir sorgu, bir işlemin kilitlerini serbest bıraktıktan sonra gelirse, yanlış bir şekilde bir döngü gösterebilir ve gereksiz iptallere yol açabilir. Çözüm, sorgular üzerinde TTL sayaçları uygulamayı ve bir deadlock ilan etmeden önce ters yol bildirimi gerektirmeyi gerektirir; bu, geçici ağ gecikmelerinin yanlış mağdur seçimleri tetiklemesini sağlamaktadır.
Veritabanı yerel deadlock tespiti, çok dilli kalıcılık mimarisinde hizmetler arası deadlock'ları neden çözemez?
PostgreSQL ve MongoDB, yalnızca kendi süreç sınırları içinde döngüleri tespit eder, PostgreSQL'de bir satır kilidi tutarken MongoDB'de bir belge kilidini bekleyen bir işlemin durumu gibi, veritabanlarının dışındaki durumlardan habersizdir. Adayların, genellikle heterojen depolama sistemlerinde dağıtılmış bekleme grafikleri yeniden yapılandırmak için OpenTelemetry aralıklarını aletleştirmek suretiyle uygulama düzeyi veya hizmet ağı aletleştirmesinin gerekli olduğunu açıklamaları gerekir.
Ağ bölünmeleri sırasında sistem canlılığını nasıl korursunuz ve aynı deadlock'un birden fazla izole alt grup tarafından ikiye ayrılma çözümünü nasıl engellersiniz?
Bu, dağıtık sistemlerde kullanılabilirlik ve güvenlik arasındaki gerilimi ortaya koyar. Bölünmeler sırasında, hizmetler deadlock olan akranlar ile ulaşılamayanlar arasında ayrım yapamazlar; bu, adayların ya kullanılabilirliği göz ardı eden veya yanlışlıkla yeniden iptallere yol açan çözümler önermesine neden olur. Doğru yaklaşım, yalnızca ulaşılabilir düğümler arasında mağdur seçimi için Byzantine fault-tolerant uzlaşmayı uygulamak ve bekleme grafiği uzlaştırması için CRDT'ler (Çatışmasız Özellikle Tekrar Edilebilir Veri Türleri) kullanmaktır ; bu, bölünmeler iyileştiğinde sistemin, düzeltme gerektirmeden tutarlı bir çözüme ulaşmasını sağlar.