Ders 10 / 21
Sır Saklama Servisleri
Sır döndürmenin ölçüsü penceredir: eski ile yeni değerin birlikte geçerli olduğu süre taranır. Kısa pencere 44 istemciyi kaçırıyor, sıfır kaçıran pencere 3.624 dakika ve yılda 601.584 dakika eski sır bırakıyor. Yalnız başlangıçta okuyan 18 istemciyi düzeltmek pencereyi 227 dakikaya indiriyor; 41 sırrın 17'si hiç döndürülmemiş.
İçindekiler
Beklemede ve aktarımda şifreleme kurulduğunda ikisi de aynı şeye dayanıyordu: bir anahtar ya da kimlik bilgisi bir yerde duruyor ve servisler onu okuyor. O yer bir sır saklama servisidir ve kiralanan her katman gibi bir karar devreder. Bu dersin ölçtüğü karar tek bir sayıda toplanır: döndürme penceresi. Sır döndürüldüğünde eski değer bir anda geçersiz olmaz; bir süre eski ve yeni değer birlikte kabul edilir, istemciler bu sürede yeni değeri alır. Pencere kapandığında eski değer reddedilir ve o ana kadar yeni değeri okumamış her istemci kırılır.
Pencere iki yönde birden ölçülür ve iki yön ters işaretlidir. Kısa pencere kaçırılan istemci üretir; uzun pencere eski sırrın geçerli kaldığı süreyi uzatır — sızmış bir değer o süre boyunca çalışmaya devam eder. Sırların hangi yollardan sızdığı — kayıt satırları, ortam değişkenleri, yapı çıktısı katmanları — daha önce tarandı ve burada tekrarlanmaz; buranın konusu döndürmenin kendisidir.
Ölçüm bölgesel ölçüm ağı üzerindedir, kurgudur ve node ile yazılmış bir modeldir.
Modelde gerçek sır değeri yoktur: yalnız sır adları, istemci sayıları ve zamanlar taşınır.
BG13. Sır saklama servisinde 41 sır vardır: üç ortam, beş servis, beş sır türü ve üç kuruluş çapında sır. BG14. Sırları okuyan 83 istemci örneği vardır. Okuma biçimi üç değerlidir: her istekte okur, önbellekli okur (önbellek ömrü 240 dakika), yalnız başlangıçta okur (dağıtım aralığı 4.320 dakika). BG15. Döndürme penceresi eski ve yeni sırrın birlikte geçerli olduğu süredir; pencere bitmeden yeni değeri almamış istemci kaçırılmış sayılır ve kırılır. BG16. Her istemci örneği dakikada 12 istek yapar (kurgu birim). BG17. Döndürme dönemi 90 gündür (kurgu politika). Sırların bir kısmı otomatik, bir kısmı elle döndürülür, bir kısmı hiç döndürülmemiştir. BG18. Rastgelelik kendi yazılan doğrusal üreteçten gelir; tohum 20260415’tir ve çıktıda görünür. Son 90 gündeki insan okumaları modelde sayılıdır.
Pencereyi Taramak
// sir.mjs — sir saklama servisi, istemci envanteri ve dondurme penceresi taramasi. MODELDIR. // Bolgesel olcum agi KURGUDUR. GERCEK SIR YOKTUR: yalniz sir ADLARI ve sayilar modellenir. // Rastgelelik kendi yazilmis dogrusal uretecten gelir; tohum asagida gorunur. export const TOHUM = 20260415; export const uretec = (t) => { let s = t >>> 0; return () => (s = (s * 1664525 + 1013904223) >>> 0) / 4294967296; }; const ORTAM = ["gelistirme", "hazirlik", "uretim"]; const KATALOG = [ ["toplayici", ["veritabani-parolasi", "alim-anahtari"]], ["dogrulayici", ["veritabani-parolasi", "imzalama-anahtari"]], ["faturalama", ["veritabani-parolasi", "dis-uc-jetonu", "imzalama-anahtari"]], ["isemri", ["veritabani-parolasi", "dis-uc-jetonu"]], ["arsivci", ["veritabani-parolasi", "bakim-kimligi"]], ]; export const SIR = [ ...ORTAM.flatMap((o) => KATALOG.flatMap(([s, tl]) => tl.map((t) => ({ ad: `${o}/${s}/${t}`, ortam: o, servis: s, tur: t })))), ...KATALOG.map(([s]) => ({ ad: `uretim/${s}/bakim-kimligi`, ortam: "uretim", servis: s, tur: "bakim-kimligi" })), ...["olcum-agi-bakim", "ikincil-bolge-kopya", "is-ortagi-besleme"].map((a) => ({ ad: `kurulus/${a}`, ortam: "kurulus", servis: "paylasilan", tur: "dis-uc-jetonu" })), ]; // Istemci ornekleri: her sirri okuyan surecler. Okuma bicimi alis zamanini belirler. const r = uretec(TOHUM); export const ISTEMCI = []; for (const s of SIR) { const n = 1 + Math.floor(r() * ({ uretim: 6, kurulus: 3, hazirlik: 2, gelistirme: 2 })[s.ortam]); for (let i = 0; i < n; i++) { const u = r(); ISTEMCI.push({ sir: s.ad, ortam: s.ortam, faz: r(), bicim: u < 0.45 ? "onbellek" : u < 0.75 ? "her-istek" : "baslangic" }); } } for (const s of SIR) { // dondurme gecmisi ve insan okumasi s.otomatik = r() < 0.55; s.yas = 40 + Math.floor(r() * 860); // sirrin olusturulmasindan bu yana, gun s.son = s.otomatik ? Math.floor(r() * 90) : (r() < 0.45 ? Math.floor(r() * 420) : null); s.insan = Math.floor(r() * 4); // son 90 gunde insan okumasi sayisi } export const ISTEK_DK = 12; // istemci basina dakikadaki istek (kurgu) export const PROFIL = { // istemci tarafinin alis davranisi "bugunku hal": { onbellek: 240, dagitim: 4320, degisen: [] }, "onbellek 60 dk": { onbellek: 60, dagitim: 4320, degisen: ["onbellek"] }, "baslangic okurlari": { onbellek: 240, dagitim: 60, degisen: ["baslangic"] }, "hepsi yeniden okur": { onbellek: 60, dagitim: 60, degisen: ["onbellek", "baslangic"] }, }; export const alis = (c, p) => c.bicim === "her-istek" ? 1 : Math.ceil(c.faz * (c.bicim === "onbellek" ? p.onbellek : p.dagitim)); export const kaciran = (p, W) => ISTEMCI.filter((c) => alis(c, p) > W); export const DONEM = 90, YIL = 365; // kurgu dondurme donemi, gun const B = [13, 20, 15, 18, 20]; export const yz = (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 bicimSay = (b) => ISTEMCI.filter((c) => c.bicim === b).length; console.log(`model (tohum ${TOHUM}): ${SIR.length} sir, ${ISTEMCI.length} istemci ornegi — ` + `${bicimSay("her-istek")} her istekte okur, ${bicimSay("onbellek")} onbellekli, ` + `${bicimSay("baslangic")} yalniz baslangicta okur`); const p = PROFIL["bugunku hal"]; console.log(`\nbugunku hal: onbellek omru ${p.onbellek} dk, dagitim araligi ${p.dagitim} dk; ` + `en gec alis ${Math.max(...ISTEMCI.map((c) => alis(c, p)))} dk`); console.log("\n" + yz(["pencere(dk)", "kacirilan istemci", "etkilenen sir", "kirilan istek/dk", "yillik acik (dk)"])); const yillik = Math.round((YIL / DONEM) * SIR.length); // yilda toplam dondurme sayisi for (const W of [0, 1, 30, 60, 120, 240, 720, 1440, 2880, 3624]) { const k = kaciran(p, W); console.log(yz([W, k.length, new Set(k.map((c) => c.sir)).size, k.length * ISTEK_DK, W * yillik])); } }
model (tohum 20260415): 41 sir, 83 istemci ornegi — 27 her istekte okur, 38 onbellekli, 18 yalniz baslangicta okur bugunku hal: onbellek omru 240 dk, dagitim araligi 4320 dk; en gec alis 3624 dk pencere(dk) kacirilan istemci etkilenen sir kirilan istek/dk yillik acik (dk) 0 83 40 996 0 1 56 34 672 166 30 53 32 636 4980 60 44 30 528 9960 120 38 29 456 19920 240 18 17 216 39840 720 14 14 168 119520 1440 10 10 120 239040 2880 3 3 36 478080 3624 0 0 0 601584
Tablonun iki ucu kararı çerçeveliyor. Üstte pencere sıfırdır: eski değer aynı anda reddedilir, 83 istemci örneğinin hepsi kaçırır ve dakikada 996 istek düşer. Altta pencere 3.624 dakikadır — altmış saat — ve hiçbir istemci kaçırmaz. İkisinin arası bir seçim değil, bir takas eğrisidir.
Ortadaki satırlar takasın şeklini gösteriyor. Bir saatlik pencere 44 istemciyi kaçırıyor: 30 sırrı etkiliyor ve dakikada 528 isteği kesiyor. Dört saat (240 dakika) kaçıranı 18’e düşürüyor, çünkü önbellek ömrü 240 dakikadır ve o sınırda bütün önbellekli istemciler değeri yenilemiş oluyor. Kalan 18, yalnız başlangıçta okuyan istemcilerdir ve onlar dört saatte değil, ancak bir sonraki dağıtımda okur. Bir günlük pencere bile 10’unu kaçırıyor.
Son sütun ters yöndeki bedeli sayıyor. 41 sır 90 günlük dönemle yılda 166 kez döndürülüyor; her döndürmede pencere boyunca eski değer geçerli kalıyor. Sıfır kaçıran pencerede yıllık toplam 601.584 dakika eder — 417 güne denk, yani yılın her anında ortalama 1,14 sır eski değeriyle de çalışıyor demektir. Sızmış bir sır, sızıntının fark edilmesinden bağımsız olarak o süre boyunca kabul edilir. Bir saatlik pencerede aynı toplam 9.960 dakikaya, altmışta bire iner.
İki sayı da kabul edilebilir değildir: 44 kırık istemci de, yılda 417 gün açık kalan eski sır da. Pencere tek başına ayarlanacak bir düğme değildir; istemci tarafı değişmeden hiçbir pencere değeri iyi değildir.
İstemci Tarafı ve Hiç Döndürülmeyen Sırlar
// dondurme.mjs — otomatik dondurmenin istemci tarafi, dondurulmemis sirlar ve okuma yuzeyi. import { SIR, ISTEMCI, PROFIL, alis, kaciran, ISTEK_DK, DONEM } from "./sir.mjs"; const gen = (B) => (h) => h.map((v, j) => j ? String(v).padStart(B[j]) : String(v).padEnd(B[0])) .join(""); const yp = gen([21, 10, 14, 18, 14, 16]); const ortanca = (l) => l.length ? [...l].sort((a, b) => a - b)[Math.floor(l.length / 2)] : 0; console.log(yp(["profil", "degisen", "pencere(dk)", "yillik acik (dk)", "60 dk kacan", "60 dk istek/dk"])); for (const [ad, p] of Object.entries(PROFIL)) { const enGec = Math.max(...ISTEMCI.map((c) => alis(c, p))); const degisen = ISTEMCI.filter((c) => p.degisen.includes(c.bicim)).length; const k60 = kaciran(p, 60).length; console.log(yp([ad, degisen, enGec, enGec * Math.round((365 / DONEM) * SIR.length), k60, k60 * ISTEK_DK])); } const hic = SIR.filter((s) => s.son === null); const oto = SIR.filter((s) => s.otomatik); const elle = SIR.filter((s) => s.son !== null && !s.otomatik); const ys = gen([24, 8, 14, 12, 20]); console.log("\n" + ys(["dondurme sinifi", "sir", "en gec (gun)", "ortanca", "doneme kalan/asan"])); const satir = (ad, l, alan) => { const v = l.map((s) => s[alan]); const enGec = Math.max(...v, 0); console.log(ys([ad, l.length, enGec, ortanca(v), enGec <= DONEM ? `${DONEM - enGec} gun kaldi` : `${enGec - DONEM} gun asildi`])); }; satir("otomatik dondurulen", oto, "son"); satir("elle dondurulen", elle, "son"); satir("hic dondurulmemis", hic, "yas"); for (const s of [...hic].sort((a, b) => b.yas - a.yas).slice(0, 4)) console.log(` ${s.ad.padEnd(38)} ${String(s.yas).padStart(4)} gun, ` + `${ISTEMCI.filter((c) => c.sir === s.ad).length} istemci, ` + `son 90 gunde ${s.insan} insan okumasi`); const insanli = SIR.filter((s) => s.insan > 0); const kesisim = insanli.filter((s) => s.son === null); console.log(`\nokuma yuzeyi: ${insanli.length}/${SIR.length} sir son 90 gunde bir insan tarafindan ` + `okundu (${SIR.reduce((a, s) => a + s.insan, 0)} okuma, hepsi denetim kaydinda)`); console.log(`bunlarin ${kesisim.length} tanesi hic dondurulmemis sirdir; ` + `bu ${kesisim.length} sirri ${ISTEMCI.filter((c) => kesisim.some((s) => s.ad === c.sir)).length} ` + `istemci ornegi okuyor`); const enGenis = SIR.map((s) => [s.ad, ISTEMCI.filter((c) => c.sir === s.ad).length]) .sort((a, b) => b[1] - a[1])[0]; console.log(`en genis sir: ${enGenis[0]} — ${enGenis[1]} istemci ornegi; ` + `dondurulunce bu ${enGenis[1]} ornegin hepsi yeni degeri almak zorunda`);
profil degisen pencere(dk) yillik acik (dk) 60 dk kacan 60 dk istek/dk bugunku hal 0 3624 601584 44 528 onbellek 60 dk 38 3624 601584 18 216 baslangic okurlari 18 227 37682 26 312 hepsi yeniden okur 56 57 9462 0 0 dondurme sinifi sir en gec (gun) ortanca doneme kalan/asan otomatik dondurulen 16 88 64 2 gun kaldi elle dondurulen 8 371 209 281 gun asildi hic dondurulmemis 17 826 442 736 gun asildi uretim/isemri/bakim-kimligi 826 gun, 5 istemci, son 90 gunde 1 insan okumasi hazirlik/arsivci/bakim-kimligi 789 gun, 1 istemci, son 90 gunde 1 insan okumasi kurulus/is-ortagi-besleme 760 gun, 1 istemci, son 90 gunde 0 insan okumasi uretim/dogrulayici/imzalama-anahtari 748 gun, 6 istemci, son 90 gunde 2 insan okumasi okuma yuzeyi: 34/41 sir son 90 gunde bir insan tarafindan okundu (68 okuma, hepsi denetim kaydinda) bunlarin 15 tanesi hic dondurulmemis sirdir; bu 15 sirri 34 istemci ornegi okuyor en genis sir: uretim/toplayici/veritabani-parolasi — 6 istemci ornegi; dondurulunce bu 6 ornegin hepsi yeni degeri almak zorunda
Profil tablosu bu dersin en ters sonucunu veriyor. Önbellek ömrünü 240 dakikadan 60’a çekmek 38 istemciye dokunur ve pencereyi hiç kısaltmaz: sıfır kaçıran pencere 3.624 dakikada kalır, yıllık açık süre 601.584 dakikada kalır. Kazandığı tek şey bir saatlik pencerede kaçıranın 44’ten 18’e inmesidir. Sebep açıktır: bağlayıcı kısıt önbellek değil, yalnız başlangıçta okuyan 18 istemcidir; onlar önbellek ömrünü hiç dinlemez.
Üçüncü satır bunu doğruluyor. Yalnız o 18 istemciyi yeniden okur hale getirmek — yarısından az dokunuşla — pencereyi 3.624 dakikadan 227 dakikaya, yıllık açık süreyi 601.584’ten 37.682 dakikaya indirir: on altıda bir. Dördüncü satır ikisini birleştirir: 56 istemci değişir, pencere 57 dakikaya iner, yıllık açık süre 9.462 dakika olur ve bir saatlik pencerede kaçıran sıfırdır. Otomatik döndürmenin istemci tarafında gerektirdiği şey budur — sırrı yeniden okuma yeteneği birinci, önbellek ömrü ikincidir. Yeniden okuma yoksa döndürme her seferinde bir dağıtım bekler.
Değişikliğin kendisi de bir kalemdir ve tabloda ilk sütunda duruyor. Yeniden okuma yeteneği eklemek 18 istemcide kod değişikliği ister; önbellek ömrünü kısaltmak 38 istemcide yapılandırma değişikliği. İkisi birden 56 örnek eder ve o 56 örneğin her biri ayrı bir dağıtım kalemidir. Sıralama bu yüzden önemlidir: 18 istemcilik iş, 38 istemcilik işten on altı kat fazla kazandırıyor ve tek başına yapıldığında pencereyi dört saatin altına indiriyor. Hiçbir şey yapılmazsa döndürme dönemi işlemez — 17 sırrın hiç döndürülmemiş olmasının teknik karşılığı da budur.
Alt tablo aynı sorunun envanter yüzüdür. 41 sırrın 16’sı otomatik döndürülüyor ve en gecikmişine 90 günlük döneme 2 gün kalmış. 8 sır elle döndürülüyor ve en gecikmişi dönemi 281 gün aşmış. Geriye kalan 17 sır hiç döndürülmemiş — envanterin yüzde kırkı — ve en yaşlısı 826 günlük. Bunu ölçmek için ayrı bir tarama gerekmedi: son döndürme alanı boş olan kayıtlar sayıldı.
Son üç satır sırayı belirliyor. 41 sırrın 34’ü son 90 günde en az bir kez bir insan tarafından okundu — toplam 68 okuma ve hepsi denetim kaydında duruyor. Bu 34 sırrın 15’i hiç döndürülmemiş sırlardır ve o 15 sırrı 34 istemci örneği okuyor. Kesişim döndürme sırasını verir: insan eli değmiş ve hiç döndürülmemiş sır, envanterin geri kalanından önce gelir. En geniş sır üretim toplayıcısının veritabanı parolasıdır; 6 istemci örneği okuyor ve döndürüldüğünde altısının da yeni değeri alması gerekir — pencere kararı tam olarak bu altı örnek için verilir.
Özet
- Döndürme penceresi iki yönde ölçüldü: sıfır pencerede 83 istemcinin hepsi kaçırıyor, 3.624 dakikalık pencerede hiçbiri kaçırmıyor; bir saatlik pencerede 44 istemci ve dakikada 528 istek.
- Uzun pencerenin bedeli sayıldı: 41 sır yılda 166 kez döndürülüyor ve 3.624 dakikalık pencere yılda 601.584 dakika eski sır bırakıyor; bir saatlik pencerede aynı toplam 9.960 dakikadır.
- Önbellek ömrünü dörtte bire indirmek 38 istemciye dokunuyor ve sıfır kaçıran pencereyi hiç kısaltmıyor; bağlayıcı kısıt yalnız başlangıçta okuyan 18 istemcidir.
- O 18 istemciyi yeniden okur hale getirmek pencereyi 227 dakikaya, ikisi birden 57 dakikaya indiriyor; ikinci durumda bir saatlik pencerede kaçıran sıfırdır.
- 41 sırrın 16’sı otomatik döndürülüyor (döneme 2 gün kaldı), 8’i elle (281 gün aşıldı) ve 17’si hiç döndürülmemiş; en yaşlısı 826 günlük.
- Son 90 günde 34 sır bir insan tarafından okundu (68 okuma, hepsi kayıtta) ve bunların 15’i hiç döndürülmemiş sırlardır; döndürme sırası bu kesişimden çıkar.
Sonraki Adım
Şifreleme kuruldu, sırlar döndürülebilir hale geldi ve her ölçümde aynı cümle geçti: “hepsi denetim kaydında”. O cümle şimdiye kadar sınanmadı. Bir sonraki ders kaydın kendisini ölçer: bir olay kümesi denetim günlüğüne düşürülür ve kaç soru yanıtlanabiliyor sayılır — kim, ne zaman, hangi kaynak, hangi kimlikten. Kaydın kapsamadığı işlem türü adıyla yazılır, kaydı kimin silebildiği sayılır ve saklama süresiyle maliyet birlikte taranır.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.