---
title: 'Aşamalı Yayın'
source: 'https://academia.sh/tr/kurslar/ci-cd/asamali-yayin'
course: 'Sürekli Tümleştirme ve Teslimat'
language: tr
updated: '2026-08-17T18:09:03+00:00'
license: 'CC BY-SA 4.0'
---

# Aşamalı Yayın

Yüzdelik dağıtımın karar tarafı ölçülür: yüzdeyi artıran ölçüt, ölçüt penceresi ve karar eşiği taranır. Üç merdivende belirgin ve silik kusurun durdurulma oranı, etkilenen istek, temiz sürümün yanlış geri alınması ve yayının toplam süresi sayılır.

Terfi kapısı tek bir karardı: çıktı geçti ya da geçmedi, geçtiğinde tamamına açıldı. Terfi tek
adımda olmak zorunda değil. Yeni sürüm önce isteklerin küçük bir yüzdesine açılabilir, bir süre
izlenebilir, sonra pay artırılabilir. Bu, kapıyı tek karardan bir **karar dizisine** dönüştürür.

Dağıtımın kendisi — payın nasıl kaydırıldığı, kaç kopyanın hangi sürümde durduğu, kaçan hatanın
kaç isteğe dokunduğu — ölçülmüş bir konudur ve burada tekrarlanmıyor; bu dersin girdisidir.
Buranın sorusu bir adım geridedir: **payı kim, neye bakarak artırıyor.** Her adımın sonunda bir
ölçüt okunur, bir eşikle karşılaştırılır ve iki karardan biri verilir: yüzdeyi artır ya da geri
al. Kapı budur. Ölçülecek şey de bu kapının üç sayısıdır — hangi kusuru tutuyor, hangi temiz
sürümü boşuna durduruyor, yayına kaç dakika ekliyor.

- **YS13.** Kurgusal bölgesel ölçüm ağının faturalama servisi dakikada beş yüz istek alır. Günün
  saatine göre değişim, bölge farkı ve istek karması modellenmiyor. Ağ da rakamlar da kurgudur.
- **YS14.** Bozuk sürüm terfi kapılarını geçmiştir; kusuru yalnız üretim trafiğinde görünür. İki
  şiddet ölçülür: **belirgin** kusur isteklerin yüzde bir virgül altısında, **silik** kusur yüzde
  sekiz onda birinde hata verir. Tabandaki hata oranı yüzde dört onda birdir.
- **YS15.** Ölçüt tek kalemdir: yeni sürümün hata oranı. Gecikme, doygunluk ve iş ölçütleri ile
  çok kalemli karar modelin dışındadır.
- **YS16.** Pencere adımın sonunda bir kez okunur. Kayan pencere, ardışık ihlal sayacı ve ölçüt
  toplama gecikmesi modellenmiyor.
- **YS17.** Geri alma anında ve bedelsizdir. Geri almanın tur maliyeti bu dersin konusu değildir.
- **YS18.** Her ayar iki yüz kez koşturulur; oranlar bu iki yüz koşumun payıdır. Tohum görünürdür.

## Ölçüm Düzeneği

Ölçülen şey gerçek bir yayın değil, `node` ile kurulan bir modeldir. Model bir merdiveni adım adım
tırmanır, her adımda pencereye düşen istekleri tek tek üretir ve adımın sonunda kararı verir.
Rastgelelik üreteci kendi yazılmıştır, tohumu görünürdür.

