---
title: 'İtme ve Çekme Tabanlı Dağıtım'
source: 'https://academia.sh/tr/kurslar/trafik-katmani/itme-ve-cekme-tabanli-dagitim'
course: 'Trafik Katmanı'
language: tr
updated: '2026-08-17T18:11:02+00:00'
license: 'CC BY-SA 4.0'
---

# İtme ve Çekme Tabanlı Dağıtım

İçeriğin kenarlara iki ayrı modelle yayılması: çekme tabanlı dağıtımın ilk ıskayı ve eskimiş sürüm penceresini üretmesi, itme tabanlı dağıtımın boşa giden kopya ve ileti çarpanı doğurması, iki modelin içerik sınıfına göre seçilmesi ve seçimin giriş kursundaki yazma bant genişliği ile saklama hesabına etkisi.

Önceki dersteki kenar önbelleği isteği bekledi: bir anahtar ilk kez sorulduğunda ıska verdi,
kökene gitti ve yanıtı sakladı. Ölçüm o ilk isteklerin sayısını da verdi — 200.000 isteğin
20.046'sı kenarda ıska oldu ve her biri kökene bir gidiş demek. Bu bekleme zorunlu değildir.

İçerik sorulmadan önce de kenara gönderilebilir. İki yol vardır ve aralarındaki seçim bir
**yayma modeli** kararıdır. **Çekme tabanlı dağıtım** (pull based distribution) içeriği ilk
istekle çeker: kenar ıska verir, kökene gider, yanıtı saklar. **İtme tabanlı dağıtım** (push
based distribution) içeriği istek gelmeden önce kenarlara gönderir: kenar ıska vermez, ama
gönderilen içeriğin istenip istenmeyeceği bilinmez. Bu ders iki modeli aynı içerik kümesinde
ölçer.

## Ayrımın Ölçütü

İki model arasındaki fark üç yerde görünür. Birincisi **köken isteği**: çekme modelinde her kenar
her nesne için en az bir kez kökene gider, itme modelinde hiç gitmez. İkincisi **boşa giden
kopya**: itme modeli bir nesneyi hiç istenmeyecek kenarlara da gönderir. Üçüncüsü **eskimiş
sürüm**: bir nesne değiştiğinde çekme modelinde kenarlar süreleri dolana kadar eski sürümü
sunmaya devam eder, itme modelinde yeni sürüm bir adımda her kenara gider.

Bu üçü tek bir niceliğe bağlanır: **bir nesnenin kaç kenardan istendiği.** Nesne bütün kenarlardan
isteniyorsa itme hiçbir şeyi boşa göndermez; tek bir kenardan isteniyorsa itmenin gönderdiği
kopyaların hepsi bir eksiği kadar boşadır. Ders bunu ölçer.

## Düzenek

Model süreç içidir ve tur soyut bir adımdır; giriş kursunun tur soyutlamasıyla aynı türdendir.
İçerik iki sınıfa ayrılır. **Ortak** nesneler takip sayfasının kabuğu, biçem ve betik
dosyalarıdır: her kenardan istenirler. **Özel** nesneler gönderi başına takip yanıtlarıdır ve
sayıları önceki dersin ölçümünden gelir — pencerede 20.046 ayrı yanıt.

| Kod | Varsayım | Değer | Gerekçe |
|---|---|---|---|
| T10 | kenar sayısı | 12 | üç bölgenin her birinde dört giriş noktası |
| T11 | ortak nesne sayısı | 20 | kabuk, biçem, betik ve simge dosyaları |
| T12 | özel nesneyi isteyen kenar | 1 | bir gönderinin sorguları aynı kullanıcıdan, aynı kenardan gelir |

