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.