```js
// yayin.mjs — asamali yayinin karar tarafinin modeli; gercek trafik degil, bir modeldir
export const TOHUM = 20260903;
export const ISTEK_DK = 500, TABAN = 0.004, BELIRGIN = 0.016, SILIK = 0.008;
export const PENCERE = 10, CARPAN = 2.5, TEKRAR = 200;

export function uretec(tohum) {                    // dogrusal eslesik uretec, tohum gorunur
  let x = tohum >>> 0;
  return () => { x = (Math.imul(x, 1664525) + 1013904223) >>> 0; return x / 4294967296; };
}

export const merdivenler = {                       // yuzde adimlari
  hizli: [5, 50, 100], dengeli: [1, 5, 25, 50, 100], dikkatli: [1, 2, 5, 10, 25, 50, 100],
};

// Bir yayin: merdiven adim adim tirmanir, her adimin sonunda olcut penceresi okunur.
// Karar kapisi buradadir: pencerede gorulen hata orani esigi asarsa geri al, asmazsa yuzdeyi artir.
export function kosum(rnd, merdiven, pencere, esik, oran) {
  let dokunulan = 0;
  for (let i = 0; i < merdiven.length; i += 1) {
    const n = Math.round(ISTEK_DK * pencere * merdiven[i] / 100);
    let h = 0;
    for (let r = 0; r < n; r += 1) if (rnd() < oran) h += 1;
    dokunulan += n;
    if (n > 0 && h / n > esik) return { karar: 'geri al', adim: i + 1, dokunulan };
  }
  return { karar: 'tamam', adim: merdiven.length, dokunulan };
}

export function kostur(merdiven, oran, pencere = PENCERE, carpan = CARPAN) {
  const esik = TABAN * carpan, rnd = uretec(TOHUM);
  let durdurulan = 0, adim = 0, dokunulan = 0;
  const dagilim = merdiven.map(() => 0);
  for (let k = 0; k < TEKRAR; k += 1) {
    const s = kosum(rnd, merdiven, pencere, esik, oran);
    if (s.karar === 'geri al') { durdurulan += 1; adim += s.adim; dagilim[s.adim - 1] += 1; }
    dokunulan += s.dokunulan;
  }
  return { dagilim, oran: durdurulan / TEKRAR, ortAdim: durdurulan ? adim / durdurulan : 0,
    ortDokunulan: Math.round(dokunulan / TEKRAR), sure: merdiven.length * pencere, esik };
}
```

Aynı `kostur` üç ayrı sürüm için çağrılır. Belirgin ve silik kusurlu sürümlerde `oran` sonucu
kapının **tuttuğu**dur; taban oranıyla çağrıldığında aynı sayı kapının **yanlış tuttuğu**dur —
çünkü o sürümde kusur yoktur.

## Üç Merdiven

```js
// kosum1.mjs — uc merdiven, uc surum: belirgin kusurlu, silik kusurlu, temiz
import { kostur, merdivenler, TOHUM, ISTEK_DK, TABAN, BELIRGIN, SILIK, PENCERE, CARPAN, TEKRAR } from './yayin.mjs';

console.log(`tohum ${TOHUM} | ${ISTEK_DK} istek/dk, pencere ${PENCERE} dk, ${TEKRAR} tekrar`);
console.log(`taban hata orani %${TABAN * 100} | belirgin kusur %${BELIRGIN * 100} | silik kusur %${SILIK * 100}`);
console.log(`karar esigi: tabanin ${CARPAN} kati, yani %${TABAN * CARPAN * 100}\n`);
console.log('merdiven  yuzde adimlari        belirgin kusur        silik kusur      temiz surum  yayin');
console.log('                                durdu  adim  etkilen  durdu  etkilen  yanlis durdu suresi');
for (const [ad, m] of Object.entries(merdivenler)) {
  const b = kostur(m, BELIRGIN), s = kostur(m, SILIK), t = kostur(m, TABAN);
  console.log(`${ad.padEnd(9)} ${m.join('-').padEnd(20)} ${`%${(b.oran * 100).toFixed(0)}`.padEnd(6)} ` +
    `${b.ortAdim.toFixed(2).padEnd(5)} ${String(b.ortDokunulan).padEnd(8)} ${`%${(s.oran * 100).toFixed(0)}`.padEnd(6)} ` +
    `${String(s.ortDokunulan).padEnd(8)} ${`%${(t.oran * 100).toFixed(0)}`.padEnd(12)} ${b.sure} dk`);
}
console.log('\nadim basina olcut penceresine dusen istek ve gorulebilecek en kucuk sifir disi oran:');
for (const p of [1, 2, 5, 10, 25, 50, 100]) {
  const n = ISTEK_DK * PENCERE * p / 100;
  console.log(`  %${String(p).padStart(3)} pay: ${String(n).padStart(5)} istek/pencere, tek hata = %${(100 / n).toFixed(2)}` +
    ` -> esik %${(TABAN * CARPAN * 100).toFixed(1)} ${100 / n > TABAN * CARPAN * 100 ? 'ayirt edilemez' : 'ayirt edilebilir'}`);
}
```

