İçeriğe geç
academia.sh

Ders 15 / 15

Yeniden İnşa Temelli Güncelleme

Aynı temel görüntü düzeltmesi otuz bir kopyada üç yolla koşturulur ve yama gecikmesi gün cinsinden ölçülür: yerinde yama bütün filoyu 5,25 günde kapatır ama koruma kopya ağırlıklı ortalama 2,61 gün sonra kaybolur ve otuz günün yüzde 72,8'i açık geçer; kod değişikliğiyle yeniden inşa son kopyayı 14,25 günde kapatır, açık pay yüzde 19,4'tür; zamanlanmış yeniden inşa dokuz servisi de 1,75 günde kapatır ve açık payı yüzde 5,8'e indirir. Bedeli haftalık kopya yeniden başlatmasının 73,5'ten 96,75'e, yani yüzde 31,6 artmasıdır; iki kopyalı servisler her turda doksan saniye boyunca kapasitelerinin yarısını yitirir.

İçindekiler

Önceki ders sürekli denetimin bulgularını sahibine göre ayırdı ve erken aşama sütununda otuz iki bulgu yapı yazdı: değişken görüntü etiketi, imzasız görüntü ve eski çalışma zamanı sürümü. Üçü de yerinde düzeltilemez; kapanmaları için yeni bir görüntü inşa edilip otuz bir kopyanın yeniden dağıtılması gerekir.

Bu ders o mesafeyi ölçer ve ölçü birimi gündür: bir düzeltme yayımlandıktan sonra filonun son kopyasında koşmaya başlaması kaç gün alıyor ve o süre boyunca kaç kopya açık kalıyor. Değişmez altyapının gerekçesi — makinelerin ayrışması, geri alma turu, taşınamayan yerel durum — Kod Olarak Altyapı kursunda ölçüldü ve burada girdi olarak alınıyor. Soru başkadır: yama gecikmesi kaç güne iniyor ve karşılığında kaç yeniden başlatma isteniyor.

  • AD23. Ortam aynıdır: dokuz servis, otuz bir kopya, bir küme. Gerçek bir yapı ya da dağıtım koşturulmuyor; ölçülen şey node ile kurulan bir modeldir. Bütün aşama süreleri gün cinsinden modelde verilmiştir ve sayılar bunlardan türetilir; duvar saati ölçülmüyor.
  • AD24. Servis başına dağıtımlar eşit aralıklıdır ve haftalık sürüm toplamı önceki derste kullanılan on sekizdir. Gerçekte aralık dağılır; dağılım kuyruğu uzatır, sıralamayı değiştirmez.
  • AD25. Yerinde yama koşan kapsülün dosya sistemine uygulanır, görüntüye yazılmaz; bir sonraki dağıtım yamasız görüntüyü geri getirir. Modelin belirleyici varsayımı budur.
  • AD26. Kademeli dağıtımda aynı anda en fazla bir kopya kapalıdır ve hazır olma süresi kopya başına sabittir; yeniden başlatmanın kendi arıza olasılığı modellenmiyor.

Üç Yol ve Yama Gecikmesi

// guncelleme.mjs — otuz bir kopya, uc guncelleme yolu ve otuz gunluk pencere. MODELDIR.
// [servis, kopya, haftalik surum]; surum toplami 18, onceki derste kullanilan degerin dagilimi.
export const SERVIS = [
  ['portal-onu', 6, 5], ['abone-servisi', 4, 4], ['faturalama', 3, 3], ['is-emri', 3, 2],
  ['bildirim', 2, 1], ['rapor', 2, 1], ['sayac-toplama', 6, 1], ['dogrulayici', 3, 0.5],
  ['saha-senkron', 2, 0.5],
];
export const PENCERE = 30, HAZIR = 45; // gun; kopya basina hazir olma suresi (sn)
export const aralik = (s) => 7 / s[2];
export const kopya = SERVIS.reduce((a, s) => a + s[1], 0);

