Dağıtık Kilit ve Fencing Token — Kilit Senin Sandığında
Önce şunu oku: @Scheduled ve ShedLock — Cron İşi Kaç Pod'da Çalışıyor?
30 saniyede özet
Süreli bir dağıtık kilit, sahibi uzun süre durursa sessizce başkasına geçer. Uyanan eski sahip kilidin hâlâ kendisinde olduğunu sanır ve yazar. Fencing token ile kararı yazılan yer verir: eski numarayla gelen yazma reddedilir.
Tek kişilik bir park yeri için numaralı fiş veriliyor ve her fiş on dakika geçerli. Fişi alan kişi arabada uyuyakalıyor; fişin süresi doluyor ve yer bir başkasına veriliyor. Uyanan ilk kişi elindeki fişe bakıp park etmeye çalışıyor.
-
Bayt: Gece faiz işi iki sunucuda çalışıyor ama dağıtık kilit var. Yalnızca biri faiz ödeyebilir!
-
Sen: Bu sabah bir müşteriye günün faizi iki kez yatmış.
-
Bayt: Kilit vardı... ikisi aynı anda nasıl çalışabildi?
-
Bayt: Belki aynı anda değil, sırayla. Biri kilidin hâlâ kendisinde olduğunu sanmış olabilir.
Kilit neden süreyle verilir?
distributed lockBirden çok süreç arasında paylaşılan kilit; genellikle bir veritabanı satırı ya da Redis anahtarı. Aynı işin aynı anda yalnızca bir yerde çalışmasını sağlar.Sözlükte gör →, birden çok sunucudan yalnızca birinin bir işi yapmasını sağlar. Ama kilidi tutan sunucu çökerse kilidi hiç bırakmaz ve iş sonsuza kadar bekler.
Bu yüzden kilit bir süreyle verilir: bir leaseBir kilidin ya da hakkın belirli bir süre için verilmesi. Süre dolunca hak kendiliğinden düşer; sahibi çökse bile sistem takılmaz.Sözlükte gör →. Süre dolunca kilit kendiliğinden serbest kalır ve başka bir sunucu alabilir.
Kafam karıştı, daha basit anlat
Kilit, sahibi çökerse sonsuza kadar kalmasın diye bir süreyle verilir.
Dağıtık kilit ne işe yarar?
Dağıtık kilit neden bir süreyle (lease) verilir?
Süre dolarken uyuyan iş
A kilidi 10 saniyelik bir süreyle aldı ve 12 saniyelik bir GC duraklamasına girdi. Bu sırada B kilidi alıp faizi ödedi. A uyandığında ne yapar? Cevabı göster
Faizi o da öder. A duraklamayı fark etmez; ona göre bir an önce kilidi almıştı. Kilidin süresinin dolduğunu bilmediği için yazmaya devam eder.
Adım adım oku
- A 33 numaralı fişi aldı, sonra uyuyakaldı.
- Fişin süresi doldu, B 34 numarayı aldı.
- A uyandı; görevli yalnızca en yeni numarayı kabul eder.
- Son sözü kapıdaki görevli söyler.
Duraklama yalnızca GC değildir: ağ gecikmesi ya da yavaşlayan bir disk de aynı şeyi yapar. Yazmadan hemen önce “kilit hâlâ bende mi?” diye sormak da yetmez, çünkü soru ile yazma arasında da durabilirsin.
Çözüm fencing tokenKilit her verilişinde artan bir numara. Yazılan yer gördüğü en büyük numaradan küçüğünü reddeder ve eski kilit sahibinin geç yazmasını durdurur.Sözlükte gör →: kilit her verilişinde artan bir numara verir. Yazılan yer, gördüğü en büyük numaradan küçük olanı reddeder; böylece eski sahibin geç yazması kapıda kalır.
Kafam karıştı, daha basit anlat
Kilidin sahibi duraklamayı fark etmez. Numaralı token ile kararı yazılan yer verir.
A kilidi 10 saniyelik süreyle aldı ve 12 saniyelik bir GC duraklamasına girdi. Ne olabilir?
Fencing token nedir?
Kendin gör
Kilit süresi dolarken uyuyan iş
Tohum 79297- ▭ kilit süresi
- ⚠ GC duraklaması
- | şu an: 0 sn
Oynat ya da adımla: her adım dört saniye.
Defter: 0 faiz kaydı (+0)
Şu an ne oldu?
Uzun GC duraklaması (12 sn)
Kilit 10 saniyelik bir süreyle veriliyor. A kilidi alıp faiz ödemeye başlıyor.
Görevler0/3
Faizi iki kez ödetaçık
İpucu
Varsayılan ayarlar yeter.
Uzun duraklamada bile faizi bir kez ödeaçık
İpucu
Kararı defter versin.
Fencing olmadan, A işini kilit süresi içinde bitirsinaçık
İpucu
Duraklamayı kısalt.
Olay günlüğü (0)
Henüz olay yok. Oynat veya adımla.
- Varsayılanla oynat. Uzun duraklama, fencing yok: kilidin süresi doldu, B faizi ödedi, A uyanınca bir kez daha ödedi.
- “Defter fencing token kontrol etsin”i aç. A’nın 33 numaralı token’la gelen geç yazması reddedildi; faiz bir kez ödendi.
- Fencing’i kapat, “Kısa GC duraklaması” seç. A işini kilit süresi dolmadan bitirdi; sorun hiç çıkmadı.
Yazmadan hemen önce "kilit hâlâ bende mi?" diye sormak neden yetmez?
Defter en son 34 numaralı token'ı gördü. 33 ile bir yazma geldi. Ne yapmalı?
Tuzaklar
Kilidi doğruluk garantisi sanmak. Kilit çoğu zaman yalnızca aynı işin iki kez yapılmasını azaltır. Para gibi önemli işlerde son kontrolü yazılan yerde yap: fencing token, benzersiz bir anahtar ya da idempotent bir yazma.
Süreyi işten kısa seçmek. İş normalde 30 saniye sürüyorsa 10 saniyelik bir süre, duraklama olmadan da kilidi kaçırır. Süreyi işin en uzun hâlinden belirgin biçimde uzun tut.
Token’ı yazılan yerde kontrol etmemek. Token’ı kilitten alıp hiçbir yerde karşılaştırmazsan hiçbir şeyi korumaz. Kontrol, verinin yazıldığı yerde ve aynı işlemde yapılmalı.
Kafam karıştı, daha basit anlat
Kilit tek başına yetmez; süreyi uzun tut ve token’ı yazılan yerde kontrol et.
İş normalde 30 saniye sürüyor ve kilit süresi 10 saniye. Sorun nedir?
Aşağıdaki örnek bir bankanın gece faiz işinden: kilit token’ı bir sayaçtan alınıyor ve defter, gördüğü en büyük token’dan küçüğünü aynı işlemde reddediyor.
Derinleş · Gece faiz işi: dağıtık kilit ve fencing token 4 dosya · ~80 satır · ilk okumada atlayabilirsin
Kendini sına
Süreli bir kilidi alan sunucu, kilidin hâlâ kendisinde olduğunu her zaman bilir.
Fencing token kilitten alınıyor ama hiçbir yerde karşılaştırılmıyor. Ne olur?
Aklında kalacak üç şey
- 1 Dağıtık kilitler bir süreyle (lease) verilir, çünkü sahibi çökebilir. Bedeli şu: sahibi uzun bir duraklamada kalırsa kilit, o fark etmeden başkasına geçer.
- 2 Uyanan eski sahip kilidin hâlâ kendisinde olduğunu sanır. Yazmadan hemen önce kontrol etmek de yetmez; kontrol ile yazma arasında yine durabilir.
- 3 Fencing token, her kilit verilişinde artan bir numaradır. Yazılan yer gördüğü en büyük numaradan küçüğünü reddederse, eski sahibin geç yazması zarar veremez.
4 kart sonraki derste seni bekliyor