Ders 09 / 15
Kuyruk Tabanlı Yük Dengeleme
Önceden bilinmeyen ani yükün kuyrukla tamponlanması: kesinti sonrası toplu geri gönderimin varış hızını on kata çıkarırken tampon gereksinimini hiç değiştirmemesi, ek bir yazma akışının aynı varış hızıyla tamponu yüzde altmış yedi büyütmesi, tampon sınırının hacimden hesaplanması ve tamponsuz tasarımın düşürdüğü olayların sayılması.
İçindekiler
Önceki iki dersin iş yükü bir varsayımı sessizce taşıyordu: tepe biliniyor, ne zaman geleceği biliniyor, süresi biliniyor. İlk ders bu bilgiyi K01’in V8 çarpanından ve kendi K1 varsayımından kurmuştu. Gerçek bir akışta üçünün hiçbiri garanti değildir. Taşıyıcının bağlantısı yirmi dakika koptuğunda hiçbir olay gelmez; bağlantı döndüğünde el terminallerinde biriken her şey bir anda gelir ve o anki hızın günün tepesiyle ilgisi yoktur.
Bu ders o ani yükü ele alır. Kuyruk tabanlı yük dengeleme (queue-based load leveling), üretici ile tüketici arasına bir tampon koyup tüketicinin gördüğü hızı üreticinin ürettiği hızdan ayırma kararıdır. Adı Trafik Katmanı kursundaki yük dengeleyiciyi çağrıştırır ve ikisi ayrı şeylerdir: yük dengeleyici bir isteği birden çok kopyaya dağıtır, yani yükü uzayda böler; kuyruk tabanlı yük dengeleme aynı tüketiciye giden yükü zamana yayar. İlk dersten farkı da bir cümleyle söylenir: orada düzlenen şey öngörülen günlük profildi, burada düzlenen şey öngörülmeyen bir sıçramadır.
İki Ayrı Ani Yük
Ani yük tek bir olgu değildir ve bu dersin savı ikisinin ayrılmasıdır. İki varsayım kurulur; ikisi de bu kursun kendi varsayımıdır ve K01’in tablosuna eklenmez.
K4 — taşıyıcı kesintisi: 20 dakika. Gerekçe: taşıyıcının el terminalleri kapsama dışında kaldığında taramalar cihazda birikir ve bağlantı döndüğünde toplu gönderilir. Kesinti tepe penceresinin içine düşer; geri gönderilen olay sayısı 1200 × 97,22 = 116.667’dir. Bu bir hız olayıdır: hacim değişmez, aynı olaylar daha kısa sürede gelir. Ne kadar kısa sürede geldiği tekrar gönderim çarpanı R ile ölçülür ve iki, dört, on değerleriyle koşulur.
K5 — ek yazma akışının süresi: 1 saat. Gerekçe: yeni bir taşıyıcı bağlandığında ya da bir kampanya dönemi açıldığında tepe penceresine bir saatlik ek akış girer. Ek akışın hızı tepeye eşit alınır; eklenen olay sayısı 3600 × 97,22 = 350.000’dir. Bu bir hacim olayıdır: varış hızı yalnız iki katına çıkar, ama sistemin o gün işleyeceği toplam iş büyür.
Duyarlılıkları doğrusaldır: kesinti iki katına çıkarsa geri gönderilen olay, ek akış iki katına çıkarsa eklenen olay iki katına çıkar. Ayrımın neden önemli olduğu ölçümden çıkacak.
Model
Düzenek ilk dersin günlük profilini aynen kullanır: tepe 97,22 olay/s, K1 gereği üç saat, tepe dışı 23,15 olay/s. Üstüne iki olaydan biri eklenir. Tüketici kapasitesi ilk dersin seçtiği değerdir, tepenin yarısı. Kuyruk sınırı da bir parametredir; sıfır sınır tamponsuz tasarımı, yani kapasiteyi aşan her olayın geri çevrilmesini ifade eder — bu davranış Önbellekleme, Kuyruklar ve Eşzamansız İşleme kursunda yük boşaltma adıyla kurulmuştu ve burada yalnız karşılaştırma tabanı olarak kullanılıyor. Model olduğu için sonuçlar belirlenimlidir ve makineden bağımsızdır.
// duzleme/ani-yuk.mjs — ani yukun iki bicimi: kesintiden sonra toplu geri gonderim (hiz artisi, // hacim sabit) ve ek bir yazma akisi (hacim artisi). MODEL: tur bir saniyedir, gunluk profil // 01. dersle aynidir. Sonuclar belirlenimlidir (hesap sinifi) ve makineden bagimsizdir. const GUN = 86_400; const GUNLUK_OLAY = 2_800_000; // K01: gunluk durum olayi const TEPE = (GUNLUK_OLAY / GUN) * 3; // K01 hesabi + V8: tepe yazma olay/s const TEPE_BAS = 9 * 3600, TEPE_SN = 3 * 3600; // K1: 3 saatlik tepe penceresi const DISI = (GUNLUK_OLAY - TEPE * TEPE_SN) / (GUN - TEPE_SN); const K4 = 20 * 60; // bu kursun varsayimi K4: tasiyici kesintisi (s) const K5 = 3600; // bu kursun varsayimi K5: ek akisin suresi (s) const BAS = TEPE_BAS + 2400; // her iki olay da tepe penceresinin icinde const olagan = (t) => (t >= TEPE_BAS && t < TEPE_BAS + TEPE_SN ? TEPE : DISI); function kosum({ kapasite, sinir, R = 1, kip = "yok" }) { let kalan = 0, birikme = 0, dusen = 0, enYuksek = 0, bosalma = -1, gelenToplam = 0; const OLC = 2 * GUN; for (let t = 0; t < 4 * GUN; t += 1) { const g = t % GUN; let gelen = olagan(g); if (kip === "tekrar") { if (g >= BAS && g < BAS + K4) { kalan += gelen; gelen = 0; } else { const ek = Math.min(kalan, (R - 1) * TEPE); kalan -= ek; gelen += ek; } } else if (kip === "hacim" && g >= BAS && g < BAS + K5) gelen += TEPE; const yer = sinir === 0 ? kapasite : sinir - birikme; const alinan = Math.min(gelen, Math.max(0, yer)); if (t >= OLC && t < OLC + GUN) { dusen += gelen - alinan; gelenToplam += gelen; } birikme += sinir === 0 ? Math.min(alinan, kapasite) : alinan; birikme -= Math.min(birikme, kapasite); if (t >= OLC && t < OLC + GUN && birikme > enYuksek) enYuksek = birikme; if (bosalma < 0 && t > OLC + TEPE_BAS && birikme < 1 && kalan < 1) bosalma = t - OLC - TEPE_BAS; } return { dusen, gelenToplam, enYuksek, bosalma, bekleme: enYuksek / kapasite }; } const varisi = (o) => (o.kip === "tekrar" ? o.R * TEPE : o.kip === "hacim" ? 2 * TEPE : TEPE); const satir = (ad, o) => { const r = kosum(o), v = varisi(o); console.log(`${ad.padEnd(24)} ${v.toFixed(0).padStart(7)} ${o.kapasite.toFixed(2).padStart(8)} ` + `${r.dusen.toFixed(0).padStart(7)} ${r.enYuksek.toFixed(0).padStart(9)} ` + `${(r.bekleme / 3600).toFixed(2).padStart(11)} ` + `${(r.bosalma < 0 ? NaN : r.bosalma / 3600).toFixed(2).padStart(11)} ` + `${(v / o.kapasite).toFixed(2).padStart(7)}`); }; console.log(`K01 tepe yazma ${TEPE.toFixed(2)} olay/s; K4 kesinti ${K4} s -> ` + `${(TEPE * K4).toFixed(0)} olay geri gonderilir`); console.log(`K5 ek akis ${K5} s x ${TEPE.toFixed(2)} olay/s -> ${(TEPE * K5).toFixed(0)} olay eklenir\n`); console.log("tasarim varis/s kapasite dusen birikme bekleme(sa) bosalma(sa) duzleme"); satir("tamponsuz, olay yok", { kapasite: TEPE, sinir: 0 }); satir("tamponsuz tekrar R=4", { kapasite: TEPE, sinir: 0, R: 4, kip: "tekrar" }); satir("tamponsuz hacim", { kapasite: TEPE, sinir: 0, kip: "hacim" }); satir("kuyruk 0.5x, olay yok", { kapasite: TEPE / 2, sinir: Infinity }); for (const R of [2, 4, 10]) satir(`kuyruk 0.5x tekrar R=${R}`, { kapasite: TEPE / 2, sinir: Infinity, R, kip: "tekrar" }); satir("kuyruk 0.5x hacim", { kapasite: TEPE / 2, sinir: Infinity, kip: "hacim" }); const enAzSinir = (o) => { let alt = 0, ust = 2_000_000; while (ust - alt > 500) { const orta = (alt + ust) / 2; if (kosum({ ...o, sinir: orta }).dusen < 1) ust = orta; else alt = orta; } return ust; }; console.log("\ngereken en kucuk kuyruk siniri (kapasite 0.5x tepe):"); for (const [ad, o] of [["olay yok", {}], ["tekrar R=4", { R: 4, kip: "tekrar" }], ["tekrar R=10", { R: 10, kip: "tekrar" }], ["hacim", { kip: "hacim" }]]) { console.log(` ${ad.padEnd(12)} ${enAzSinir({ kapasite: TEPE / 2, ...o }).toFixed(0).padStart(9)}`); } console.log("\nsinir 525000 (olaysiz gune gore secilmis) ile dusen olay:"); for (const [ad, o] of [["tekrar R=4", { R: 4, kip: "tekrar" }], ["tekrar R=10", { R: 10, kip: "tekrar" }], ["hacim", { kip: "hacim" }]]) { console.log(` ${ad.padEnd(12)} ${kosum({ kapasite: TEPE / 2, sinir: 525_000, ...o }).dusen.toFixed(0).padStart(9)}`); }
K01 tepe yazma 97.22 olay/s; K4 kesinti 1200 s -> 116667 olay geri gonderilir K5 ek akis 3600 s x 97.22 olay/s -> 350000 olay eklenir tasarim varis/s kapasite dusen birikme bekleme(sa) bosalma(sa) duzleme tamponsuz, olay yok 97 97.22 0 0 0.00 0.00 1.00 tamponsuz tekrar R=4 389 97.22 116667 0 0.00 0.00 4.00 tamponsuz hacim 194 97.22 350000 0 0.00 0.00 2.00 kuyruk 0.5x, olay yok 97 48.61 0 525000 3.00 8.73 2.00 kuyruk 0.5x tekrar R=2 194 48.61 0 525000 3.00 8.73 4.00 kuyruk 0.5x tekrar R=4 389 48.61 0 525000 3.00 8.73 8.00 kuyruk 0.5x tekrar R=10 972 48.61 0 525000 3.00 8.73 20.00 kuyruk 0.5x hacim 194 48.61 0 875000 5.00 12.55 4.00 gereken en kucuk kuyruk siniri (kapasite 0.5x tepe): olay yok 525391 tekrar R=4 525391 tekrar R=10 525391 hacim 875488 sinir 525000 (olaysiz gune gore secilmis) ile dusen olay: tekrar R=4 49 tekrar R=10 49 hacim 350049
Hız Sıçraması Tampona Yazılmıyor
Tablonun ortasındaki dört satır dersin en aykırı sonucudur. Tekrar gönderim çarpanı ikiden dörde, dörtten ona çıkarken varış hızı 194’ten 389’a, oradan 972 olay/s’ye çıkıyor — yani K01’in tepe yazma hızının on katına. Aynı satırlarda en yüksek birikme 525.000’de sabit kalıyor, en uzun bekleme 3,00 saatte, boşalma 8,73 saatte. Üç sayı da olaysız günün sayılarıyla birebir aynıdır.
Nedeni hacim korunumudur. Kesinti sırasında hiçbir olay gelmez ve tüketici çalışmaya devam eder, yani kuyruk o yirmi dakika boyunca boşalır; geri gönderim aynı olayları geri koyar. Kesintinin açtığı çukur ile sıçramanın yaptığı tepe birbirini götürür, çünkü ikisinin toplamı değişmemiştir. Tüketicinin gördüğü tek şey aynı gün içinde aynı sayıda iştir.
Sağdaki düzleme sütunu kuyruğun yaptığı işi tek sayıyla veriyor: varış hızının tüketici kapasitesine oranı. Olaysız günde 2,00, tekrar gönderimde 4,00, 8,00 ve 20,00. Yirmi katlık bir varış sıçraması tüketici tarafında hiçbir iz bırakmıyor. Bu, kuyruğun asıl işidir ve tek satırla söylenebilir: kuyruk hızı düzler, hacmi düzlemez.
Tamponsuz tasarımda aynı olay 116.667 olay düşürüyor ve düşen sayı R’den bağımsızdır — hangi hızla geldiği fark etmez, kapasitenin üstünde kalan her şey gider. Bu tasarımda tek çare kapasiteyi varış tepesine göre seçmektir; R = 10 için gereken kapasite 972 olay/s, yani K01’in tepe yazma hızının on katı ve günün geri kalanında tamamen boş duran bir kapasite.
Üreticiyi yavaşlatmak da bir seçenek gibi görünür; Önbellekleme, Kuyruklar ve Eşzamansız İşleme kursunda geri basınç adıyla kurulan yol budur. Bu akışta uygulanamaz, çünkü üretici taşıyıcının el terminalidir: yavaşlatıldığında olayları yine kendi belleğinde biriktirir ve sıçrama yalnız ertelenir. Geri basınç, üreticinin gerçekten duraklatılabildiği zincirlerde çalışır.
Hacim Sıçraması Tampona Yazılıyor
Son satır aynı kuyruğun aynı kapasitesiyle çok farklı davranıyor. Ek yazma akışı varış hızını yalnız iki katına çıkarıyor — 194 olay/s, tekrar gönderimin en yumuşak hâliyle aynı — ama en yüksek birikme 525.000’den 875.000’e, yani 1,67 katına çıkıyor. En uzun bekleme 3,00 saatten 5,00 saate, boşalma 8,73 saatten 12,55 saate uzuyor.
İki olayın varış hızları karşılaştırıldığında sonuç kesindir: 972 olay/s’lik bir sıçrama tampona hiçbir şey eklemezken 194 olay/s’lik bir akış 350.000 olay ekliyor. Tamponu dolduran şey varış hızı değil, işlenmemiş hacimdir. Bir tasarım tartışmasında “saniyede kaç istek geldi” sorusu tampon boyutunu belirlemez; belirleyen soru, gelen işin ne kadarının o gün içinde işlenmeden kaldığıdır.
Sınır Nereye Konur
Sınırsız kuyruk bir tasarım değildir; her tampon sonludur ve dolduğunda ya üreticiyi durdurur ya olay düşürür. Sınırın nereye konacağı ölçülebilir bir sorudur ve iki grup çıktı yanıtını veriyor.
Gereken en küçük sınır olaysız günde 525.391, tekrar gönderim olayında R’den bağımsız olarak yine 525.391, hacim olayında ise 875.488. Yani öngörülen günlük profile göre boyutlanmış bir tampon, on kat varış sıçramasını tek olay düşürmeden karşılar; aynı tampon hacim artışında yetersiz kalır.
Son grup bunu doğrudan sayıyor. Sınır olaysız güne göre 525.000 seçildiğinde tekrar gönderim olayında düşen olay sayısı 49’dur — sınırın gerçek gereksinimden 391 olay eksik yuvarlanmasının sonucu, yani pratikte sıfır. Aynı sınırla hacim olayında 350.049 olay düşer ve bu sayı, eklenen hacmin kendisidir.
Kararın kuralı buradan çıkar: tampon sınırı bir hız sayısından değil, bir hacim sayısından hesaplanır — en kötü günün üretilen ile işlenen iş farkından. Sınırı seçtikten sonra düşme davranışının ne olacağı ayrı bir karardır ve seçenekleri (üreticiyi engellemek, yeniyi atmak, eskiyi atmak) Önbellekleme, Kuyruklar ve Eşzamansız İşleme kursunda ölçüldü.
Hesaba Geri Dönüş
K01’in tablosunda bu dersin ihtiyaç duyduğu sayı yoktur ve eksikliğin kendisi sonuçtur. V8 tepe çarpanı 3’tür ve tepe yazma hızını 97,22 olay/s yapar; o sayı öngörülen tepedir. Kabul yolunun karşılamak zorunda olduğu varış hızı ise ölçümde 194, 389 ve 972 olay/s çıktı — V8’in ürettiği sayının iki, dört ve on katı. Bir tasarım kabul ucunu V8’e göre boyutlarsa, tek bir yirmi dakikalık kesintinin ardından kabul ucu doyar.
İşleme kapasitesi ise hiç değişmedi: ilk dersin seçtiği 48,61 olay/s, on kat varış sıçramasında da yeterlidir. K01’in “tepe yazma 97,22 istek/s” satırı böylece iki ayrı sayıya bölünüyor — kabul yolunun görmesi gereken anlık varış tepesi ve işleme yolunun karşılaması gereken hacim hızı — ve ikisi arasındaki oran, kuyruğun düzleme çarpanıdır.
Özet
- Kuyruk tabanlı yük dengeleme yükü zamana yayar; yük dengeleyici ise yükü kopyalara, yani uzaya böler. İlk dersin düzlediği profil öngörülüydü, buradaki sıçrama öngörülmemiştir.
- Yirmi dakikalık kesintinin ardından gelen 116.667 olay varış hızını 972 olay/s’ye çıkardığı hâlde en yüksek birikme 525.000’de, bekleme 3,00 saatte, boşalma 8,73 saatte sabit kaldı.
- Bir saatlik ek akış varış hızını yalnız 194 olay/s’ye çıkardı ama birikmeyi 875.000’e (1,67 kat), beklemeyi 5,00 saate, boşalmayı 12,55 saate taşıdı.
- Tamponu dolduran şey varış hızı değil hacimdir: gereken en küçük kuyruk sınırı tekrar gönderimde R’den bağımsız 525.391, hacim artışında 875.488 çıktı.
- Öngörülen profile göre 525.000 seçilmiş bir sınır, on kat varış sıçramasında 49 olay, hacim artışında 350.049 olay düşürüyor.
- K01’in tepe yazma hızı iki sayıya ayrılıyor: kabul yolunun gördüğü anlık varış tepesi V8’in ürettiği 97,22’nin on katına kadar çıkabilir, işleme yolunun karşıladığı hacim hızı 48,61 olay/s’de kalır.
Sonraki Adım
Buraya kadarki bütün kuyruklarda tek bir iş türü vardı ve tüketiciler sıradaki işi ayırt etmeden aldı. Aynı sistemde kuyruğa giren işler birbirinin eşi değildir: taşıyıcının durum olayı alıcının takip sayfasında görünür ve gecikmesi doğrudan hissedilir, gün sonu ücretlendirme kaydının ise sabaha kadar zamanı vardır, satıcının rapor işi ise ikisinden de bekleyebilir. Bu dersin 525.000 işlik birikmesi tek bir sıra olarak ele alındığında üçü de aynı üç saati bekler. Sonraki ders sıranın kendisini bir karara çevirir: işleri hizmet düzeyine göre ayırmanın hangi sınıfa ne kazandırdığını, hangisine ne kaybettirdiğini ve önceliğin sınırsız verildiğinde neyi tamamen durdurduğunu ölçer.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.