// Asama sureleri (gun): yerinde yama = paket deposu 0.5 + onay 1 + bakim penceresi 3.5 +
// uygulama 0.25; yeniden insa = kayit defterine yansima 0.5 + yapi ve hat 0.25; zamanlanmis
// bunlara gecelik tetikleyiciyi (1) ekler.
const YAMA = 0.5 + 1 + 3.5 + 0.25, INSA = 0.25, KAYIT = 0.5, TETIK = 1;
const sonraki = (s, t) => Math.ceil((t + 1e-9) / aralik(s)) * aralik(s);

// Yerinde yama goruntuye yazilmaz: bir sonraki dagitim yamasiz goruntuyu geri getirir.
export function korumali(yol, s) {
  const ara = [];
  if (yol === 'yerinde yama')
    for (let w = YAMA; w < PENCERE; w += 7) ara.push([w, Math.min(sonraki(s, w), PENCERE)]);
  else if (yol === 'kod degisikligiyle yeniden insa')
    ara.push([Math.min(sonraki(s, KAYIT) + INSA, PENCERE), PENCERE]);
  else ara.push([Math.min(KAYIT + TETIK + INSA, PENCERE), PENCERE]);
  return ara.filter(([b, e]) => e > b);
}

export const YOLLAR = ['yerinde yama', 'kod degisikligiyle yeniden insa', 'zamanlanmis yeniden insa'];
export const koruma = (yol, s) => korumali(yol, s).reduce((a, [b, e]) => a + e - b, 0);
export const ilk = (yol, s) => korumali(yol, s)[0] ?? [PENCERE, PENCERE];
export const acik = (yol) => SERVIS.reduce((a, s) => a + s[1] * (PENCERE - koruma(yol, s)), 0);
export const gen = (B) => (h) => h.map((v, j) => j ? String(v).padStart(B[j]) : String(v).padEnd(B[0])).join('');
// kosum1.mjs — ayni yama, uc yol: son kopyanin kapanma gunu ve acik kopya-gun
import { SERVIS, YOLLAR, PENCERE, kopya, aralik, koruma, ilk, acik, gen } from './guncelleme.mjs';

console.log(`${SERVIS.length} servis, ${kopya} kopya, haftada ${SERVIS.reduce((a, s) => a + s[2], 0)} surum; ` +
  `dagitim araligi ${Math.min(...SERVIS.map(aralik)).toFixed(2)} ile ${Math.max(...SERVIS.map(aralik))} gun arasinda\n`);

const yy = gen([32, 12, 12, 17, 11]);
console.log(yy(['yol', 'ilk kopya', 'son kopya', 'acik kopya-gun', 'acik pay']));
for (const y of YOLLAR) {
  const g = SERVIS.map((s) => ilk(y, s)[0]);
  console.log(yy([y, Math.min(...g).toFixed(2), Math.max(...g).toFixed(2), acik(y).toFixed(1),
    `%${(100 * acik(y) / (kopya * PENCERE)).toFixed(1)}`]));
}

const ys = gen([16, 8, 10, 14, 15]);
console.log('\n' + ys(['servis', 'kopya', 'aralik', 'yama dayanir', 'insa ilk gun']));
for (const s of SERVIS) {
  const [b, e] = ilk('yerinde yama', s);
  console.log(ys([s[0], s[1], aralik(s).toFixed(2), (e - b).toFixed(2),
    ilk('kod degisikligiyle yeniden insa', s)[0].toFixed(2)]));
}
const dayan = SERVIS.reduce((a, s) => { const [b, e] = ilk('yerinde yama', s); return a + s[1] * (e - b); }, 0) / kopya;
console.log(`yerinde yama kopya agirlikli ortalama ${dayan.toFixed(2)} gun dayaniyor; ${PENCERE} gunde ` +
  `korumali gecen sure %${(100 * SERVIS.reduce((a, s) => a + s[1] * koruma('yerinde yama', s), 0) / (kopya * PENCERE)).toFixed(1)}`);