```js
// yayma/model.mjs — surec ici model: ayni icerik kumesi once cekme, sonra itme tabanli
// dagitilir. Tur soyut bir adimdir; yasam suresi ve guncelleme turu parametredir.
export const KENAR = 12;        // T10: kenar sayisi
export const TTL = 300;         // T1: yasam suresi (tur)
export const TUR = 900, GUNCELLEME = 100;

// T11: ortak nesneler her kenardan istenir. T12: bir gonderinin sorgulari tek kenardan gelir,
// bu yuzden ozel nesne yalniz bir kenardan istenir. OZEL sayisi onceki dersin olcumudur.
export const SINIF = [
  { ad: "ortak", nesne: 20, isteyen: KENAR },
  { ad: "ozel", nesne: 20_046, isteyen: 1 },
];

export function maliyet(sinif) {
  const cekme = sinif.nesne * sinif.isteyen;        // ilk iskada kokene bir gidis
  const itme = sinif.nesne * KENAR;                 // kume her kenara itilir
  return { cekme, itme, bosa: itme - cekme, bosaPayi: 1 - sinif.isteyen / KENAR };
}

// kip: "cekme", "itme" ya da "melez" (ortak nesne itilir, ozel nesne cekilir)
const kipi = (kip, ad) => (kip === "melez" ? (ad === "ortak" ? "itme" : "cekme") : kip);

export function yayma(kip) {
  const s = { koken: 0, itilen: 0, bosa: 0, eskimis: 0, ileti: 0 };
  for (const sinif of SINIF) {
    const m = maliyet(sinif);
    if (kipi(kip, sinif.ad) === "itme") { s.itilen += m.itme; s.bosa += m.bosa; s.ileti += m.itme; }
    else { s.koken += m.cekme; s.ileti += m.cekme; }
  }
  const ortakKipi = kipi(kip, "ortak");
  const surum = new Array(KENAR).fill(1);           // kenarlarin gordugu ortak nesne surumu
  const sonaErer = Array.from({ length: KENAR }, (_, k) => 1 + ((k * 27) % TTL));
  for (let tur = 1; tur <= TUR; tur++) {
    if (ortakKipi === "itme" && tur === GUNCELLEME) { surum.fill(2); s.ileti += KENAR; }
    for (let k = 0; k < KENAR; k++) {
      if (ortakKipi === "cekme" && tur >= sonaErer[k]) {  // suresi doldu, yeniden alindi
        surum[k] = tur >= GUNCELLEME ? 2 : 1;
        sonaErer[k] = tur + TTL;
        s.koken += 1; s.ileti += 1;
      }
      if (tur >= GUNCELLEME && surum[k] === 1) s.eskimis += 1;   // eskimis surum sunulan tur
    }
  }
  return s;
}
```

```js
// yayma/olc.mjs — iki yayma kipinin ayni icerik kumesinde karsilastirilmasi
import { yayma, maliyet, SINIF, KENAR, TTL, TUR, GUNCELLEME } from "./model.mjs";

console.log(`${KENAR} kenar, yasam suresi ${TTL} tur, ${TUR} tur, ` +
  `ortak nesnenin surumu ${GUNCELLEME}. turda degisiyor`);
console.log();
console.log("sinif | nesne | isteyen kenar | cekme istegi | itme istegi | bosa giden | bosa payi");
console.log("------|-------|---------------|--------------|-------------|------------|----------");
for (const sinif of SINIF) {
  const m = maliyet(sinif);
  console.log(`${sinif.ad.padEnd(5)} | ${String(sinif.nesne).padStart(5)} | ` +
    `${String(sinif.isteyen).padStart(13)} | ${String(m.cekme).padStart(12)} | ` +
    `${String(m.itme).padStart(11)} | ${String(m.bosa).padStart(10)} | ` +
    `${`%${(m.bosaPayi * 100).toFixed(1)}`.padStart(9)}`);
}
console.log();
console.log("kip    | koken istegi | itilen nesne | bosa giden | eskimis surum turu |  ileti");
console.log("-------|--------------|--------------|------------|--------------------|-------");
const kayit = {};
for (const kip of ["cekme", "itme", "melez"]) {
  const r = kayit[kip] = yayma(kip);
  console.log(`${kip.padEnd(6)} | ${String(r.koken).padStart(12)} | ` +
    `${String(r.itilen).padStart(12)} | ${String(r.bosa).padStart(10)} | ` +
    `${String(r.eskimis).padStart(18)} | ${String(r.ileti).padStart(6)}`);
}
const c = kayit.cekme, i = kayit.itme;
console.log();
console.log(`ileti orani itme/cekme = ${(i.ileti / c.ileti).toFixed(2)}`);
console.log(`eskimis surum turu, kenar basina ortalama = ${(c.eskimis / KENAR).toFixed(1)} tur ` +
  `(yasam suresinin ${((c.eskimis / KENAR) / TTL).toFixed(2)} kati)`);
const iki = maliyet({ ...SINIF[1], isteyen: 2 });
console.log(`T12 duyarliligi: ozel nesne iki kenardan istenirse bosa payi ` +
  `%${(iki.bosaPayi * 100).toFixed(1)} (tek kenarda %${(maliyet(SINIF[1]).bosaPayi * 100).toFixed(1)})`);
```

