İçeriğe geç
academia.sh

Ders 07 / 12

Denetim Günlükleri

Yayılma yürüyüşünün kayıtta görünen kısmının sayılması: 28 kalemlik grafikte sızan tek kimlikten 23 kaleme ulaşan 22 adımın 11'i kiracının eline geçiyor, ilk kayıt 9. dakikada düşüyor ve o ana kadar 8 kaleme ulaşılmış oluyor. Veri okuma kaydı görünen adımı 19'a çıkarıyor ama yarıçap 23'te kalıyor; aynı üç meşru iş bedeliyle otomatik oturum iptali yarıçapı 22'ye, rol zincirini kapatmak 18'e indiriyor.

İçindekiler

Önceki konu altı ders boyunca yanlış kalemleri saydı ve her birinin yarıçapını ölçtü. Hepsinin ortak bir yanı vardı: yanlış kalem yapılandırmaya bakarak bulundu — bir izin fazla yazılmıştı, bir uç genel erişime açıktı, bir şablon yanlış varsayılanı taşıyordu. Yapılandırma doğruyken sızan bir kimlik bilgisi bu yolla görünmez, çünkü o kimliğin kendi yetkisiyle yaptığı her çağrı yapılandırmaya uygundur. Onu ancak bir kayıt gösterebilir.

Bu dersin sorusu, kaydın yürüyüşün ne kadarını gösterdiğidir. Ölçü yine yayılma yarıçapıdır; üzerine ikinci bir sayı konur: yürüyüşün kaç adımı kiracının okuyabildiği bir kayda düşüyor, kaçı hiçbir yerde görünmüyor. Yönetim düzlemi ile veri düzlemi çağrılarının ayrı kaydedildiği, kaydın kendisinin de bir yüzey olduğu ve saklama süresinin bir bedel taşıdığı Bulut Yönetişimi, Güvenlik ve Maliyet kursunda ölçüldü; burada tekrarlanmaz, girdi olarak alınır. Burada sayılan tek şey yürüyüşün görünen kısmıdır.

Ölçüm bölgesel ölçüm ağı üzerindedir ve kurgudur: kiralanmış altyapıda koşan abone portalı, sayaç toplama ve fatura işleri. Grafik node ile yazılmış bir modeldir; gerçek sağlayıcı, hizmet, bölge ya da hesap yoktur.

BT1. Grafikte 28 kalem ve 23 kenar vardır; sızan tek kalem portalın hizmet hesabıdır. BT2. Her kenar bir adım türü ve o adımın sürdüğü dakikayı taşır; yürüyüş en erken varış sırasına göre koşar. BT3. Adımın kaydı dört sınıftan birine düşer: kiracının okuyabildiği yönetim düzlemi denetim günlüğü, iş yükünün kendi kaydı, yalnız sağlayıcıda duran kayıt, hiçbir yerde olmayan kayıt. BT4. İş yükünün kendi kaydı ancak o kalemde bir kayıt ajanı kuruluysa kiracıya ulaşır; 28 kalemin beşinde ajan vardır. BT5. Kaydın kiracıya teslim gecikmesi yönetim düzleminde 5, iş yükü kaydında 20 dakikadır (kurgu). BT6. Sekiz meşru iş modelde adıyla yazılıdır; üçü zincirli rol üstlenmeye bağlıdır.

Yürüyüşün Adımları ve Kaydın Sahibi

// yuruyus.mjs — sizan tek kimlikten yayilma yuruyusu ve her adimin kayit sinifi. MODELDIR.
// Bolgesel olcum agi KURGUDUR; gercek saglayici, hizmet, hesap ya da uc nokta yoktur.

