İçeriğe geç
academia.sh

Ders 12 / 21

İki Ortamlı Dağıtım

Geri almanın tur maliyeti ile iki tam ortamı ayakta tutmanın sürekli bedeli birlikte sayılır: geri alma penceresi taranır, geçiş anında kesilen oturum ve uzun süren iş ölçülür, paylaşılan veri katmanında geri almanın geri almadığı satırlar gösterilir.

İçindekiler

Önceki ölçüm bir varsayıma yaslanıyordu: geri alma anında ve bedelsizdir. Kapı “geri al” dediği anda modelde hiçbir şey olmuyordu. Bu ders o varsayımı kaldırır. Geri almanın bir turu, bir fiyatı ve bir sınırı vardır — ve fiyatın büyük kısmı geri alma hiç gerekmediğinde de ödenir.

İki ortamlı dağıtımın vaadi tek cümledir: yeni sürüm eski sürümün yanında ayağa kalkar, trafik tek anahtarla çevrilir, bir şey ters giderse anahtar geri çevrilir. Bu vaadin karşılığı, aynı işi yapan iki tam ortamın bir süre birlikte ayakta durmasıdır. Bu derste kapı geri alma kararıdır: kararın kaç tur sürdüğü, hangi durumda tek tura indiği ve o tek turun neyi kapsamadığı ölçülür.

  • YS19. Kurgusal bölgesel ölçüm ağının iş emri servisi on altı kopyayla çalışır; altmış yayın ölçülür ve bir dağıtım turu üç dakikadır. Ağ da rakamlar da kurgudur.
  • YS20. Yayınların yüzde otuzu kusurludur. Kusurun görünme süresi üstel dağılır, ortalaması yirmi beş dakikadır. Kusurun hangi ölçütle görüldüğü ayrı bir ölçünün konusudur; burada yalnız görünme anı modellenir.
  • YS21. İkinci ortam anahtar çevrilmeden on iki dakika önce ayağa kalkar ve geri alma penceresi boyunca ayakta kalır. Pencere kapandıktan sonra geri alma yeniden yayın demektir: beş tur.
  • YS22. Aşamalı düzen dört fazladan kopyayla elli dakikada beş adım tırmanır; geri alma o ana kadar tırmanılan adım kadar tur sürer.
  • YS23. Geçiş anında üç iş birimi sınıfı vardır ve süreleri üstel dağılır. Oturum yapışkanlığının yeni ortama taşınması modellenmiyor; ölçülen şey taşınmadığında kesilenin sayısıdır.
  • YS24. Veri katmanı iki ortam arasında paylaşılır. Yazma hızı dakikada yüz kırk satır, geri alma sonrası satırların yüzde otuz beşi güncellenir. Göç sırası ve geriye uyumlu yazma bu dersin konusu değildir.

Ölçüm Düzeneği

Ölçülen şey gerçek bir küme değil, node ile kurulan bir modeldir. Model üç ayrı şeyi taşır: bir yayın dizisinin kaynak bedeli ve geri alma turları, anahtar çevrildiği anda uçuşta olan iş birimleri, ve paylaşılan veri katmanına yazılan satırlar. Rastgelelik üreteci kendi yazılmıştır, tohumu görünürdür.

// ikiortam.mjs — iki ortamli dagitimin maliyet ve gecis modeli; gercek kume degil, bir modeldir
export const TOHUM = 20260904;
export const KOPYA = 16, YAYIN = 60, TUR_DK = 3, HAZIRLIK_DK = 12, YENIDEN_TUR = 5;
export const ASAMALI_EK = 4, ASAMALI_SURE = 50, ASAMALI_ADIM = 5;
export const KUSUR_ORT = 25, PENCERE_DK = 30;     // kusurun gorunme suresi ust ustel dagilir

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 ustel = (rnd, ort) => -ort * Math.log(1 - rnd());

// Yayin dizisi: her yayinin kusurlu olup olmadigi ve kusurun kacinci dakikada gorundugu.
export function yayinlar(rnd, bozukOran = 0.30) {
  return Array.from({ length: YAYIN }, (_, i) => ({
    no: i + 1, bozuk: rnd() < bozukOran, gorunme: ustel(rnd, KUSUR_ORT),
  }));
}

