Backpressure ve Yük Atma — Kuyruk Dolarsa Ne Olur?
Önce şunu oku: Rate Limiting — Kapıdan Saniyede Kaç Kişi Geçer?
30 saniyede özet
Bir kuyruk kısa bir patlamayı emer, ama sürekli fazla yükü çözmez: yalnızca geciktirir. Sınırsız kuyrukta bekleme süresi ve bellek durmadan büyür. Sınırlı kuyruk ya fazlasını hızlıca reddeder ya da çağıranı yavaşlatır.
Saatte 100 ekmek pişiren bir fırın düşün. Sabah kalabalığında kapıda sıra oluşur, öğlene doğru erir. Ama her saat 120 kişi gelirse sıra hiç erimez; her saat biraz daha uzar.
-
Bayt: Bildirim servisimiz hiçbir isteği reddetmiyor. Hepsini kuyruğa alıyor, hepsini işliyor!
-
Sen: Kullanıcılar bildirimlerin dakikalar sonra geldiğini söylüyor.
-
Bayt: Ama hiçbiri kaybolmadı... yalnızca çok bekledi.
-
Bayt: Kaybolmamak ile zamanında gelmek ayrı şeyler. Kuyruğun içine bakalım.
Kuyruk neyi çözer?
Bir servis saniyede 100 istek işliyorsa, kısa süreli 150’lik bir patlamayı önündeki kuyruk emer. Patlama geçince kuyruk erir ve herkes biraz gecikmeyle de olsa cevap alır.
Gelen yük sürekli 120 ise hesap değişir: kuyruk her saniye 20 istek büyür. Hiçbir istek reddedilmez, ama hiçbiri de zamanında cevap almaz.
Kafam karıştı, daha basit anlat
Kuyruk kısa kalabalığı emer. Sürekli fazla yükte ise yalnızca büyür.
Bir servisin önündeki kuyruğun asıl işi nedir?
Servis saniyede 100 işliyor, saniyede sürekli 120 istek geliyor ve kuyruk sınırsız. 10 saniye sonra kuyrukta kaç istek olur?
Bekleme ne kadar?
Servis saniyede 100 istek işliyor ve önünde 200 istek bekliyor. Kuyruğa yeni giren bir istek yaklaşık kaç saniye bekler? Cevabı göster
Yaklaşık 2 saniye. Önündeki 200 isteğin işlenmesi, saniyede 100 hızla 2 saniye sürer.
Adım adım oku
- Sabah kalabalığı: sıra uzar, sonra erir.
- Her saat kapasiteden fazla insan gelirse sıra hep uzar.
- Sıra sınırı: ya 'sonra gelin' ya da 'şimdilik gönderme'.
- Kuyruk patlamayı emer; sürekli fazlalığı çözmez.
Bu hesap Little yasasıKuyruktaki iş sayısı, geliş hızı ile ortalama bekleme süresinin çarpımıdır (L = λW). Kuyruk büyürse bekleme de aynı oranda büyür.Sözlükte gör →ndan gelir: bekleme süresi, kuyruk uzunluğunun işleme hızına bölümüdür. Kuyruk büyüdükçe bekleme de aynı oranda büyür.
Sürekli fazla yükte iki dürüst seçenek var. Kuyruğu sınırlayıp fazlasını hızlıca reddetmek load sheddingKapasite aşıldığında fazla istekleri bilerek ve hızlıca reddetmek (örneğin 429). Kabul edilenlerin zamanında cevap almasını korur.Sözlükte gör →dır; kuyruk doluyken çağıranı bekletmek ise backpressureÜretici tüketiciden hızlı olduğunda akışı yavaşlatma mekanizması. Kuyruk büyütmek backpressure değildir — sadece çöküşü erteler.Sözlükte gör →.
Kafam karıştı, daha basit anlat
Bekleme, kuyruk uzunluğu bölü hız. Fazla yükte ya fazlasını geri çevir ya da göndereni yavaşlat.
Saniyede 100 işleyen bir servisin önünde 200 istek var. Yeni gelen bir istek yaklaşık ne kadar bekler?
Load shedding (yük atma) ile backpressure arasındaki fark nedir?
Kendin gör
Kuyruk dolarsa ne olur?
Tohum 831741- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Oynat ya da adımla: her adım iki saniye.
Şu an ne oldu?
Sınırsız kuyruk · Sürekli fazla yük (120/sn)
Servis saniyede 100 istek işliyor. Fazlası bir yere gitmek zorunda.
Görevler0/3
Hiçbir isteği reddetmeden beklemeyi 2 saniyeye çıkaraçık
İpucu
Varsayılan ayarlar yeter.
Sürekli fazla yükte beklemeyi yarım saniyede tutaçık
İpucu
Bir kısmını hızlıca geri çevir.
Kısa bir patlamayı hiç reddetmeden em ve kuyruğu boşaltaçık
İpucu
Kuyruğun asıl işi bu.
Olay günlüğü (0)
Henüz olay yok. Oynat veya adımla.
- Varsayılanla oynat. Sınırsız kuyruk, sürekli fazla yük: bekleme 2 saniyeye çıktı ve büyüyor.
- “Reddet” politikasına geç. Bekleme yarım saniyede kaldı, fazlası 429 aldı.
- “Çağıranı beklet” seç. Reddedilen yok, ama baskı yukarıya taşındı.
- Yükü “kısa patlama” yap, sınırsız kuyrukla oynat. Patlama emildi ve kuyruk boşaldı.
- Aynı patlamayı “reddet” ile dene. Sınır küçük olduğu için 50 iyi istek reddedildi.
Kısa bir patlamada (2 saniye 150/sn) çok küçük sınırlı bir kuyruk ret politikasıyla kullanıldı. Ne olur?
Java'da new ThreadPoolExecutor(..., new LinkedBlockingQueue<>()) ile kurulan havuzun kuyruğu nasıldır?
Tuzaklar
Sınırsız kuyruk varsayılanı. Birçok kütüphanenin varsayılan kuyruğu sınırsızdır. Fazla yükte sessizce bellek tüketir ve sonunda servisi düşürür; sınırı bilerek koy.
Zaman aşımını unutmak. Kuyrukta 30 saniye bekleyen bir isteğin çağıranı 5 saniyede vazgeçmiş olabilir. Vazgeçilmiş işi yapmak kapasiteyi boşa harcar; kuyruktan çıkarken isteğin hâlâ beklenip beklenmediğine bak.
Reddi hata gibi göstermek. 429 bir kaza değil, bir karardır. Retry-After ile ne zaman tekrar denenebileceğini söyle; çağıranlar da hemen değil, artan aralıklarla tekrar denesin.
Kafam karıştı, daha basit anlat
Kuyruğu sınırla, vazgeçilmiş işi atla, reddi açık ve kibar yap.
Kuyrukta 30 saniye bekleyen bir isteğin çağıranı 5 saniyede vazgeçmişti. İşi yine de yapmanın sorunu nedir?
Aşağıdaki örnek bir bankanın bildirim servisinden: sınırlı kuyruk, dolunca hızlı ret, kuyruktan çıkarken süre kontrolü.
Derinleş · Bildirim servisi: sınırlı kuyruk, hızlı ret, süresi geçmiş işi atlama 4 dosya · ~62 satır · ilk okumada atlayabilirsin
Kendini sına
Sınırsız bir kuyruk sürekli fazla yükü çözer, çünkü hiçbir isteği reddetmez.
Bir istemci 429 aldıktan sonra hemen ve sürekli tekrar deniyor. Ne olur ve nasıl düzeltilir?
Aklında kalacak üç şey
- 1 Kuyruk kısa patlamaları emmek içindir. Gelen yük işleme kapasitesini sürekli aşıyorsa kuyruk her saniye büyür; hiçbir istek reddedilmez ama her biri daha uzun bekler.
- 2 Bekleme süresi, kuyruk uzunluğunun işleme hızına bölümüdür. Saniyede 100 işleyen bir servisin önünde 200 kişilik kuyruk, yeni gelen için 2 saniye bekleme demektir.
- 3 Sürekli fazla yükte iki dürüst seçenek var: fazlasını hızlıca reddetmek (yük atma) ya da çağıranı yavaşlatmak (backpressure). Sınırsız kuyruk sorunu yalnızca saklar.
4 kart sonraki derste seni bekliyor