Ders 14 / 20
Felaket Kurtarma Tatbikatı
Kurtarma planının denetimli bir arıza denemesiyle sınanması: plandaki adım sürelerinin tatbikatta ölçülenle karşılaştırılması, planda hiç yazmayan adımın ortaya çıkması, kurtarma süresi hedefinin plana göre tutup tatbikata göre kırılması ve devralma penceresinde yarıda kalan iş akışlarının iki teslim politikasında bıraktığı yinelenen yan etki ile yarım kalan işin sayılması.
İçindekiler
Bu konu beş derste bir kurtarma düzeni kurdu: devralma eşiği ve geri dönüş politikası, sağlık ucunun içeriği ve aralığı, kurtarma süresi ile veri kaybı hedefleri, alan ve bölge yerleşimi, damgalar ve coğrafi kopyalar. Her dersin sayıları bir modelden ya da aritmetikten çıktı ve hepsi aynı şeyi varsaydı: plan yazıldığı gibi çalışacak.
Bu varsayım sınanmadıkça bir tahmindir. Felaket kurtarma tatbikatı, planı denetimli bir arıza denemesiyle sınamaktır: belirli bir birim, seçilmiş bir zamanda, bilinerek devre dışı bırakılır ve kurtarmanın gerçekte nasıl işlediği ölçülür. Bir tatbikatın kapsamı üç şeyle tanımlanır — hangi birim (kopya, alan, bölge, damga), hangi arıza kipi (durma, yavaşlama, bölünme) ve ne kadar süre. Kapsam yazılmadan yapılan bir deneme, ölçtüğü şeyi de söyleyemez.
Plan ile Ölçülenin Farkı
Bir kurtarma planı adımların listesidir ve her adıma bir süre biçilmiştir. Tatbikatın birinci çıktısı bu sürelerin karşılaştırmasıdır. Aşağıdaki hesapta ölçülen değerler uydurulmadı: önceki derslerin parametrelerinden geliyor. Algılama süresi birinci dersin seçtiği eşiktir, ısınma süresi ikinci dersin arıza takvimindeki ısınma penceresidir.
KU8 — yönlendirme kaydının yaşam süresi 3 tur. Gerekçe: yeni etkin kopyaya yönlendirme, eskisinin kaydı geçersiz olana kadar tamamlanmaz. KU9 — kuyruk tüketicisinin yeniden bağlanması 2 tur. İkisi de varsayımdır ve K01’in tablosuna eklenmez.
// tatbikat/plan.mjs — kurtarma planindaki adim sureleri ile tatbikatta olculenin karsilastirilmasi. // Olculen degerler onceki derslerin parametrelerinden gelir; tur soyut bir adimdir. const ESIK = 3; // 01. ders: secilen tetikleme esigi const TERFI = 1; // 01. ders: terfi turu const YASAM = 3; // KU8 (varsayim): yonlendirme kaydinin yasam suresi (tur) const ISINMA = 8; // 02. ders takvimi: bir kopyanin isinma suresi (tur) const KUYRUK = 2; // KU9 (varsayim): kuyruk tuketicisinin yeniden baglanmasi (tur) const DOGRULAMA = 2; // planda yazili dogrulama adimi const TUR_SN = 2; // KU1 (varsayim): bir tur 2 saniye const TEPE_UC = 513.89; // K01: tepe uctaki istek/s const PLANLI = 15.0; // K01: aylik butcenin planli isler payi (dakika) const b = (x, n = 2) => x.toFixed(n); const ADIM = [ ["algilama", 1, ESIK], ["terfi", 1, TERFI], ["yonlendirme", 1, YASAM], ["onbellek-isinma", 0, ISINMA], ["kuyruk-baglanma", 1, KUYRUK], ["dogrulama", 2, DOGRULAMA], ]; console.log(`${"adim".padEnd(17)}${"planlanan".padStart(11)}${"tatbikatta".padStart(12)}${"sapma".padStart(8)}`); let p = 0, o = 0; for (const [ad, plan, olculen] of ADIM) { p += plan; o += olculen; const d = olculen - plan; console.log(`${ad.padEnd(17)}${(plan + " tur").padStart(11)}${(olculen + " tur").padStart(12)}` + `${((d >= 0 ? "+" : "") + d).padStart(8)}`); } console.log(`${"toplam".padEnd(17)}${(p + " tur").padStart(11)}${(o + " tur").padStart(12)}` + `${("+" + (o - p)).padStart(8)}`); console.log(`plan/olculen orani ${b(o / p)} kat`); console.log(`\nplan ${p * TUR_SN} sn, tatbikatta olculen ${o * TUR_SN} sn (KU1: tur = ${TUR_SN} sn)`); for (const hedef of [30, 60]) { const pl = p * TUR_SN <= hedef ? "gecer" : "kirilir", ol = o * TUR_SN <= hedef ? "gecer" : "kirilir"; console.log(` kurtarma suresi hedefi ${hedef} sn: plana gore ${pl}, tatbikata gore ${ol}`); } console.log(` tatbikat penceresinde dusen uc istegi = ${b(o * TUR_SN * TEPE_UC)} (tepe yukte)`); console.log(`\ntatbikatin kendi bedeli (bir tatbikat = ${b((o * TUR_SN) / 60)} dk):`); console.log(`${"siklik".padEnd(14)}${"aylik tatbikat".padStart(16)}${"aylik dakika".padStart(14)}` + `${"planli payin".padStart(14)}${"aylik butcenin".padStart(16)}`); for (const [ad, ayda] of [["haftada 1", 4], ["ayda 1", 1], ["uc ayda 1", 1 / 3]]) { const dk = (ayda * o * TUR_SN) / 60; console.log(`${ad.padEnd(14)}${b(ayda).padStart(16)}${b(dk).padStart(14)}` + `${("%" + b((100 * dk) / PLANLI)).padStart(14)}${("%" + b((100 * dk) / 43.2)).padStart(16)}`); } console.log(`plandaki 6 adimin ${ADIM.filter(([, pl, ol]) => ol !== pl).length}'i saptigi olculdu; ` + `biri (onbellek-isinma) planda hic yoktu`);
adim planlanan tatbikatta sapma algilama 1 tur 3 tur +2 terfi 1 tur 1 tur +0 yonlendirme 1 tur 3 tur +2 onbellek-isinma 0 tur 8 tur +8 kuyruk-baglanma 1 tur 2 tur +1 dogrulama 2 tur 2 tur +0 toplam 6 tur 19 tur +13 plan/olculen orani 3.17 kat plan 12 sn, tatbikatta olculen 38 sn (KU1: tur = 2 sn) kurtarma suresi hedefi 30 sn: plana gore gecer, tatbikata gore kirilir kurtarma suresi hedefi 60 sn: plana gore gecer, tatbikata gore gecer tatbikat penceresinde dusen uc istegi = 19527.82 (tepe yukte) tatbikatin kendi bedeli (bir tatbikat = 0.63 dk): siklik aylik tatbikat aylik dakika planli payin aylik butcenin haftada 1 4.00 2.53 %16.89 %5.86 ayda 1 1.00 0.63 %4.22 %1.47 uc ayda 1 0.33 0.21 %1.41 %0.49 plandaki 6 adimin 4'i saptigi olculdu; biri (onbellek-isinma) planda hic yoktu
Toplam satırı dersin ilk sonucudur: plan 6 tur diyordu, tatbikat 19 tur ölçtü — 3,17 kat. Bu oran koşumdan bağımsız türetilmiş bir niceliktir; tur saniyeye çevrilmese de aynı kalır.
Sapma tek bir yerden gelmiyor. Algılama ve yönlendirme adımları planda birer tur yazılmış, oysa birincisi seçilen eşiğe, ikincisi yönlendirme kaydının yaşam süresine bağlıdır — ikisi de başka derslerde verilmiş kararlardır ve plan onları okumamıştır. En büyük sapma ise planda hiç olmayan bir adımdan geliyor: önbelleğin ısınması. Yeni etkin kopya ayaktadır, yazma kabul eder ve sağlık denetimini geçer, ama okumaları soğuk önbellekle karşılar. Planın en pahalı hatası yanlış tahmin değil, eksik adımdır.
Sonuç eşiğe çarpıyor. Otuz saniyelik bir kurtarma süresi hedefi plana bakıldığında rahatça tutuluyor (12 saniye), tatbikata bakıldığında kırılıyor (38 saniye). Altmış saniyelik hedef her iki okumada da geçiyor. Bir hedefin tutulup tutulmadığı plandan okunamaz; tatbikat, hedefi bir iddia olmaktan çıkarıp ölçülmüş bir sayıya bağlayan tek adımdır.
Kapsam ve Sıklık
Tatbikatın kapsamı bir merdivendir ve her basamak farklı bir şey sınar. En alt basamak plan adımlarının kâğıt üzerinde gözden geçirilmesidir; bu, eksik adımı bulabilir ama süreyi ölçemez — yukarıdaki tabloda önbellek ısınmasının planda hiç olmaması bu yolla yakalanabilirdi, sekiz turluk süresi yakalanamazdı. Orta basamak tek bir bileşenin devre dışı bırakılmasıdır; devralma eşiğini ve sağlık ucunun içeriğini sınar. Üst basamak bir alanın ya da bölgenin bütününün kaybıdır ve önceki iki dersin yerleşim kararlarını sınayan tek denemedir; yalnız burada boşta duran kapasitenin gerçek yükü taşıyıp taşımadığı görülür.
Sıklık tablosu bedeli sıklığa bağlıyor. Haftada bir tatbikat ayda 2,53 dakika tutar — planlı işler payının yüzde 16,89’u ve aylık bütçenin yüzde 5,86’sı. Ayda bir tatbikat 0,63 dakika, üç ayda bir 0,21 dakika. Seyrek tatbikat ucuzdur ama iki tatbikat arasında biriken değişiklikler planı yeniden eskitir; ölçülen sapma her seferinde sıfırdan büyür. Bu ders sayıyı verir, seçimi vermez: seçim plandaki adımların ne sıklıkla değiştiğine bağlıdır.
Tatbikatın Ortaya Çıkardığı İkinci Sorun
Tatbikatın son adımı doğrulamadır: kurtarma bittikten sonra verinin ve devam eden işlerin durumuna bakmak. Kurtarma süresi ölçüldü, ama devralma penceresinde yarıda kalan işlere ne olduğu sayılmadı. Aşağıdaki düzenek bir modeldir: gün sonu ücretlendirme akışı sekiz adımdır, dördü yan etkilidir (fatura yazmak, muhasebe kaydı açmak, bildirim göndermek, taşıyıcıya haber vermek) ve devralma penceresi az önce ölçülen 19 turdur.
// tatbikat/is.mjs — tatbikatin veri dogrulama adimi MODELIDIR: devralma penceresinde yarida // kalan is akislarinin iki politikada ne biraktigi sayilir. Tur soyut bir adimdir. const ADIM = [ // ucretlendirme is akisinin adimlari ["durum-oku", false], ["tarife-uygula", false], ["tutar-hesapla", false], ["fatura-yaz", true], ["muhasebe-kaydi", true], ["bildirim-gonder", true], ["tasiyici-bildir", true], ["kapat", false], ]; const TUR = 70, IS_TUR = 4, BASLANGIC_SON = 40; // her turda 4 is baslar, 40. tura kadar const DEVRALMA = 20, PENCERE = 19; // 19 tur: plan.mjs'te olculen toplam function kosum(politika) { const isler = []; const s = { tamamlanan: 0, yinelenenYanEtki: 0, yarimKalan: 0, yenidenBaslayan: 0, atilan: 0 }; for (let t = 1; t <= TUR; t += 1) { const donuk = t >= DEVRALMA && t < DEVRALMA + PENCERE; if (t === DEVRALMA) { for (const w of isler) { if (w.adim === 0 || w.adim >= ADIM.length) continue; // baslamamis ya da bitmis if (politika === "en-az-bir-kez") { s.yenidenBaslayan += 1; s.yinelenenYanEtki += ADIM.slice(0, w.adim).filter(([, y]) => y).length; w.adim = 0; // is bastan calisacak } else { s.atilan += 1; if (ADIM.slice(0, w.adim).some(([, y]) => y)) s.yarimKalan += 1; w.olu = true; } } } if (donuk) continue; // pencere boyunca is ilerlemiyor for (const w of isler) { if (w.olu || w.adim >= ADIM.length) continue; w.adim += 1; if (w.adim === ADIM.length) s.tamamlanan += 1; } if (t <= BASLANGIC_SON) for (let i = 0; i < IS_TUR; i += 1) isler.push({ adim: 0, olu: false }); } return { ...s, toplam: isler.length }; } const s = (x, n) => String(x).padStart(n); console.log(`${TUR} tur, turda ${IS_TUR} is akisi baslar, her akis ${ADIM.length} adim ` + `(${ADIM.filter(([, y]) => y).length} tanesi yan etkili). Devralma ${DEVRALMA}. turda, ` + `pencere ${PENCERE} tur.`); console.log(); console.log("politika | toplam is | tamamlanan | yeniden baslayan | atilan | yinelenen yan etki | yarim kalan"); console.log("---------------|-----------|------------|------------------|--------|--------------------|------------"); for (const p of ["en-az-bir-kez", "en-cok-bir-kez"]) { const r = kosum(p); console.log(`${p.padEnd(14)} | ${s(r.toplam, 9)} | ${s(r.tamamlanan, 10)} | ` + `${s(r.yenidenBaslayan, 16)} | ${s(r.atilan, 6)} | ${s(r.yinelenenYanEtki, 18)} | ${s(r.yarimKalan, 11)}`); }
70 tur, turda 4 is akisi baslar, her akis 8 adim (4 tanesi yan etkili). Devralma 20. turda, pencere 19 tur. politika | toplam is | tamamlanan | yeniden baslayan | atilan | yinelenen yan etki | yarim kalan ---------------|-----------|------------|------------------|--------|--------------------|------------ en-az-bir-kez | 84 | 84 | 28 | 0 | 40 | 0 en-cok-bir-kez | 84 | 56 | 0 | 28 | 0 | 16
İki satır iki kötü sonucu gösteriyor ve arada üçüncü bir seçenek yok. En az bir kez teslimde işlerin hepsi tamamlanıyor: 84/84. Karşılığında devralma anında yarıda olan 28 iş baştan çalışıyor ve daha önce yürütülmüş yan etkili adımlar ikinci kez yürütülüyor — 40 yinelenen yan etki. Bu, 40 fazladan fatura satırı, muhasebe kaydı ya da taşıyıcı bildirimi demektir.
En çok bir kez teslimde yineleme yok, ama tamamlanan iş 84’ten 56’ya iniyor: 28 iş atılıyor ve bunların 16’sı en az bir yan etkili adımı yürütmüş durumda. Yani 16 gönderi için fatura yazılmış ama muhasebe kaydı açılmamış, ya da bildirim gönderilmiş ama iş kapanmamıştır. Bu işler ne tamamlandı ne de geri alındı; sistemde iz bıraktılar ve kimse onları toplamıyor.
Kurtarma penceresinin uzunluğu bu sayıları doğrudan büyütüyor. Pencere 19 tur olduğu için 28 iş yarıda kaldı; plandaki 6 turluk pencerede bu sayı daha küçük olurdu. Kurtarma süresini kısaltmak yalnız kesinti bütçesini korumaz, doğruluk hasarını da küçültür — iki dersin ölçtüğü iki ayrı büyüklük aynı yerde buluşuyor.
İki Günün Sayısı
Arızasız günün bedeli tatbikatın kendisidir. Ayda bir yapılan tatbikat 38 saniye, yani 0,63 dakika tutar ve K01’in planlı işlere ayırdığı 15,0 dakikanın yüzde 4,22’sini harcar. Tepe yükte yapılırsa 19.527,82 uç isteği düşer; bu yüzden tatbikat kapsamı zaman penceresini de içerir. Bedel gerçektir ve gönüllü ödenir.
Arızalı günün kazancı iki tabloyu birlikte okumakla çıkar. Tatbikatsız bir düzende plan 12 saniyelik bir kurtarma süresi vaat ediyordu; gerçek arızada ölçülen 38 saniye olacaktı ve 30 saniyelik hedef ilk arızada kırılacaktı. Tatbikat bu farkı, hedefi kırmadan önce görünür kıldı. Ayrıca planda hiç olmayan bir adımı ortaya çıkardı ve altı adımın dördünün süresinin yanlış yazıldığını ölçtü. Aynı tatbikat, kurtarma süresiyle hiç ilgisi olmayan bir hasarı da saydı: 40 yinelenen yan etki ya da 16 yarım kalan iş.
Bu karşılaştırma bu kursun kuralının en açık örneğidir. Tatbikat arızasız günde yalnız bedel öder — 0,63 dakika ve 19.527,82 istek. Kazancı yalnız arıza gerçekleştiğinde görünür ve o gün, bilinmeyen bir sapmayla karşılaşmamak biçiminde ortaya çıkar.
Özet
- Tatbikat, kurtarma planını denetimli bir arıza denemesiyle sınamaktır; kapsamı hangi birim, hangi arıza kipi ve ne kadar süre sorularıyla tanımlanır.
- Planda 6 tur yazan kurtarma tatbikatta 19 tur ölçüldü (3,17 kat); altı adımın dördünün süresi yanlış yazılmıştı ve en büyük sapma planda hiç olmayan önbellek ısınmasından geldi.
- Hedef plandan sınanamaz: 30 saniyelik kurtarma süresi hedefi plana göre geçiyor, tatbikatta ölçülen 38 saniyeye göre kırılıyor.
- Tatbikatın bedeli sıklığa bağlıdır: ayda bir tatbikat 0,63 dakika (planlı payın yüzde 4,22’si), haftada bir 2,53 dakika (yüzde 16,89); tepe yükte her tatbikat 19.527,82 uç isteği düşürür.
- Doğrulama adımı ikinci bir hasarı ortaya çıkardı: 19 turluk pencerede 28 iş akışı yarıda kaldı; en az bir kez teslimde hepsi tamamlandı ama 40 yan etki ikinci kez yürüdü, en çok bir kez teslimde yineleme olmadı ama 16 iş yarım kaldı.
- Kurtarma penceresini kısaltmak yalnız kesinti bütçesini korumaz; yarıda kalan iş sayısını da küçülterek doğruluk hasarını azaltır.
Sonraki Adım
Tatbikat kurtarma düzenini doğruladı ve aynı zamanda onun sınırını gösterdi. Devralma tamamlandı, hedefler ölçüldü, yerleşim sınandı — ama son tablo bu konunun hiçbir kalıbıyla çözülemeyen bir şey bıraktı. Aynı iş iki kez çalıştı: 40 yan etkili adım yeniden yürüdü, çünkü yeni etkin kopya işin nerede kaldığını bilmiyordu ve baştan başlattı. Aynı sorun yalnız devralmada değil, önceki konudaki yeniden denemede de doğar; her yeniden gönderilen istek daha önce işlenmiş olabilir. Öteki uçta yarım kalan iş akışları geri alınmadı: 16 iş bir yan etki bırakıp durdu ve onları toplayacak bir adım tasarlanmadı. Sonraki konu bu iki soruyu ele alır: bir isteğin ikinci kez işlenmesinin zararsız kılınması ve geri alınamayan adımların dengelenmesi.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.