// Iki ortamli duzen: eski ortam anahtar cevrildikten sonra pencere boyunca ayakta tutulur.
export function ikiOrtamli(liste, pencere) {
  let kopyaDk = 0, tur = 0, pencereIci = 0, pencereDisi = 0;
  for (const y of liste) {
    kopyaDk += KOPYA * (HAZIRLIK_DK + pencere);    // ikinci ortamin ayakta durdugu sure
    if (!y.bozuk) continue;
    if (y.gorunme <= pencere) { tur += 1; pencereIci += 1; }
    else { tur += YENIDEN_TUR; pencereDisi += 1; }
  }
  const bozuk = liste.filter((y) => y.bozuk).length;
  return { ad: `iki ortamli (pencere ${pencere} dk)`, kopyaDk, pencereIci, pencereDisi,
    ortTur: bozuk ? tur / bozuk : 0, geriDk: bozuk ? tur * TUR_DK / bozuk : 0 };
}

// Asamali duzen: fazladan kopya yayin suresince ayakta; geri alma o ana kadar tirmanilan adim kadar tur.
export function asamali(liste) {
  let kopyaDk = 0, tur = 0;
  for (const y of liste) {
    kopyaDk += ASAMALI_EK * ASAMALI_SURE;
    if (!y.bozuk) continue;
    const adim = Math.min(ASAMALI_ADIM, 1 + Math.floor(y.gorunme / (ASAMALI_SURE / ASAMALI_ADIM)));
    tur += adim;
  }
  const bozuk = liste.filter((y) => y.bozuk).length;
  return { ad: 'asamali (tek ortam)', kopyaDk, pencereIci: 0, pencereDisi: bozuk,
    ortTur: bozuk ? tur / bozuk : 0, geriDk: bozuk ? tur * TUR_DK / bozuk : 0 };
}

// Gecis ani: anahtar cevrildiginde ucusta olan is birimleri. Uc sinif, ust ustel sure.
export const SINIFLAR = [
  { ad: 'kisa istek', hiz: 300, ort: 0.04 },       // hiz: dakikada baslayan birim
  { ad: 'oturum', hiz: 8, ort: 12 },
  { ad: 'uzun suren is', hiz: 0.5, ort: 25 },
];

export function ucustakiler(rnd, sinif, T = 240) {  // T dakikalik isinma, anahtar T aninda
  const acik = [];
  for (let dk = 0; dk < T; dk += 1) {
    for (let k = 0; k < sinif.hiz; k += 1) {
      const bas = dk + rnd(), sure = ustel(rnd, sinif.ort);
      if (bas + sure > T) acik.push({ bas, bitis: bas + sure });
    }
  }
  return acik;
}

// Paylasilan veri katmani: yeni surum yeni bicimde yazar, geri alma kodu geri alir, satiri almaz.
export function veriKatmani(rnd, acikDk, yazmaHizi = 140, gunceleme = 0.35) {
  let yeniBicim = 0, sonraGuncellenen = 0;
  for (let dk = 0; dk < acikDk; dk += 1) {
    for (let k = 0; k < yazmaHizi; k += 1) {
      yeniBicim += 1;
      if (rnd() < gunceleme) sonraGuncellenen += 1;  // geri alma sonrasi eski surumce guncellenen
    }
  }
  return { yeniBicim, kayip: sonraGuncellenen, sessiz: yeniBicim - sonraGuncellenen };
}

Modelin ayarı pencere: eski ortamın anahtar çevrildikten sonra kaç dakika daha ayakta tutulacağı. Bu tek sayı hem geri almanın tur maliyetini hem de düzenin sürekli bedelini belirler, ve ikisini ters yönde belirler.

Kaynak Bedeli ve Geri Alma Turu

// kosum1.mjs — iki duzenin kaynak bedeli ve geri alma tur maliyeti; geri alma penceresi taranir
import { uretec, yayinlar, ikiOrtamli, asamali, TOHUM, KOPYA, YAYIN, TUR_DK, PENCERE_DK, KUSUR_ORT } from './ikiortam.mjs';