```
12 kenar, yasam suresi 300 tur, 900 tur, ortak nesnenin surumu 100. turda degisiyor

sinif | nesne | isteyen kenar | cekme istegi | itme istegi | bosa giden | bosa payi
------|-------|---------------|--------------|-------------|------------|----------
ortak |    20 |            12 |          240 |         240 |          0 |      %0.0
ozel  | 20046 |             1 |        20046 |      240552 |     220506 |     %91.7

kip    | koken istegi | itilen nesne | bosa giden | eskimis surum turu |  ileti
-------|--------------|--------------|------------|--------------------|-------
cekme  |        20322 |            0 |          0 |               1794 |  20322
itme   |            0 |       240792 |     220506 |                  0 | 240804
melez  |        20046 |          240 |          0 |                  0 |  20298

ileti orani itme/cekme = 11.85
eskimis surum turu, kenar basina ortalama = 149.5 tur (yasam suresinin 0.50 kati)
T12 duyarliligi: ozel nesne iki kenardan istenirse bosa payi %83.3 (tek kenarda %91.7)
```

Sayılar **ölçüm** sınıfındadır; girdileri T10–T12 varsayımları ile önceki dersin 20.046 ölçümüdür.

Birinci tablo seçim ölçütünü doğruluyor. Ortak sınıfta çekme ile itmenin isteği eşittir (240'a
240) ve boşa giden kopya sıfırdır, çünkü nesne zaten on iki kenardan da isteniyor. Özel sınıfta
itme 240.552 kopya gönderiyor, bunların 220.506'sı hiç istenmeyecek: boşa giden pay yüzde 91,7.
Aynı ölçüt formülle de görünüyor — boşa giden pay, isteyen kenar sayısının kenar sayısına oranının
tümleyenidir. T12 oynatıldığında pay yüzde 91,7'den yüzde 83,3'e iniyor; varsayım iki katına
çıksa bile itme özel sınıfta hâlâ ağırlıkla boşa gidiyor.

İkinci tablo bedelin nereye taşındığını gösteriyor. Çekme kipi kökene 20.322 istek üretiyor ve
karşılığında 1.794 tur boyunca eskimiş sürüm sunuyor; kenar başına ortalama 149,5 tur, yani yaşam
süresinin yarısı. İtme kipi eskimiş sürüm üretmiyor ama 240.804 ileti gönderiyor: çekmenin 11,85
katı. **İki model aynı işi ayrı yerde ödüyor** — biri eskimiş yanıtla, öteki boşa giden iletiyle.
Bu, giriş kursundaki iki devralma kalıbının ödünleşimiyle aynı biçimdedir: orada bedel kesinti ile
kaybolan veri arasında bölünmüştü.

Üçüncü satır kararın sistem düzeyinde değil **içerik sınıfı düzeyinde** verildiğini gösteriyor.
Melez kip ortak nesneleri itiyor, özel nesneleri çekiyor: köken isteği 20.046, boşa giden kopya 0,
eskimiş sürüm turu 0 ve ileti 20.298. Üç sütunun üçünde de öteki iki kipten iyi. Tek bir model
seçmek zorunda olan bir tasarım, iki sınıfın birinde gereksiz bedel ödüyor.

## Hesaba Dönüş