// Adim turu -> [kaydin dustugu yer, teslim gecikmesi (dk)]. "kiraci-uygulama" sinifi
// yalnizca hedef kalemde kayit ajani varsa gercekten kiracinin eline gecer.
export const ADIM = {
  "rol-ustlenme": ["kiraci-yonetim", 5],
  "kaynak-listeleme": ["kiraci-yonetim", 5],
  "sir-okuma": ["kiraci-yonetim", 5],
  "anahtar-cozme": ["kiraci-yonetim", 5],
  "veritabani-sorgusu": ["kiraci-uygulama", 20],
  "ornek-ici-calisma": ["kiraci-uygulama", 20],
  "nesne-okuma": ["saglayici-ici", 0],
  "kuyruk-tuketimi": ["saglayici-ici", 0],
  "ornek-kimligi-alma": ["kayitsiz", 0],
  "ag-baglantisi": ["kayitsiz", 0],
};

const bol = (s) => s.trim().split("\n").map((l) => l.trim().split("|"));

// Kalem: ad|kayit ajani var mi. 28 kalem; bes kalemde kayit ajani kuruludur.
export const KALEM = Object.fromEntries(bol(`
  portal-hizmet-hesabi|0   portal-ornegi|1        portal-ornek-kimligi|0
  abone-veritabani|1       sir-deposu|0           toplama-is-yuku-kimligi|0
  sayac-ham-kova|0         olcum-kuyrugu|0        fatura-toplu-is-rolu|0
  fatura-arsiv-kovasi|0    anahtar-yonetimi|0     musteri-anahtari|0
  yedekleme-rolu|0         yedek-kovasi|0         dagitim-rolu|0
  sablon-deposu|0          yapilandirma-kovasi|0  is-yuku-ornegi|0
  okuma-rolu|0             rapor-kovasi|0         gunluk-kovasi|0
  izleme-rolu|0            olcum-panosu|1         yonetim-rolu|1
  denetim-kovasi|0         odeme-ag-gecidi|1      saha-cihaz-kaydi|0
  sertifika-deposu|0`.replace(/\s+/g, "\n")).map(([a, j]) => [a, +j]));

// Kenar: kaynak|hedef|adim turu|adimin surdugu dakika. MODEL girdisi.
export const KENAR = bol(`
  portal-hizmet-hesabi|portal-ornegi|ag-baglantisi|3
  portal-hizmet-hesabi|okuma-rolu|rol-ustlenme|4
  portal-ornegi|portal-ornek-kimligi|ornek-kimligi-alma|2
  portal-ornek-kimligi|abone-veritabani|veritabani-sorgusu|6
  portal-ornek-kimligi|sir-deposu|sir-okuma|4
  sir-deposu|toplama-is-yuku-kimligi|sir-okuma|3
  toplama-is-yuku-kimligi|sayac-ham-kova|nesne-okuma|5
  toplama-is-yuku-kimligi|olcum-kuyrugu|kuyruk-tuketimi|4
  toplama-is-yuku-kimligi|izleme-rolu|rol-ustlenme|4
  izleme-rolu|olcum-panosu|kaynak-listeleme|3
  portal-ornek-kimligi|fatura-toplu-is-rolu|rol-ustlenme|3
  fatura-toplu-is-rolu|fatura-arsiv-kovasi|nesne-okuma|6
  fatura-toplu-is-rolu|anahtar-yonetimi|anahtar-cozme|4
  anahtar-yonetimi|musteri-anahtari|anahtar-cozme|2
  fatura-toplu-is-rolu|yedekleme-rolu|rol-ustlenme|3
  yedekleme-rolu|yedek-kovasi|nesne-okuma|7
  yedekleme-rolu|dagitim-rolu|rol-ustlenme|4
  dagitim-rolu|sablon-deposu|nesne-okuma|5
  dagitim-rolu|yapilandirma-kovasi|nesne-okuma|4
  dagitim-rolu|is-yuku-ornegi|ornek-ici-calisma|9
  okuma-rolu|rapor-kovasi|nesne-okuma|4
  okuma-rolu|gunluk-kovasi|nesne-okuma|5
  okuma-rolu|yapilandirma-kovasi|nesne-okuma|6`)
  .map(([k, h, t, d]) => ({ k, h, t, d: +d }));