9 servis, 31 kopya, haftada 18 surum; dagitim araligi 1.40 ile 14 gun arasinda

yol                                ilk kopya   son kopya   acik kopya-gun   acik pay
yerinde yama                            5.25        5.25            676.6      %72.8
kod degisikligiyle yeniden insa         1.65       14.25            180.6      %19.4
zamanlanmis yeniden insa                1.75        1.75             54.3       %5.8

servis             kopya    aralik  yama dayanir   insa ilk gun
portal-onu             6      1.40          0.35           1.65
abone-servisi          4      1.75          1.75           2.00
faturalama             3      2.33          1.75           2.58
is-emri                3      3.50          1.75           3.75
bildirim               2      7.00          1.75           7.25
rapor                  2      7.00          1.75           7.25
sayac-toplama          6      7.00          1.75           7.25
dogrulayici            3     14.00          8.75          14.25
saha-senkron           2     14.00          8.75          14.25
yerinde yama kopya agirlikli ortalama 2.61 gun dayaniyor; 30 gunde korumali gecen sure %27.2

Üst tablonun ilk iki sütunu yerinde yamayı en iyi seçenek gibi gösteriyor: filonun tamamı beş virgül iki beş günde kapanıyor, çünkü yama bütün kopyalara aynı bakım penceresinde uygulanıyor. Kod değişikliğine bağlı yeniden inşanın son kopyası ise on dört virgül iki beş günde kapanıyor.

Üçüncü sütun kararı tersine çeviriyor. Otuz günlük pencerede yerinde yama altı yüz yetmiş altı virgül altı kopya-gün açık bırakıyor (filonun yüzde yetmiş iki virgül sekizi), yeniden inşa yüz seksen virgül altı kopya-gün (yüzde on dokuz virgül dört). Aynı yama, aynı filo, aynı otuz gün: ilk kapatmayı üç kat hızlı yapan yol, açık kalan süreyi dört kat büyütüyor.

Yamanın Dayanmadığı Yer

Alt tablo bunun nedenini servis servis yazıyor. Yerinde yama görüntüye yazılmadığı için bir sonraki dağıtım yamasız görüntüyü geri getiriyor; yamanın ne kadar dayanacağı bu yüzden yamanın kendisine değil, servisin dağıtım sıklığına bağlı.

Sıralama beklenenin tersidir. Portal önü iki günde birden sık dağıtılıyor ve yaması sıfır virgül otuz beş gün, yani sekiz saatten kısa dayanıyor: altı kopyalı ve kenarda duran servis, filonun yamayı en çabuk kaybeden servisidir. Doğrulayıcı ile saha senkronu iki haftada bir dağıtıldığı için yamayı sekiz virgül yetmiş beş gün taşıyor. Yerinde yamanın en iyi çalıştığı yer, en az dağıtılan ve genellikle en az açık trafiğe bakan servistir.

Kopya ağırlıklı ortalama iki virgül altı bir gündür; otuz günün yalnız yüzde yirmi yedi virgül ikisi korumalı geçiyor ve haftalık bakım penceresi tekrarlansa da tablo değişmiyor, çünkü pencere haftada bir, dağıtım bazı servislerde günde birden sık. Zamanlanmış yeniden inşa sütunu ise dokuz servis için de aynı sayıyı taşıyor: bir virgül yetmiş beş gün. Tetikleyici temel görüntünün değişmesidir, servisin kod değişikliği değil; dağıtım sıklığı denklemden çıkıyor.

Kesintinin Fiyatı

// kosum2.mjs — yeniden insanin getirdigi kesinti ve calisma zamani katmaninin tuttugu pencere
import { SERVIS, YOLLAR, PENCERE, HAZIR, kopya, acik, gen } from './guncelleme.mjs';

