Bulkhead — Tek Yavaş Servis Neden Herkesi Düşürür?
Önce şunu oku: Circuit Breaker
30 saniyede özet
Bütün dış çağrılar aynı thread havuzunu paylaşırsa, yavaşlayan tek bir bağımlılık thread'leri tutar ve sağlam servislere giden istekler de reddedilir. Her bağımlılığa ayrı bir havuz vermek hasarı o bölmede tutar.
Bir gemide su geçirmez bölmeler vardır. Gövde tek parça olsaydı, tek bir delik bütün gemiyi doldururdu. Bölmeler sayesinde yalnızca delik olan bölme su alır, gemi yüzmeye devam eder.
-
Bayt: Bakiye, havale ve kart sağlayıcısı aynı uygulamadan çağrılıyor. Basit ve düzenli!
-
Sen: Kart sağlayıcısı biraz yavaşladı. Şimdi müşteriler bakiyelerini de göremiyor.
-
Bayt: Ama bakiye servisi sapasağlam! Loglarında tek bir hata yok.
-
Bayt: Hata bakiye servisinde değil. Bakiyeye gidecek thread kalmamış olabilir.
Hata nasıl yayılır?
Uygulama dış servisleri bir thread poolGörevleri sabit ya da sınırlı sayıda, yeniden kullanılan thread'e dağıtan yapı. Her görev için yeni thread açmanın bellek ve zamanlama maliyetini önler.Sözlükte gör → çağırır. Her çağrı, cevap gelene kadar bir thread’i tutar.
Bir bağımlılık yavaşlarsa onun çağrıları thread’leri uzun süre bırakmaz. Havuz bir süre sonra tamamen yavaş çağrılarla dolar; sağlam servislere giden yeni istekler de thread bulamaz ve reddedilir.
Kafam karıştı, daha basit anlat
Yavaş bir servis thread’leri tutar. Ortak havuz dolunca sağlam servislere de thread kalmaz.
Yavaşlayan bir dış servis, hata vermese bile neden başka isteklere zarar verebilir?
Bütün dış çağrılar 10 thread'lik tek havuzu paylaşıyor ve kart sağlayıcısı yavaşladı. Bakiye istekleri ne olur?
Her bağımlılığa bir bölme
Kart sağlayıcısına 4, bakiyeye 3, havaleye 3 thread'lik ayrı havuzlar verdik. Kart sağlayıcısı yavaşladı. Bakiye istekleri ne olur? Cevabı göster
Hiç etkilenmez. Kart havuzu dolar ve kart istekleri reddedilir, ama bakiyenin kendi üç thread’i vardır. Yavaş kart çağrıları o thread’lere dokunamaz.
Adım adım oku
- Gövde tek parça: bir delik.
- Su her yere yayıldı, gemi battı.
- Araya su geçirmez bölmeler.
- Bir bölme dolar, gemi yüzmeye devam eder.
bulkheadHer bağımlılığa ayrı ve sınırlı bir kaynak havuzu vermek. Yavaşlayan bağımlılık kendi havuzunu doldurur, servisin geri kalanı çalışmaya devam eder.Sözlükte gör →, her bağımlılığa ayrı ve sınırlı bir havuz vermektir. Bir bağımlılık yavaşlarsa yalnızca onun bölmesi dolar; hata yayılmaz.
Bölmenin içini de bir zaman aşımı rahatlatır. Yavaş çağrı altı saniye yerine iki saniyede bırakılırsa, kart thread’leri daha çabuk boşalır ve daha çok kart isteği geçer.
Kafam karıştı, daha basit anlat
Her bağımlılığa ayrı havuz: biri dolsa da öbürleri çalışır. Zaman aşımı, dolan havuzun daha çabuk boşalmasını sağlar.
Bulkhead nedir?
Ayrı havuzlarda kart sağlayıcısı yavaşlarsa ne olur?
Kendin gör
Kart sağlayıcı yavaşladı
Tohum 352667Oynat ya da adımla · 3. saniyeden sonra kart çağrıları yavaş
Ortak havuz (10 thread)
- Kart sağlayıcı✓ 0✕ 0 red
- Bakiye✓ 0✕ 0 red
- Havale✓ 0✕ 0 red
Şu an ne oldu?
Herkese tek havuz
Her saniye 9 istek geliyor. 3. saniyeden sonra kart çağrıları 6 saniye sürüyor.
Görevler0/3
Sağlam bakiye servisine giden istekler de reddedilsinaçık
İpucu
Herkes tek havuzu paylaşsın.
Kart istekleri reddedilsin ama bakiye ve havale hiç etkilenmesinaçık
İpucu
Her bağımlılığa ayrı bölme.
Bakiye ve havale etkilenmesin, reddedilen kart isteği 12 ya da daha az olsunaçık
İpucu
Bölme ve zaman aşımı birlikte.
Olay günlüğü (0)
Henüz olay yok. Oynat veya adımla.
- Varsayılanla oynat. Üçüncü saniyeden sonra ortak havuz kart çağrılarıyla doldu; bakiye ve havale istekleri de reddedildi.
- Zaman aşımını aç. Daha az red var, ama sağlam servislerde hâlâ red görünüyor.
- Ayrı havuzları seç, zaman aşımını kapat. Bakiye ve havale hiç etkilenmedi; yalnızca kart istekleri reddedildi.
- Zaman aşımını da aç. Bölmeler yerinde, reddedilen kart isteği de azaldı.
Ortak havuza zaman aşımı eklemek tek başına yeterli midir?
Bulkhead havuzunda queue-capacity: 0 ne sağlar?
Tuzaklar
Havuzu çok büyük açmak. Kart havuzuna yüz thread vermek bölmeyi anlamsız kılar; yavaş çağrılar yine bütün belleği ve bağlantıları tüketir. Boyutu gerçek trafikten ölç.
Reddi bir hata gibi göstermek. Dolu bölmeden gelen ret, müşteriye “kart işlemleri şu an yoğun, birazdan tekrar dene” gibi sakin bir cevap olmalı. Aynı ekrandaki bakiye ise çalışmaya devam eder.
Bulkhead’i circuit breaker sanmak. Breaker sürekli hata veren servise istek göndermeyi durdurur; bulkhead ise yavaş bir servisin başkalarını boğmasını engeller. Birbirini tamamlarlar.
Kafam karıştı, daha basit anlat
Havuz boyutunu ölç, reddi sakin bir cevaba çevir, breaker ile bölmeyi birlikte kullan.
Kart havuzu doluyken müşteriye ne gösterilmeli?
Derinleş · Bankacılık API'si: bağımlılık başına bölme 4 dosya · ~78 satır · ilk okumada atlayabilirsin
Kendini sına
Yavaş bir çağrı, hata vermediği sürece başka isteklere zarar vermez.
Bulkhead ile circuit breaker arasındaki fark nedir?
Aklında kalacak üç şey
- 1 Ortak bir thread havuzunda yavaş çağrılar thread'leri uzun süre tutar. Havuz dolunca sağlam servislere giden istekler de reddedilir: hata yayılır.
- 2 Bulkhead, her bağımlılığa ayrı ve sınırlı bir havuz verir. Bir bağımlılık yavaşlarsa yalnızca onun bölmesi dolar, diğerleri çalışmaya devam eder.
- 3 Zaman aşımı thread'leri daha çabuk serbest bırakarak hasarı küçültür; bölme ise hasarın nereye kadar yayılacağını sınırlar. İkisi birlikte kullanılır.
4 kart sonraki derste seni bekliyor