const l = yayinlar(uretec(TOHUM));
const bozuk = l.filter((y) => y.bozuk).length;
console.log(`tohum ${TOHUM} | ${YAYIN} yayin, ${KOPYA} kopya, ${bozuk} yayin kusurlu`);
console.log(`kusurun gorunme suresi ust ustel, ortalama ${KUSUR_ORT} dk | bir tur ${TUR_DK} dk\n`);
console.log('duzen                        kopya-dk  pencere ici  pencere disi  ort tur  ort geri alma');
for (const s of [ikiOrtamli(l, PENCERE_DK), asamali(l)]) {
  console.log(`${s.ad.padEnd(28)} ${String(s.kopyaDk).padEnd(9)} ${String(s.pencereIci).padEnd(12)} ` +
    `${String(s.pencereDisi).padEnd(13)} ${s.ortTur.toFixed(2).padEnd(8)} ${s.geriDk.toFixed(1)} dk`);
}
console.log('\ngeri alma penceresi taranir (iki ortamli duzen):');
console.log('pencere  kopya-dk  tek anahtarla  yeniden yayinla  ort tur  ort geri alma  fazladan kopya-dk');
for (const p of [0, 5, 15, 30, 60, 120, 240]) {
  const s = ikiOrtamli(l, p), a = asamali(l);
  console.log(`${`${p} dk`.padEnd(8)} ${String(s.kopyaDk).padEnd(9)} ${String(s.pencereIci).padEnd(14)} ` +
    `${String(s.pencereDisi).padEnd(16)} ${s.ortTur.toFixed(2).padEnd(8)} ${`${s.geriDk.toFixed(1)} dk`.padEnd(14)} ${s.kopyaDk - a.kopyaDk}`);
}
tohum 20260904 | 60 yayin, 16 kopya, 18 yayin kusurlu
kusurun gorunme suresi ust ustel, ortalama 25 dk | bir tur 3 dk

duzen                        kopya-dk  pencere ici  pencere disi  ort tur  ort geri alma
iki ortamli (pencere 30 dk)  40320     11           7             2.56     7.7 dk
asamali (tek ortam)          12000     0            18            2.78     8.3 dk

geri alma penceresi taranir (iki ortamli duzen):
pencere  kopya-dk  tek anahtarla  yeniden yayinla  ort tur  ort geri alma  fazladan kopya-dk
0 dk     11520     0              18               5.00     15.0 dk        -480
5 dk     16320     3              15               4.33     13.0 dk        4320
15 dk    25920     8              10               3.22     9.7 dk         13920
30 dk    40320     11             7                2.56     7.7 dk         28320
60 dk    69120     17             1                1.22     3.7 dk         57120
120 dk   126720    18             0                1.00     3.0 dk         114720
240 dk   241920    18             0                1.00     3.0 dk         229920

Üst tablo vaadi sınırlıyor. Otuz dakikalık pencerede on sekiz kusurlu yayının yalnız on biri tek anahtarla geri alındı; yedisi pencere kapandıktan sonra görüldü ve beş turluk yeniden yayın istedi. Ortalama geri alma turu iki virgül elli altı, aşamalı düzende iki virgül yetmiş sekiz. İki düzen arasındaki fark bu ayarda yüzde sekiz. Karşılığında iki ortamlı düzen üç kat kaynak tüketti: kırk bin üç yüz yirmi kopya-dakikaya karşı on iki bin.

“Anında geri alma” cümlesi, pencerenin kusurun görünme süresinden uzun tutulmasıyla sayıya dönüşüyor. Tarama fiyatı gösteriyor. Altmış dakikalık pencerede on sekiz kusurun on yedisi tek turda geri alındı, ortalama tur bir virgül yirmi ikiye indi — fazladan elli yedi bin yüz yirmi kopya-dakika. Yüz yirmi dakikada tamamı tek tura indi, fazladan bedel yüz on dört bin yedi yüz yirmi kopya-dakika. Kazanılan her tur bir fiyat taşıyor: otuz dakikalık pencerede kırk dört tur kısaldı ve bunun bedeli tur başına altı yüz kırk üç kopya-dakika oldu.

İlk satır ters yönden aynı şeyi söylüyor. Pencere sıfır olduğunda iki ortamlı düzen aşamalı düzenden ucuz (on bir bin beş yüz yirmiye karşı on iki bin), çünkü ikinci ortam yalnız on iki dakikalık hazırlık için ayakta. Ama o düzende hiçbir yayın tek anahtarla geri alınamadı; ortalama tur beşe çıktı. Eski ortamı kapatmakla iki ortamlı dağıtımın tek gerekçesi de kapanıyor.

Geçiş Anında Kesilen İş

// kosum2.mjs — gecis aninda kesilen durum tasiyan istekler ve paylasilan veri katmani
import { uretec, ucustakiler, veriKatmani, SINIFLAR, TOHUM, KOPYA } from './ikiortam.mjs';

const acik = SINIFLAR.map((s) => ({ s, liste: ucustakiler(uretec(TOHUM + s.hiz), s) }));
console.log('anahtar cevrildigi anda ucusta olan is birimleri:');
for (const { s, liste } of acik) console.log(`  ${s.ad.padEnd(15)} ${String(liste.length).padStart(5)} birim (ortalama sure ${s.ort} dk)`);