const yk = gen([8, 9, 15, 17, 18]);
console.log(yk(['kopya', 'servis', 'pencere (sn)', 'kapasite kaybi', 'haftalik yeniden']));
for (const k of [...new Set(SERVIS.map((s) => s[1]))].sort((a, b) => b - a)) {
  const g = SERVIS.filter((s) => s[1] === k);
  console.log(yk([k, g.length, k * HAZIR, `%${(100 / k).toFixed(1)}`, g.reduce((a, s) => a + s[1] * s[2], 0).toFixed(1)]));
}
const mevcut = SERVIS.reduce((a, s) => a + s[1] * s[2], 0), ek = (3 / 4) * kopya;
const sirali = SERVIS.map((s) => [s[0], s[1] * s[2]]).sort((a, b) => b[1] - a[1]);
console.log(`filo penceresi: dokuz servis paralel ${(Math.max(...SERVIS.map((s) => s[1])) * HAZIR / 60).toFixed(2)} dk, ` +
  `sirayla ${(kopya * HAZIR / 60).toFixed(2)} dk; en cok yeniden baslayan ${sirali[0][0]} (${sirali[0][1]}/hafta), ` +
  `en az ${sirali[8][0]} (${sirali[8][1]}/hafta)`);
console.log(`haftalik kopya yeniden baslatmasi ${mevcut.toFixed(1)}; zamanlanmis yeniden insa (ayda 3 temel ` +
  `goruntu) ${ek.toFixed(2)} ekler: %${(100 * ek / mevcut).toFixed(1)} artis. Yerinde yama sifir yeniden ` +
  `baslatma ekler, karsiliginda ayda 4 bakim penceresi ve ${4 * kopya} kopya dokunusu ister`);

// Yalniz calisma zamaninda durdurulabilen sinif: yamasi cikmamis bilesen acigi, gunde 40 istek
// (bu kursun ilk dersinden). Yama gecikmesi, o sinifi tutan agin genisligidir.
const GUNLUK = 40, ya = gen([32, 16, 22, 15]);
console.log('\n' + ya(['yol', 'acik filo-gun', 'aginin tuttugu istek', 'en iyiye kat']));
const enIyi = acik('zamanlanmis yeniden insa') / kopya;
for (const y of YOLLAR) {
  const g = acik(y) / kopya;
  console.log(ya([y, g.toFixed(2), Math.round(g * GUNLUK), `${(g / enIyi).toFixed(1)}x`]));
}
console.log(`otuz gunluk pencerede toplam ${PENCERE * GUNLUK} istek gelir`);
kopya      servis   pencere (sn)   kapasite kaybi  haftalik yeniden
6               2            270            %16.7              36.0
4               1            180            %25.0              16.0
3               3            135            %33.3              16.5
2               3             90            %50.0               5.0
filo penceresi: dokuz servis paralel 4.50 dk, sirayla 23.25 dk; en cok yeniden baslayan portal-onu (30/hafta), en az saha-senkron (1/hafta)
haftalik kopya yeniden baslatmasi 73.5; zamanlanmis yeniden insa (ayda 3 temel goruntu) 23.25 ekler: %31.6 artis. Yerinde yama sifir yeniden baslatma ekler, karsiliginda ayda 4 bakim penceresi ve 124 kopya dokunusu ister

yol                                acik filo-gun  aginin tuttugu istek   en iyiye kat
yerinde yama                               21.83                   873          12.5x
kod degisikligiyle yeniden insa             5.83                   233           3.3x
zamanlanmis yeniden insa                    1.75                    70           1.0x
otuz gunluk pencerede toplam 1200 istek gelir

Zamanlanmış yeniden inşanın bedeli haftalık kopya yeniden başlatmasının yetmiş üç virgül beşten doksan altı virgül yetmiş beşe çıkmasıdır: yüzde otuz bir virgül altı artış. Bu artış eşit dağılmıyor. Portal önü zaten haftada otuz kez yeniden başlıyor ve ek yükü fark etmez; saha senkronu haftada bir kez yeniden başlarken üstüne bir buçuk kat ekleniyor. Yük en az dağıtılan servislere biniyor ve o servisler yamayı en uzun taşıyan servislerdi.