export const BASLANGIC = "portal-hizmet-hesabi";

// En erken varis yuruyusu: her adim, kaynagina ulasildiktan sonra kendi suresince surer.
export function yuru(engel = () => false) {
  const varis = { [BASLANGIC]: 0 }, gelis = {}, adimlar = [];
  for (;;) {
    let en = null;
    for (const e of KENAR) {
      if (!(e.k in varis) || e.h in varis || engel(e, gelis)) continue;
      const t = varis[e.k] + e.d;
      if (en === null || t < en.t) en = { e, t };
    }
    if (en === null) return { varis, adimlar };
    varis[en.e.h] = en.t; gelis[en.e.h] = en.e.t;
    adimlar.push({ ...en.e, bitis: en.t });
  }
}

// Bir adimin kaydi kiracinin eline geciyor mu, geciyorsa ne zaman.
export function gorunur(a) {
  const [sinif, gecikme] = ADIM[a.t];
  if (sinif === "kiraci-yonetim") return { sinif, an: a.bitis + gecikme };
  if (sinif === "kiraci-uygulama")
    return KALEM[a.h] ? { sinif, an: a.bitis + gecikme } : { sinif: "ajansiz", an: null };
  return { sinif, an: null };
}

const gen = (B) => (h) => h.map((v, j) => j ? String(v).padStart(B[j]) : String(v).padEnd(B[0]))
  .join("");

if (import.meta.url === `file://${process.argv[1]}`) {
  const { varis, adimlar } = yuru();
  const toplam = Object.keys(KALEM).length;
  console.log(`model: ${toplam} kalem, ${KENAR.length} kenar; sizan kalem ${BASLANGIC}`);
  console.log(`yuruyus ${adimlar.length} adim, ulasilan ${Object.keys(varis).length}/${toplam} ` +
    `kalem, ulasilamayan ${toplam - Object.keys(varis).length}; son adim ${adimlar.at(-1).bitis}. dk`);

  const say = {};
  for (const a of adimlar) { const s = gorunur(a).sinif; say[s] = (say[s] || 0) + 1; }
  const yz = gen([18, 8, 12, 24]);
  console.log("\n" + yz(["kayit sinifi", "adim", "gecikme", "kayit nerede duruyor"]));
  for (const [s, ad, g] of [["kiraci-yonetim", "yonetim duzlemi kaydi", "5 dk"],
    ["kiraci-uygulama", "is yukunun kendi kaydi", "20 dk"], ["ajansiz", "ajan kurulu degil", "-"],
    ["saglayici-ici", "yalniz saglayicida", "-"], ["kayitsiz", "hicbir yerde yok", "-"]])
    console.log(yz([s, say[s] || 0, g, ad]));

  const gor = adimlar.filter((a) => gorunur(a).an !== null);
  const ilk = gor.reduce((m, a) => Math.min(m, gorunur(a).an), Infinity);
  const ilkAdim = adimlar.findIndex((a) => gorunur(a).an === ilk) + 1;
  const oncekiKalem = adimlar.filter((a) => a.bitis <= ilk).length + 1;
  console.log(`\ngorunen adim ${gor.length}/${adimlar.length}, hic gorunmeyen ` +
    `${adimlar.length - gor.length}`);
  console.log(`ilk gorunur kayit ${ilk}. dakikada dusuyor (yuruyusun ${ilkAdim}. adimi); ` +
    `o ana kadar ${oncekiKalem} kaleme ulasilmis`);

  // Kayittan yeniden kurulan yaricap: yalniz gorunen adimlarin dokundugu kalemler.
  const kurulan = new Set([BASLANGIC]);
  for (const a of gor) { kurulan.add(a.k); kurulan.add(a.h); }
  console.log(`kayda bakan cozumleyicinin cikarsadigi kalem ${kurulan.size}, ` +
    `gercek yaricap ${Object.keys(varis).length}; gorulmeyen kalem ` +
    `${Object.keys(varis).length - kurulan.size}`);
  const zincir = adimlar.filter((a) => a.t === "rol-ustlenme").length;
  console.log(`rol zinciri adimi ${zincir} (hepsi kayitli); veri okuyan adim ` +
    `${adimlar.filter((a) => ADIM[a.t][0] === "saglayici-ici").length} (hicbiri kayitli degil)`);
}
model: 28 kalem, 23 kenar; sizan kalem portal-hizmet-hesabi
yuruyus 22 adim, ulasilan 23/28 kalem, ulasilamayan 5; son adim 24. dk

kayit sinifi          adim     gecikme    kayit nerede duruyor
kiraci-yonetim          10        5 dk   yonetim duzlemi kaydi
kiraci-uygulama          1       20 dk  is yukunun kendi kaydi
ajansiz                  1           -       ajan kurulu degil
saglayici-ici            8           -      yalniz saglayicida
kayitsiz                 2           -        hicbir yerde yok

gorunen adim 11/22, hic gorunmeyen 11
ilk gorunur kayit 9. dakikada dusuyor (yuruyusun 2. adimi); o ana kadar 8 kaleme ulasilmis
kayda bakan cozumleyicinin cikarsadigi kalem 13, gercek yaricap 23; gorulmeyen kalem 10
rol zinciri adimi 5 (hepsi kayitli); veri okuyan adim 8 (hicbiri kayitli degil)

Yürüyüş 22 adımda 23 kaleme ulaşıyor ve 24 dakika sürüyor. Adımların yarısı kiracının eline geçen bir kayda düşüyor, yarısı hiç düşmüyor. Bölünme rastgele değildir: kaydı düşen adımlar kimlik hareketleridir, düşmeyenler veri hareketleridir. Beş rol üstlenme adımının beşi de kayıtlıdır. Sekiz veri okuma adımının hiçbiri değildir; onlar yalnız sağlayıcının kendi kaydında durur ve kiracıya verilmez. İki adım hiçbir yerde yoktur — örneğe bağlı kimliğin alınması ve ağ bağlantısı.

Bir adım ara sınıftadır: dağıtım rolüyle başlatılan iş yükü örneğinde kayıt ajanı kurulu değildir, çünkü ajan görüntüye sonradan eklenmektedir. Kaydın kapsamı bir yapılandırma değil, bir kurulum sırasıdır.

Kör Önek

Sayıların en keskini son iki satırdadır. İlk kayıt 9. dakikada kiracının eline geçiyor; o ana kadar yürüyüş 8 kaleme ulaşmış oluyor. Yürüyüşün ilk adımı kayıtsız sınıftadır — ağ bağlantısı hiçbir yere yazılmaz — ve kayıt ancak ikinci adımda, sızan kimliğin okuma rolünü üstlenmesiyle başlar. O adım 4. dakikada biter, kaydı 5 dakikalık teslim gecikmesiyle gelir. Yayılmanın kör öneki budur: kaydın hiçbir şey söylemediği dokuz dakikada yarıçapın üçte biri kurulmuş olur. Kör önek yalnızca baştaki bir aralık da değildir: kayıtlı her adım kendi gecikmesiyle geldiği için, o gecikme boyunca adım yokmuş gibi görünür.

İkincisi kaydın sonradan ne kadarını anlattığıdır. Yalnız görünen 11 adıma bakan bir çözümleyici 13 kalem çıkarsıyor; gerçek yarıçap 23’tür. On kalem, kayıtta hiçbir izi olmadığı için soruşturmanın dışında kalır: okunan dört kova, tüketilen kuyruk, çözülen müşteri anahtarına giden veri okumaları ve dağıtılan örnek. Kayıt yalnızca eksik değildir; yanlış bir yarıçap raporlar ve o rapor gerçek sayının yarısından biraz fazlasıdır.

Görünürlük mü, Daraltma mı

// kesme.mjs — kaydin gorunurlugu ile yaricapin dusmesi ayri ayri olculur. MODELDIR.
import { ADIM, KALEM, KENAR, BASLANGIC, gorunur } from "./yuruyus.mjs";

const VERI_GECIKME = 10;   // veri okuma kaydi acilirsa kiraciya bu gecikmeyle gelir (kurgu)

// Mesru is: ad|kullandigi kimlikler|zincirli rol ustlenme gerektiriyor mu (gunluk kosum, kurgu)
const MESRU = `
  gecelik-fatura-uretimi|portal-ornek-kimligi fatura-toplu-is-rolu yedekleme-rolu|1
  arsiv-yedegi|yedekleme-rolu|1
  sablon-dagitimi|dagitim-rolu|1
  sayac-toplama|toplama-is-yuku-kimligi|0
  abone-portali-oturumu|portal-hizmet-hesabi portal-ornek-kimligi|0
  aylik-rapor|okuma-rolu|0
  pano-yenileme|izleme-rolu|0
  anahtar-dondurme|anahtar-yonetimi|0`.trim().split("\n")
  .map((l) => l.trim().split("|")).map(([ad, k, z]) => ({ ad, kimlik: k.split(" "), zincir: +z }));

// Bir adimin kaydi kiracinin eline kacinci dakikada geciyor (veri kaydi acikken de bakilir).
const an = (a, veriKaydi) => gorunur(a).an ??
  (veriKaydi && ADIM[a.t][0] === "saglayici-ici" ? a.bitis + VERI_GECIKME : null);

// Yuruyus: zincir kapaliysa zincirli rol ustlenme engellenir; kesme aninda iptal edilen
// kimliklerden sonraki adimlar durur.
function yuru({ zincir = false, kesme = Infinity, iptalli = new Set() } = {}) {
  const varis = { [BASLANGIC]: 0 }, gelis = {}, adimlar = [];
  for (;;) {
    let en = null;
    for (const e of KENAR) {
      if (!(e.k in varis) || e.h in varis) continue;
      if (zincir && e.t === "rol-ustlenme" && gelis[e.k] === "rol-ustlenme") continue;
      const t = varis[e.k] + e.d;
      if (t > kesme && iptalli.has(e.k)) continue;
      if (en === null || t < en.t) en = { e, t };
    }
    if (en === null) return { varis, adimlar };
    varis[en.e.h] = en.t; gelis[en.e.h] = en.e.t;
    adimlar.push({ ...en.e, bitis: en.t });
  }
}

function senaryo({ veriKaydi = false, iptal = null, zincir = false, kayit = true }) {
  const serbest = yuru({ zincir });
  const gor = serbest.adimlar.filter((a) => an(a, veriKaydi) !== null);
  const ilk = kayit && gor.length ? Math.min(...gor.map((a) => an(a, veriKaydi))) : null;
  if (iptal === null || ilk === null)
    return { ilk, kesme: null, gorunen: kayit ? gor.length : 0, adim: serbest.adimlar.length,
      yaricap: Object.keys(serbest.varis).length, durdurulan: zincirBedeli(zincir) };
  // Iptal ancak kayitta gorulmus kimlikleri kapsar: cozumleyici gormedigini iptal edemez.
  const kesme = ilk + iptal, iptalli = new Set();
  for (const a of gor) if (an(a, veriKaydi) <= kesme) { iptalli.add(a.k); iptalli.add(a.h); }
  const k = yuru({ zincir, kesme, iptalli });
  const duran = MESRU.filter((m) => (zincir && m.zincir) || m.kimlik.some((x) => iptalli.has(x)));
  return { ilk, kesme, gorunen: gor.length, adim: k.adimlar.length,
    yaricap: Object.keys(k.varis).length, durdurulan: duran.length, iptalli: iptalli.size };
}
const zincirBedeli = (z) => z ? MESRU.filter((m) => m.zincir).length : 0;

const SENARYO = [
  ["kayit yok", { kayit: false }],
  ["yonetim duzlemi kaydi", {}],
  ["+ veri okuma kaydi", { veriKaydi: true }],
  ["+ otomatik oturum iptali", { iptal: 4 }],
  ["rol zinciri kapali", { zincir: true }],
  ["zincir kapali + iptal", { zincir: true, iptal: 4 }],
];

const gen = (B) => (h) => h.map((v, j) => j ? String(v).padStart(B[j]) : String(v).padEnd(B[0]))
  .join("");
const yz = gen([26, 9, 11, 11, 10, 16]);
const toplam = Object.keys(KALEM).length;

console.log(yz(["denetim", "gorunen", "ilk kayit", "kesme ani", "yaricap", "duran mesru is"]));
for (const [ad, s] of SENARYO) {
  const r = senaryo(s);
  console.log(yz([ad, `${r.gorunen}/${r.adim}`, r.ilk === null ? "-" : `${r.ilk}. dk`,
    r.kesme === null ? "-" : `${r.kesme}. dk`, `${r.yaricap}/${toplam}`, r.durdurulan]));
}

const taban = senaryo({ kayit: false }), veri = senaryo({ veriKaydi: true });
const ipt = senaryo({ iptal: 4 }), z = senaryo({ zincir: true });
const ikisi = senaryo({ zincir: true, iptal: 4 });
console.log(`\nkayit acmak gorunen adimi ${senaryo({}).gorunen}, veri kaydi da acmak ` +
  `${veri.gorunen} yapiyor; yaricap her ucunde de ${taban.yaricap}`);
console.log(`otomatik iptal ${ipt.iptalli} kalemi kapsiyor (yalniz kayitta gorulenler) ve ` +
  `yaricapi ${taban.yaricap} -> ${ipt.yaricap} indiriyor; bedeli ${ipt.durdurulan}/${MESRU.length} ` +
  `mesru is`);
console.log(`rol zincirini kapatmak kaydi hic beklemeden yaricapi ${z.yaricap} yapiyor; ` +
  `bedeli ${z.durdurulan}/${MESRU.length} mesru is`);
console.log(`ikisi birden ${ikisi.yaricap}/${toplam}; kalan ${ikisi.yaricap - 1} kaleme ` +
  `${ikisi.kesme}. dakikadan once ulasilmis`);
denetim                     gorunen  ilk kayit  kesme ani   yaricap  duran mesru is
kayit yok                      0/22          -          -     23/28               0
yonetim duzlemi kaydi         11/22      9. dk          -     23/28               0
+ veri okuma kaydi            19/22      9. dk          -     23/28               0
+ otomatik oturum iptali      11/21      9. dk     13. dk     22/28               3
rol zinciri kapali             9/17      9. dk          -     18/28               3
zincir kapali + iptal          9/16      9. dk     13. dk     17/28               5

kayit acmak gorunen adimi 11, veri kaydi da acmak 19 yapiyor; yaricap her ucunde de 23
otomatik iptal 4 kalemi kapsiyor (yalniz kayitta gorulenler) ve yaricapi 23 -> 22 indiriyor; bedeli 3/8 mesru is
rol zincirini kapatmak kaydi hic beklemeden yaricapi 18 yapiyor; bedeli 3/8 mesru is
ikisi birden 17/28; kalan 16 kaleme 13. dakikadan once ulasilmis

İlk üç satır aynı yarıçapı veriyor: 23. Yönetim düzlemi kaydını açmak görünen adımı sıfırdan 11’e, veri okuma kaydını da açmak 19’a çıkarıyor; ulaşılan kalem sayısı hiç değişmiyor. Bu, kursun kuralının en yalın biçimidir — kayıt bir kapı değildir, bir penceredir. Görünürlük üç katına çıkarken yarıçap sabit kalır, çünkü kayıt hiçbir adımı reddetmez.

Dördüncü satır kaydı bir karara bağlıyor: ilk kayıt düştükten 4 dakika sonra, kayıtta görülmüş kimliklerin oturumları otomatik iptal ediliyor. Yarıçap 23’ten 22’ye iniyor. Tek kalem. Nedeni iki sınırın üst üste binmesidir. Kesme 13. dakikada gerçekleşiyor ve yürüyüşün 24 dakikasının 13’ü o ana kadar geçmiş oluyor; üstelik iptal yalnız kayıtta görülmüş dört kalemi kapsıyor, çünkü çözümleyici görmediği bir kimliği iptal edemez. Kaydın kör noktaları burada ikinci kez ödenir: görülmeyen kimlik iptal edilmez, iptal edilmeyen kimlik yürümeye devam eder. Bedel yine de sıfır değildir — sekiz meşru işin üçü duruyor.

Beşinci satır kaydı hiç kullanmıyor. Zincirli rol üstlenme kapatıldığında — yani bir rol üstlenilerek gelinmişse oradan ikinci bir rol üstlenilemiyorsa — yarıçap 23’ten 18’e iniyor ve bunun için hiçbir uyarı beklenmiyor. Bedeli yine üç meşru iştir: gecelik fatura üretimi, arşiv yedeği ve şablon dağıtımı zinciri kullanır ve yeniden yazılmaları gerekir. İki satırın karşılaştırması dersin sonucudur: aynı bedelle — üç meşru iş — kayda bağlı iptal bir kalem, yapıya bağlı daraltma beş kalem indiriyor. Son satır ikisini birleştiriyor ve 17’ye iniyor: iptalin zincir kapalıyken kazandırdığı tek kalem, duran işi üçten beşe çıkarmakla ödeniyor.

Özet

  • 28 kalemlik grafikte sızan tek kimlikten 22 adımda 23 kaleme ulaşılıyor; adımların 11’i kiracının okuyabildiği bir kayda düşüyor, 11’i hiç düşmüyor.
  • Bölünme kimlik ile veri arasındadır: beş rol üstlenme adımının beşi kayıtlı, sekiz veri okuma adımının hiçbiri değil; iki adım hiçbir yerde yok ve bir adım ajan kurulu olmayan bir örnekte geçiyor.
  • İlk kayıt 9. dakikada düşüyor ve o ana kadar 8 kaleme ulaşılmış oluyor; kaydın hiçbir şey söylemediği bu kör önek yarıçapın üçte birini kapsıyor.
  • Yalnız kayda bakan bir çözümleyici 13 kalem çıkarsıyor, gerçek yarıçap 23’tür; on kalem hiçbir izi olmadığı için soruşturmanın dışında kalır.
  • Kayıt açmak görünen adımı 11’e, veri okuma kaydı 19’a çıkarıyor; yarıçap üç durumda da 23’te kalıyor — kayıt hiçbir adımı reddetmez.
  • Aynı bedelle, üç meşru işle, otomatik oturum iptali yarıçapı 22’ye, rol zincirini kapatmak 18’e indiriyor; iptal yalnız kayıtta görülmüş dört kalemi kapsadığı için geride kalanı durduramıyor.

Sonraki Adım

Rol zincirini kapatmanın kayıttan bağımsız çalışması bir yön gösteriyor: yarıçapı düşüren şey, yürüyüş başladıktan sonra bakan bir düzenek değil, yürüyüş başlamadan önce kapatılmış bir kalemdir. Sonraki ders bu yönü ölçer — sürekli çalışan bir yapılandırma duruş yönetimi düzeneği, yürüyüşün kaç adımını dağıtımdan önce kapatıyor, kaçını ancak koştuktan sonra buluyor ve tespit ile düzeltme arasındaki gecikme yarıçapı kaç dakika açık bırakıyor.

İ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