console.log('\nbosaltma suresi taranir: sure sonunda hala calisan birim kesilir');
console.log('bosaltma  kisa istek  oturum  uzun suren is  kesilen toplam  iki ortam birlikte');
for (const d of [0, 0.5, 1, 5, 15, 30]) {
  const k = acik.map(({ liste }) => liste.filter((u) => u.bitis > 240 + d).length);
  console.log(`${`${d} dk`.padEnd(9)} ${String(k[0]).padEnd(11)} ${String(k[1]).padEnd(7)} ${String(k[2]).padEnd(14)} ` +
    `${String(k[0] + k[1] + k[2]).padEnd(15)} ${2 * KOPYA * d} kopya-dk`);
}

const v = veriKatmani(uretec(TOHUM + 11), 11);
console.log('\npaylasilan veri katmani: anahtar cevrildi, 11. dakikada geri alindi');
console.log(`  yeni bicimde yazilan satir: ${v.yeniBicim}`);
console.log(`  geri alma turu: 1 (kod) | veri icin geri alinan satir: 0`);
console.log(`  geri alma sonrasi eski surumce guncellenip yeni alani silinen satir: ${v.kayip}`);
console.log(`  yeni alani duran, eski surumun gormedigi satir: ${v.sessiz}`);
anahtar cevrildigi anda ucusta olan is birimleri:
  kisa istek         10 birim (ortalama sure 0.04 dk)
  oturum             89 birim (ortalama sure 12 dk)
  uzun suren is      24 birim (ortalama sure 25 dk)

bosaltma suresi taranir: sure sonunda hala calisan birim kesilir
bosaltma  kisa istek  oturum  uzun suren is  kesilen toplam  iki ortam birlikte
0 dk      10          89      24             123             0 kopya-dk
0.5 dk    0           88      24             112             16 kopya-dk
1 dk      0           86      24             110             32 kopya-dk
5 dk      0           68      20             88              160 kopya-dk
15 dk     0           31      14             45              480 kopya-dk
30 dk     0           7       5              12              960 kopya-dk

paylasilan veri katmani: anahtar cevrildi, 11. dakikada geri alindi
  yeni bicimde yazilan satir: 1540
  geri alma turu: 1 (kod) | veri icin geri alinan satir: 0
  geri alma sonrasi eski surumce guncellenip yeni alani silinen satir: 491
  yeni alani duran, eski surumun gormedigi satir: 1049

Anahtar çevrildiği anda uçuşta yüz yirmi üç iş birimi vardı. Bunların onu kısa istek, seksen dokuzu oturum, yirmi dördü uzun süren iş. Yarım dakikalık boşaltma kısa isteklerin tamamını kurtardı — ve oturumların yalnız birini. Bir dakikalık boşaltma seksen dokuzu seksen altıya indirdi, uzun süren işlerin hiçbirine dokunmadı.

Sebep ölçek farkıdır. Boşaltma süresi kısa isteğin ömrüne göre ayarlanır; oturum on iki, uzun süren iş yirmi beş dakika yaşar — iki-üç mertebe üstünde. Yüz yirmi üç birimin on ikiye inmesi otuz dakikalık boşaltma istiyor, ve o otuz dakika boyunca iki sürüm aynı veri katmanına birlikte yazıyor. Kesintisiz geçişin bedeli yalnız dokuz yüz altmış kopya-dakika değil; iki sürümün aynı anda yazdığı bir yarım saattir.

Bir hesap daha yapılmalı. Her geçiş seksen dokuz oturum kesiyorsa, temiz bir sürümün boşuna geri alınması iki geçiş demektir: yüz yetmiş sekiz oturum ve kırk sekiz uzun süren iş. Yanlış geri almanın bedeli, kusurun kendisinin bedelinden büyük olabilir — ve yanlış geri almanın kaç kez olduğu, geri alma kararının değil ondan önceki kapının ayarına bağlıdır.

Geri Almanın Geri Almadığı

Son blok tek anahtarın sınırını gösteriyor. Anahtar çevrildi, on birinci dakikada kusur görüldü, geri alma bir turda tamamlandı. Kod eski sürüme döndü. O on bir dakikada paylaşılan veri katmanına bin beş yüz kırk satır yeni biçimde yazılmıştı; geri alma bunların sıfırını geri aldı.