```js
// yayma/hesap.mjs — yayma kipi secildiginde K01'in hangi hesabi degisiyor
import { yayma, maliyet, SINIF, KENAR } from "./model.mjs";

const TEPE_OKUMA = 416.67, TEPE_YAZMA = 97.22, GUNLUK_OLAY = 2_800_000;  // K01 hesabi
const V5 = 480, ETKIN = 1_200_000;              // K01 V5; T6 ile hesaplanan etkin gonderi
const K01_ARKA = 41.67, K01_YAZMA = 0.17, K01_OKUMA = 1.60;
const PENCERE = 480;                            // sn: onceki dersin olcum penceresi

const c = yayma("cekme"), m = yayma("melez");
const mbit = (hiz, bayt) => (hiz * bayt * 8) / 1e6;
const itmeHizi = TEPE_YAZMA * KENAR;
const eskimisYanit = c.eskimis * (TEPE_OKUMA / KENAR);
const itmeGB = (ETKIN * V5 * KENAR) / 1e9, cekmeMB = (SINIF[1].nesne * V5) / 1e6;

console.log(`cekme: kokene ${c.koken} istek / ${PENCERE} sn = ${(c.koken / PENCERE).toFixed(2)} ` +
  `istek/s -- K01 onbellek arkasi okuma/s = ${K01_ARKA}`);
console.log(`melez: kokene ${(m.koken / PENCERE).toFixed(2)} istek/s, ortak nesne itildigi icin ` +
  `soguk baslangic iskasi yok`);
console.log();
console.log(`itme: her durum olayi ${KENAR} kenara gidiyor`);
console.log(`  tepe itme hizi = ${itmeHizi.toFixed(2)} itme/s, gunluk ${GUNLUK_OLAY * KENAR} itme`);
console.log(`  itme bant genisligi = ${mbit(itmeHizi, V5).toFixed(2)} Mbit/s = ` +
  `K01 yazma girisinin (${K01_YAZMA}) ${(mbit(itmeHizi, V5) / K01_YAZMA).toFixed(1)} kati, ` +
  `okuma cikisinin (${K01_OKUMA}) ${(mbit(itmeHizi, V5) / K01_OKUMA).toFixed(2)} kati`);
console.log(`  kenarlarda tutulan ozel icerik = ${itmeGB.toFixed(2)} GB ` +
  `(${(ETKIN * V5 / 1e6).toFixed(0)} MB x ${KENAR} kenar)`);
console.log(`  cekme kipinde ayni icerik = ${cekmeMB.toFixed(2)} MB, oran ` +
  `${((itmeGB * 1e3) / cekmeMB).toFixed(0)}`);
console.log();
console.log(`cekme kipinde bir surum degisikliginin eskimis yaniti = ` +
  `${eskimisYanit.toFixed(0)} (${c.eskimis} tur x ${(TEPE_OKUMA / KENAR).toFixed(2)} istek/s)`);
console.log(`ozel nesnenin bosa giden itme payi = ` +
  `%${(maliyet(SINIF[1]).bosaPayi * 100).toFixed(1)}; itme ancak nesne ${KENAR} kenardan da ` +
  `istendiginde bosa gitmiyor`);
```

```
cekme: kokene 20322 istek / 480 sn = 42.34 istek/s -- K01 onbellek arkasi okuma/s = 41.67
melez: kokene 41.76 istek/s, ortak nesne itildigi icin soguk baslangic iskasi yok

itme: her durum olayi 12 kenara gidiyor
  tepe itme hizi = 1166.64 itme/s, gunluk 33600000 itme
  itme bant genisligi = 4.48 Mbit/s = K01 yazma girisinin (0.17) 26.4 kati, okuma cikisinin (1.6) 2.80 kati
  kenarlarda tutulan ozel icerik = 6.91 GB (576 MB x 12 kenar)
  cekme kipinde ayni icerik = 9.62 MB, oran 718

cekme kipinde bir surum degisikliginin eskimis yaniti = 62292 (1794 tur x 34.72 istek/s)
ozel nesnenin bosa giden itme payi = %91.7; itme ancak nesne 12 kenardan da istendiginde bosa gitmiyor
```

İlk satır çekme modelinin giriş kursuyla tutarlı olduğunu gösteriyor. Kökene giden istek hızı
42,34, kursun `onbellek arkasi okuma/s` sayısı 41,67. İki sayı ayrı yollardan çıkmıştır — biri
varsayım tablosundan, öteki bu dersin model koşumundan — ve yüzde iki içinde buluşuyorlar. Çekme
modeli seçildiğinde giriş kursunun hesabı olduğu gibi geçerli kalıyor.

İtme modeli aynı hesabı bozuyor. Her durum olayı ilgili takip yanıtını değiştirdiğine göre yeni
sürümün on iki kenara da gitmesi gerekir: tepe itme hızı 1.166,64 itme/s, günde 33.600.000 itme.
Bunun bant genişliği 4,48 Mbit/s'tir — kursun `yazma giris Mbit/s` sayısının (0,17) 26,4 katı ve
`okuma cikis Mbit/s` sayısının (1,60) 2,80 katı. **İtme modeli okuma yükünü yazma yüküne çevirir
ve kenar sayısıyla çarpar.** Bir tasarımın en büyük bant genişliği kalemi, itme seçilmesiyle,
saniyede 97 olayla akan yazma tarafına geçiyor.

Saklama tarafı da aynı yönde. Etkin 1.200.000 gönderinin takip yanıtları her kenarda tutulursa
kenar başına 576 MB, on iki kenarda 6,91 GB eder. Çekme modelinde aynı içeriğin kenarlardaki
toplam karşılığı 9,62 MB'tır: 718 kat fark. Bu sayı kursun `saklanan veri GB` hesabına eklenmez,
çünkü kenarlardaki kopya deponun yerine geçmez — üstüne biner.

Son satır çekme modelinin faturasını veriyor. Ortak bir nesnenin sürümü değiştiğinde 1.794 tur
boyunca eskimiş sürüm sunuluyor ve kenar başına saniyede 34,72 istek düştüğüne göre bu 62.292
eskimiş yanıt demektir. Sayı yaşam süresine doğrudan bağlıdır ve ilk dersin sonucunu tekrar
ediyor: yaşam süresi bir önbellek ayarı değil, hem devralma süresini hem de sürüm yayılma süresini
belirleyen tek bir karardır.

## Özet

- Yayma modeli bir karardır: çekme tabanlı dağıtım içeriği ilk istekle çeker, itme tabanlı dağıtım
  istek gelmeden gönderir.
- Seçim ölçütü bir nesnenin kaç kenardan istendiğidir; boşa giden itme payı, isteyen kenar
  oranının tümleyenidir. Ortak sınıfta pay yüzde 0, özel sınıfta yüzde 91,7 ölçüldü.
- Çekme kipi kökene 20.322 istek üretti ve 1.794 tur eskimiş sürüm sundu; itme kipi eskimiş sürüm
  üretmedi ama 240.804 ileti gönderdi — çekmenin 11,85 katı.
- Melez kip üç sütunda da öteki ikisinden iyidir (köken isteği 20.046, boşa giden 0, eskimiş tur
  0): karar sistem düzeyinde değil içerik sınıfı düzeyinde verilir.
- Çekme modeli giriş kursunun hesabını korur: kökene 42,34 istek/s gidiyor, kursun
  `onbellek arkasi okuma/s` sayısı ise 41,67.
- İtme modeli hesabı bozar: tepe 1.166,64 itme/s ve 4,48 Mbit/s — yazma girişinin 26,4 katı;
  kenarlarda tutulan içerik 6,91 GB, çekme kipindekinin 718 katı.

## Sonraki Adım

Bu iki ders içeriği kenarda tuttu ama içeriğin nereden geldiği hep aynı yerdi: uygulamanın
kendisi. Ortak sınıftaki yirmi nesne — kabuk, biçem, betik ve simge dosyaları — uygulamanın hiçbir
mantığına dokunmuyor; sabit bayt dizileri olarak duruyorlar ve yine de uygulama süreçlerinin
adresinden isteniyorlar. Sonraki ders bu yolu ayırır: içerik uygulamadan ayrı bir yerden
sunulduğunda uygulamaya ulaşan istek sayısına, isteğin dokunduğu durak sayısına ve giriş kursunun
uçtaki tepe istek hızına ne olduğunu ölçer.