Kapasite kaybı sütunu ikinci bedeli veriyor. Kademeli dağıtımda aynı anda bir kopya kapalıysa altı kopyalı serviste kayıp yüzde on altı virgül yedi, iki kopyalı serviste yüzde ellidir. Üç servis her turda doksan saniye boyunca kapasitesinin yarısıyla koşuyor; dokuz servis paralel dağıtılırsa filo dört buçuk dakikada dönüyor. Asıl karar bu dakikaların kabul edilebilir olup olmadığıdır ve bu soru yama gecikmesinden ayrı sorulamaz.

Ağın Genişliği

Alt tablo kursun bütün ölçümünü tek bir sayıya bağlıyor. İlk derste, uygulama katmanı güvenlik duvarının durdurduğu altı yüz altmış altı isteğin yalnız kırkı — yüzde altısı — daha erken bir aşamada kapatılamayan sınıftı: bileşende yaması çıkmamış bir açık, günde kırk istek, yamanın gelmesini bekliyor.

Yama gecikmesi tam olarak o ağın gerilmek zorunda olduğu süredir. Zamanlanmış yeniden inşada çalışma zamanı katmanı yetmiş isteği tek başına tutuyor; kod değişikliğine bağlı yeniden inşada iki yüz otuz üç, yerinde yamada sekiz yüz yetmiş üç — on iki buçuk kat. Aynı kural kümesi, aynı eşik; değişen tek şey arkasındaki güncelleme yolu. Çalışma zamanı savunmasının değeri kural kümesinin kalitesiyle değil, arkasındaki kalemin ne kadar süre açık kaldığıyla ölçülür.

Özet

  • Üç yolda son kopyanın kapanma günü 5,25 / 14,25 / 1,75’tir; otuz günlük açık kopya-gün 676,6 / 180,6 / 54,3, yani yüzde 72,8 / 19,4 / 5,8.
  • Yerinde yama ilk kapatmayı en hızlı yapar ama görüntüye yazılmadığı için bir sonraki dağıtımda düşer; koruma kopya ağırlıklı ortalama 2,61 gün dayanır. En sık dağıtılan servis yamayı 0,35 günde kaybeder, en seyrek dağıtılan 8,75 gün taşır.
  • Zamanlanmış yeniden inşa dokuz servisi de 1,75 günde kapatır: tetikleyici temel görüntünün değişmesidir ve dağıtım sıklığı denklemden çıkar.
  • Bedeli haftalık kopya yeniden başlatmasının 73,5’ten 96,75’e çıkmasıdır (yüzde 31,6) ve yük en az dağıtılan servislere biner; iki kopyalı üç servis her turda 90 saniye boyunca kapasitesinin yarısıyla koşar.
  • Yalnız çalışma zamanında durdurulabilen sınıf günde 40 istektir; katmanın tek başına tuttuğu istek 70 / 233 / 873’tür. Yama gecikmesini kısaltmak katmanın yükünü kural yazmadan 12,5 kat azaltır.

Kurs Kapanışı

Ders Katmanın yakaladığı Kaçırdığı / yanlış kestiği Daha erken kapatma aşaması
Güvenlik duvarı 666 kötü istek/gün 1.460 kaçan, eşik 3’te 8.000 kesilen 626 kod, yalnız burada 40
Hız sınırlama 5.760 istek (kayan pencere) 6.900 kaçan, 880 meşru tepe 3.910 burada, gerisi kod ve tasarım
Doldurma savunması 5.512 deneme, 13 ele geçirme doldurmada 0 engel, 91 hesap kilidi kod 70’ten 5’e, tasarım 0
Güvenlik başlıkları 55 hücre, isteğin %63,4’ü 3 uç dışarıda, 24 hücre etkisiz 3 başlık kod, 3 başlık burada
Anormallik tespiti 3 kötü oturum (eşik 20) 2/4 meşru işaret, 7.106 kayıt 1 kod, 1 tasarım, 1’i için yok
Sır deposu 31 kullanılan kalem 48 karşılıksız kalem (%61) dağıtım bildirimi, 9 kat ucuz
Kısa ömürlü kimlik 16 kalemde 2.033 kat 15 kalem sabit, maruziyetin %99,96’sı tasarım, 8 sır
Anahtar döndürme asgari örtüşmede 0 kesme 60 dakikada 87.427 kesilen istek kod, 1.440’tan 240 dakikaya
İş yükü kimliği 20 statik sır kalkıyor 11 kalem kalıyor, 7 uygulama sırlı tasarım, 4 geçidin 3’ü
Sızıntı müdahalesi erken iptal 150.934 çağrı 224.171 çağrı, 68.503 kesilen istek yapı, 2.880 dakika gecikme
Ağ bölütleme 35 çift kapanır, 7,1’den 4,1’e depoya 1’den 2 sıçrama, 3,8 çift kesinti tasarım, çağrı sözleşmesi
Çalışma zamanı tespiti 21 olayın 12’si 9 kaçan, 4 yanlış pozitif 9 olay yapı, yalnız burada 3
Kabul denetleyicisi 22 kusur, ilk 6 kural 19’u 5 meşru ret, 5/5 ekip 19 hat kapısı, yalnız burada 3
Yapılandırma denetimi 107 bulguya sahip bulunur 40 sahipsiz, 12 haftada 112 122 daha erken, 25’i için yok
Yeniden inşa son kopya 1,75 günde %5,8 açık, +%31,6 yeniden başlatma yapı, temel görüntü

Üçüncü sütun bu kursun kuralıdır. On beş dersin hiçbirinde çalışma zamanı katmanı yakaladığı hacmin tamamına sahip çıkamadı: güvenlik duvarının durdurduğu her yüz istekten doksan dördü kodda, kabul denetleyicisinin kapattığı yirmi iki kusurun on dokuzu hat kapısında, sürekli denetimin bulduğu yüz kırk yedi bulgunun yüz yirmi ikisi daha erken bir aşamada kapatılabilirdi. Katmanın kendi payı her derste küçük ve her derste gerçektir — kırk istek, üç olay, üç kusur, yirmi beş sahipsiz bulgu. Çalışma zamanı savunması bir yama değil, daha erken kapatılamayan kalem için gerilen bir ağdır. Her kalem için “bu daha ucuza nerede kapanırdı” sorusu sorulmadığında katman bir savunma olmaktan çıkıp bir bahaneye dönüşür: gösterge tablosundaki büyük sayı, kapatılmamış bir kod kusurunun her gün yeniden yakalanmasından başka bir şey olmaz.

İkinci sütun da aynı ısrarla okunmalıdır. Yanlış kesilen sekiz bin istek, kilitlenen doksan bir hesap, reddedilen beş meşru dağıtım, döndürmede kesilen seksen yedi bin dört yüz yirmi yedi istek — bunlar katmanın yan etkisi değil, fiyatıdır. Yanlış pozitifi yazılmayan bir çalışma zamanı savunması ölçülmemiş sayılır.

Bir sonraki kurs — M25/K05 Tespit, Müdahale ve Uyumluluk — bu tablonun cevaplamadığı soruyu alıyor. Katmanlar kuruldu ve neyi kaçırdıkları tek tek yazıldı; ama kaçırılanın kaçırıldığını hangi kaydın göstereceği hiç sorulmadı. İhlal gerçekleştiğinde kimin ne yapacağı ve bütün bu pratiğin bir denetimde nasıl kanıtlanacağı da sorulmadı. Ölçülmüş bir savunma, olay anında okunabilir bir kayıt ve dışarıdan doğrulanabilir bir kanıt bırakmadığı sürece yalnızca kendi tablosunda doğrudur.

İ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