İki ayrı zarar var. Dört yüz doksan bir satır, geri almadan sonra eski sürüm tarafından güncellendi; eski sürüm yeni alanı tanımadığı için o alan yazma sırasında düştü ve bilgi kalıcı olarak kayboldu. Kalan bin kırk dokuz satır yeni alanını taşımaya devam ediyor; eski sürüm onları görmüyor, dolayısıyla sessizler — ama yeni sürüm geri geldiğinde bu iki küme arasında biçim ayrımı olacak.

İki ortamlı dağıtım kodun geri alınmasını tek tura indirir. Veri katmanı paylaşıldığında geri alma kapsamı kodla sınırlıdır ve o sınır tur maliyetinde hiç görünmez: bir turluk geri alma, bin beş yüz kırk satırlık bir kalıntı bırakabilir.

Kapının Üç Sayısı

Tuttuğu: on sekiz kusurlu yayının hepsi sonunda geri alındı. Yalnız kendisinin tuttuğu: otuz dakikalık pencerede on bir yayının tek turda geri alınması — bu yalnız eski ortam ayaktayken mümkündür ve toplam kırk dört tur, yani yüz otuz iki dakika kazandırdı. Marjinalin fiyatı tur başına altı yüz kırk üç kopya-dakikadır.

Kaçırdığı: pencere kapandıktan sonra görülen yedi yayın, ve her geri almada veri katmanına yazılmış satırlar — örnek yayında bin beş yüz kırk satır, dört yüz doksan biri kalıcı kayıp. Yanlış tuttuğu: temiz bir sürümün geri alınması iki geçiş, yüz yetmiş sekiz oturum ve kırk sekiz uzun süren iş demektir. Eklediği süre: yayın başına on iki dakika hazırlık artı pencere süresi; kesintisiz geçiş için otuz dakikaya kadar boşaltma; toplam kırk bin üç yüz yirmi kopya-dakika.

Özet

  • Otuz dakikalık pencerede on sekiz kusurlu yayının on biri tek anahtarla, yedisi beş turluk yeniden yayınla geri alındı; ortalama tur iki virgül elli altı, aşamalı düzende iki virgül yetmiş sekiz.
  • Kaynak bedeli üç kat: kırk bin üç yüz yirmi kopya-dakikaya karşı on iki bin. Pencereyi yüz yirmi dakikaya çıkarmak tüm yayınları tek tura indiriyor, fazladan bedeli yüz on dört bin yedi yüz yirmi kopya-dakika.
  • Pencere sıfır olduğunda iki ortamlı düzen aşamalıdan ucuz çıkıyor ama tek anahtarla geri alınabilen yayın kalmıyor: eski ortamı kapatmak kalıbın gerekçesini de kapatıyor.
  • Geçiş anında yüz yirmi üç iş birimi uçuştaydı. Yarım dakikalık boşaltma kısa isteklerin tamamını kurtardı, seksen dokuz oturumun yalnız birini; on ikiye inmek otuz dakikalık boşaltma ve iki sürümün yarım saat birlikte yazması demek.
  • Paylaşılan veri katmanında bir turluk geri alma bin beş yüz kırk satırın sıfırını geri aldı; dört yüz doksan biri eski sürümce güncellenip kalıcı olarak kayboldu.
  • Temiz bir sürümün boşuna geri alınması iki geçiş, yüz yetmiş sekiz oturum ve kırk sekiz uzun süren iş kesintisi demektir; bu sayı geri alma kapısının değil, ondan önceki kapının ayarına bağlıdır.

Sonraki Adım

Bu dersin bütün ölçümleri tek bir zorunluluğa dayanıyordu: yeni davranışı açmak için yeni sürümü trafiğe koymak gerekiyor, geri almak için de trafikten çekmek. Yayın ile davranışın açılması aynı işlem olduğu sürece geri alma hep bir dağıtım işidir — turu, geçiş anı ve veri kalıntısı vardır. Bu ikisi ayrılabilir. Davranış kodda taşınıp bir kayıtla kapalı tutulursa, açma ve kapama artık dağıtım değil bir ayar değişikliğidir; geri alma tur maliyeti sıfıra yaklaşır. Sonraki ders bu ayrımı ölçer: ayrımın kazandırdığı turu, açma kararının kendi kapısını, ve kapalı kalan her kaydın zamanla biriktirdiği borcu.

İlerlemeni kaydetmek ve not almak için Giriş yap

Notlarım

Not almak için giriş yapmalısın.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat