---
title: 'Kuyruk Tabanlı Yük Dengeleme'
source: 'https://academia.sh/tr/kurslar/uygulama-katmani/kuyruk-tabanli-yuk-dengeleme'
course: 'Uygulama Katmanı ve Servis Etkileşimi'
language: tr
updated: '2026-08-17T18:10:55+00:00'
license: 'CC BY-SA 4.0'
---

# 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ı.

Ö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 dengeleyici**yi ç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.

```js
// 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.