```
tohum 20260903 | 500 istek/dk, pencere 10 dk, 200 tekrar
taban hata orani %0.4 | belirgin kusur %1.6 | silik kusur %0.8
karar esigi: tabanin 2.5 kati, yani %1

merdiven  yuzde adimlari        belirgin kusur        silik kusur      temiz surum  yayin
                                durdu  adim  etkilen  durdu  etkilen  yanlis durdu suresi
hizli     5-50-100             %100   1.23  825      %40    5375     %9           30 dk
dengeli   1-5-25-50-100        %100   1.60  306      %70    3423     %27          50 dk
dikkatli  1-2-5-10-25-50-100   %100   1.72  188      %82    2403     %32          70 dk

adim basina olcut penceresine dusen istek ve gorulebilecek en kucuk sifir disi oran:
  %  1 pay:    50 istek/pencere, tek hata = %2.00 -> esik %1.0 ayirt edilemez
  %  2 pay:   100 istek/pencere, tek hata = %1.00 -> esik %1.0 ayirt edilebilir
  %  5 pay:   250 istek/pencere, tek hata = %0.40 -> esik %1.0 ayirt edilebilir
  % 10 pay:   500 istek/pencere, tek hata = %0.20 -> esik %1.0 ayirt edilebilir
  % 25 pay:  1250 istek/pencere, tek hata = %0.08 -> esik %1.0 ayirt edilebilir
  % 50 pay:  2500 istek/pencere, tek hata = %0.04 -> esik %1.0 ayirt edilebilir
  %100 pay:  5000 istek/pencere, tek hata = %0.02 -> esik %1.0 ayirt edilebilir
```

Belirgin kusurda üç merdiven de tam not aldı: iki yüz koşumun iki yüzünde de sürüm durduruldu.
Ayrıştıkları yer etkilenen istek sayısı. Hızlı merdiven ilk adımını yüzde beşten açtığı için
sekiz yüz yirmi beş isteğe dokundu; dikkatli merdiven yüzde birden başlayıp yüz seksen sekizde
kaldı. Bedeli süre: otuz dakikaya karşı yetmiş dakika.

Silik kusur sütunu tabloyu çeviriyor. Hata oranı yüzde sekiz onda bir olan sürüm eşiğin
altındadır; kapı onu ancak gürültü eşiği aştırdığında yakalar. Hızlı merdiven bu sürümü on
koşumdan dördünde durdurdu, dikkatli merdiven sekizinde. Ama durduramadığında dokunduğu istek
sayısı hızlıda beş bin üç yüz yetmiş beş, dikkatlide iki bin dört yüz üç. Kapının kaçırdığı bir
kusurda merdivenin ayrıntısı hâlâ işe yarıyor — çünkü kaçırma anında bile pay küçük kalıyor.

Son sütun faturayı yazıyor. Dikkatli merdiven temiz bir sürümü on koşumdan üçünde durdurdu.
Yüzde otuz iki. Bunun neden böyle olduğunu alttaki tablo söylüyor: yüzde bir paya on dakikalık
pencerede elli istek düşer. Elli istekte görülebilecek en küçük sıfır olmayan hata oranı yüzde
ikidir — karar eşiğinin iki katı. O adımda tek bir taban hatası bile kapıyı tetikler. Kapı orada
sürümü ölçmüyor, gürültüyü ölçüyor.

## Pencere ve Eşik

```js
// kosum2.mjs — dengeli merdivende olcut penceresi ve karar esigi ayri ayri taranir
import { kostur, merdivenler, TABAN, BELIRGIN, SILIK, PENCERE, CARPAN } from './yayin.mjs';
const m = merdivenler.dengeli;

console.log(`merdiven ${m.join('-')} | esik carpani ${CARPAN} sabit`);
console.log('pencere  belirgin durdu  silik durdu  temiz yanlis durdu  etkilenen  yayin suresi');
for (const p of [5, 10, 20, 40, 80]) {
  const b = kostur(m, BELIRGIN, p), s = kostur(m, SILIK, p), t = kostur(m, TABAN, p);
  console.log(`${`${p} dk`.padEnd(8)} ${`%${(b.oran * 100).toFixed(0)}`.padEnd(15)} ${`%${(s.oran * 100).toFixed(0)}`.padEnd(12)} ` +
    `${`%${(t.oran * 100).toFixed(0)}`.padEnd(19)} ${String(b.ortDokunulan).padEnd(10)} ${b.sure} dk`);
}
console.log(`\npencere ${PENCERE} dk sabit | esik = taban x carpan`);
console.log('carpan  esik    belirgin durdu  silik durdu  temiz yanlis durdu  etkilenen');
for (const c of [1.5, 2, 2.5, 3, 4, 6]) {
  const b = kostur(m, BELIRGIN, PENCERE, c), s = kostur(m, SILIK, PENCERE, c), t = kostur(m, TABAN, PENCERE, c);
  console.log(`${String(c).padEnd(7)} ${`%${(TABAN * c * 100).toFixed(1)}`.padEnd(7)} ${`%${(b.oran * 100).toFixed(0)}`.padEnd(15)} ` +
    `${`%${(s.oran * 100).toFixed(0)}`.padEnd(12)} ${`%${(t.oran * 100).toFixed(0)}`.padEnd(19)} ${b.ortDokunulan}`);
}

const t2 = kostur(m, TABAN), b2 = kostur(m, BELIRGIN);
console.log(`\npencere ${PENCERE} dk, esik carpani ${CARPAN}: durusun hangi adimda oldugu`);
console.log(`  yuzde adimi:         ${m.map((x) => `%${x}`.padStart(6)).join('')}`);
console.log(`  temiz surum durdu:   ${t2.dagilim.map((x) => String(x).padStart(6)).join('')}`);
console.log(`  belirgin kusur durdu:${b2.dagilim.map((x) => String(x).padStart(6)).join('')}`);
```

```
merdiven 1-5-25-50-100 | esik carpani 2.5 sabit
pencere  belirgin durdu  silik durdu  temiz yanlis durdu  etkilenen  yayin suresi
5 dk     %100            %64          %20                 341        25 dk
10 dk    %100            %70          %27                 306        50 dk
20 dk    %100            %48          %9                  563        100 dk
40 dk    %100            %40          %5                  770        200 dk
80 dk    %100            %34          %2                  890        400 dk

pencere 10 dk sabit | esik = taban x carpan
carpan  esik    belirgin durdu  silik durdu  temiz yanlis durdu  etkilenen
1.5     %0.6    %100            %100         %53                 236
2       %0.8    %100            %91          %26                 306
2.5     %1.0    %100            %70          %27                 306
3       %1.2    %100            %45          %23                 565
4       %1.6    %94             %37          %19                 1373
6       %2.4    %31             %7           %2                  6333

pencere 10 dk, esik carpani 2.5: durusun hangi adimda oldugu
  yuzde adimi:             %1    %5   %25   %50  %100
  temiz surum durdu:       37    16     0     0     0
  belirgin kusur durdu:   100    79    21     0     0
```

Pencere taraması düz bir eğri vermiyor. Beş dakikadan on dakikaya çıkıldığında yanlış durdurma
yüzde yirmiden yirmi yediye **yükseliyor**, sonra düşüyor. Sebep karar kuralında: yüzde bir payda
pencere ne kadar küçükse o kadar az istek gelir, ama tek bir hata hâlâ eşiği aşar. Pencereyi
büyütmek önce "tek hata görme" olasılığını artırır; ancak pencere iki hata gerektirecek kadar
büyüdüğünde eğri döner. Yirmi dakikada yanlış durdurma yüzde dokuza, seksen dakikada yüzde ikiye
iner — karşılığında yayın süresi elli dakikadan dört yüz dakikaya çıkar ve etkilenen istek üç yüz
altıdan sekiz yüz doksana yükselir. Beklemenin bedeli, beklerken dokunulan isteklerdir.

Eşik taraması kesin bir değiş tokuş gösteriyor. Çarpanı bir buçuğa indirmek silik kusurun
tamamını yakalatıyor, ama temiz sürümlerin yarısından fazlasını durduruyor. Altıya çıkarmak
yanlış durdurmayı yüzde ikiye indiriyor; bu kez belirgin kusurun bile yalnız üçte biri
yakalanıyor ve etkilenen istek altı bin üç yüz otuz üçe fırlıyor. İki ile iki buçuk arasındaki
satırlar dikkate değer: yanlış durdurma neredeyse aynı kalırken silik kusur yakalama yüzde
yetmişten doksan bire çıkıyor. Eşiği iki buçuktan ikiye çekmek karşılıksız bir kazançtır.

Bunun nedeni son bloktadır. Temiz sürümün elli üç yanlış duruşunun otuz yedisi ilk adımda, on
altısı ikinci adımda oldu; üçüncü adımdan sonra bir tane bile yok. Yanlış durdurmaları eşik değil
**küçük paylı adımlar** üretiyor. Eşiği oynatmak o adımları düzeltmiyor, çünkü orada ölçülen sayı
zaten eşikten bağımsız olarak sıçrıyor. Belirgin kusur satırı da aynı yerde yoğunlaşıyor: yüz
koşum ilk adımda, yetmiş dokuzu ikinci adımda durduruldu. Yani ilk iki adım hem kararların hem
yanlışların neredeyse tamamını üretiyor; sonraki üç adım yalnız süre ekliyor.

## Kapının Üç Sayısı

**Tuttuğu:** belirgin kusurlu sürümü iki yüz koşumun iki yüzünde durdurdu. **Yalnız kendisinin
tuttuğu:** bu kusurların hepsi — bozuk sürüm tanım gereği terfi kapılarını geçmiş bir sürümdür ve
kusuru yalnız üretim trafiğinde görünür. Yüzde artırma kapısı, gerçek trafiği ölçüte çeviren ilk
kapıdır; marjinali bu yüzden yüzde yüzdür.

**Kaçırdığı:** silik kusurun merdivene göre yüzde on sekizi ile altmışı; eşik altıya çekildiğinde
belirgin kusurun bile yüzde altmış dokuzu. **Yanlış tuttuğu:** dengeli merdivende temiz
sürümlerin yüzde yirmi yedisi, dikkatli merdivende yüzde otuz ikisi; seksen dakikalık pencerede
yüzde ikiye iniyor. **Eklediği süre:** merdiven başına otuz, elli ve yetmiş dakika; pencere
büyütüldüğünde dört yüz dakikaya kadar.

Bu üç sayının hiçbiri kalıbın adından okunamaz. "Kanarya yaptık" cümlesi, kapının hangi ölçüte,
hangi pencereyle, hangi eşikle baktığını söylemedikçe boş bir cümledir — ve bu üç ayarın en
kötüsü, kararın alınamayacağı kadar küçük bir payda karar almaya çalışmaktır.

## Özet

- Üç merdiven aynı kusur şiddetlerinde koşturuldu: belirgin kusuru üçü de iki yüz koşumda
  durdurdu, ama etkilenen istek sekiz yüz yirmi beşten yüz seksen sekize indi, süre otuz
  dakikadan yetmiş dakikaya çıktı.
- Silik kusurda durdurma oranı yüzde kırk ile seksen iki arasında değişti; kapının kaçırdığı
  durumda bile ayrıntılı merdiven dokunulan isteği beş bin üç yüz yetmiş beşten iki bin dört yüz
  üçe indirdi.
- Yanlış geri alma ölçüldü: dengeli merdivende yüzde yirmi yedi, dikkatlide yüzde otuz iki. Elli
  üç yanlış duruşun tamamı ilk iki adımda gerçekleşti, üçüncü adımdan sonra bir tane bile yok.
- Pencere taraması tek yönlü değil: beş dakikadan on dakikaya çıkmak yanlış durdurmayı artırdı,
  yirmiden sonra düşürdü; seksen dakikada yüzde iki, karşılığında yayın süresi dört yüz dakika.
- Eşik taramasında iki buçuk yerine iki çarpanı silik kusur yakalamasını yüzde yetmişten doksan
  bire çıkardı ve yanlış durdurmayı artırmadı; eşiği yükseltmek kaçırmayı hızla büyüttü.
- Yüzde bir paya on dakikalık pencerede elli istek düşer; tek hata yüzde iki okunur, eşik yüzde
  bir. O adımda kapı sürümü değil gürültüyü ölçer — küçük pay etkiyi sınırlar, kararı sağlamaz.

## Sonraki Adım

Bu ölçümün tamamı bir varsayıma yaslandı: geri alma anında ve bedelsizdir. Kapı "geri al" dediği
anda modelde hiçbir şey olmuyordu. Gerçekte geri almanın bir turu, bir maliyeti ve bir sınırı
vardır. Eski sürüm hâlâ ayakta duruyorsa geri alma tek anahtar çevirme işidir; ayakta değilse
yeniden yayın demektir. Sonraki ders iki tam ortamı yan yana tutan düzeni ölçer: geri almanın tur
maliyetini, iki ortamı sürekli ayakta tutmanın kaynak bedelini, geçiş anında kesilen durum taşıyan
istekleri ve veri katmanı paylaşıldığında geri almanın gerçekte neyi geri almadığını sayar.
