Ders 05 / 21
İş Yükü Kimlikleri
Uygulamaya kimlik vermenin üç yolu yan yana ölçülür: dosyada duran uzun ömürlü anahtar, ortam değişkenindeki sır ve çalışma ortamının verdiği kimlik. Sızıntı yüzeyi, döndürme işi ve kimliğin kapsamı sayılır; kenar ile işlev katmanında kimliğin nasıl verildiği ayrı çıkarılır.
İçindekiler
Önceki ders insan kimliklerini geçici hâle getirdi: yetki üstlenilerek alınıyor, iş bitince düşüyor. Kod için aynı şey söylenemez. Ölçüm ağının iş yükü örnekleri gece boyunca veri deposuna yazıyor ve bunu yaparken bir yerde duran bir anahtarı okuyor. O anahtar kurulum günü yazıldı; ne zaman değişeceği hiçbir yerde yazmıyor. Sırrın ömrü ve sızıntı penceresi M22/K07’de ölçüldü, burada tekrarlanmıyor. Bu dersin sorusu ömür değil, yer ve kapsam: kimlik kaç ayrı yerde duruyor, değiştirmek kaç yere dokunmayı gerektiriyor ve bir işlem ele geçirildiğinde o kimlikle kaç iş daha açılıyor. Üç yol yan yana konuyor — dosyada duran uzun ömürlü anahtar, ortam değişkenine konmuş sır ve çalışma ortamının verdiği kimlik.
- BI25. On iş yükü, üç konak, üç ortam ve on iki kenar noktası kurgusal bölgesel ölçüm ağına
aittir. Gerçek anahtar, sır ya da kimlik bilgisi yazılmadı; adlar uydurmadır. Ölçülen şey
nodeile yazılan modeldir. - BI26. Rastgelelik yok; sayılar model tablolarından türetiliyor ve çıktı koşumdan koşuma aynı.
- BI27. Kimliğin ömrü ve sızıntı penceresi ölçülmüyor. Sayılan üç şey var: kimliğin durduğu yer, döndürmenin dokunduğu yer ve kimliğin kapsamı.
- BI28. Bir yer ya kalıcıdır ya geçici, ya erişim kaydı tutar ya tutmaz; kısmi kayıt modellenmiyor.
- BI29. Konak kapsamlı kimlikte konaktaki her işlem konağın kimliğini okuyabiliyor; işlemler arası yalıtım modellenmiyor. Gerçekte yalıtım kalemi düşürür, sıfırlamaz.
- BI30. Kenar katmanında çalışma ortamının verdiği kimlik yok; kimlik dağıtım paketiyle gidiyor. Bu bir model kararıdır — kenar noktalarının yerel kimlik uç noktası taşımadığı varsayıldı.
Kimliğin Durduğu Yer
Model on iş yükünü, hangi konakta koştuklarını ve her birinin ihtiyaç duyduğu izinleri tutuyor. Kap
ve makine katmanındaki yedi iş yükü üç konağa dağılmış; işlev ve kenar katmanındaki üçünün konağı
yok. YER tablosu her yol için kimliğin durduğu yerleri, her yerin sistemde kaç kez var olduğunu,
kalıcı olup olmadığını ve erişim kaydı tutup tutmadığını veriyor.
// kimlik.mjs — is yuku, konak ve kimlik verme yolu modeli // Kurgusal bolgesel olcum agi; gercek anahtar, sir ya da kimlik bilgisi yok, adlar uydurma. export const ORTAM = ['gelistirme', 'hazirlik', 'uretim']; export const IS_YUKU = { 'okuma-toplayici': { katman: 'kap', konak: 'k1', izin: ['olcum-yaz', 'kuyruk-yaz'] }, 'dogrulayici': { katman: 'kap', konak: 'k1', izin: ['olcum-oku', 'kuyruk-oku', 'olcum-yaz'] }, 'gunluk-tasiyici': { katman: 'kap', konak: 'k1', izin: ['gunluk-yaz', 'yapilandirma-oku'] }, 'faturalama': { katman: 'kap', konak: 'k2', izin: ['fatura-oku', 'fatura-yaz', 'posta-gonder'] }, 'is-emri': { katman: 'kap', konak: 'k2', izin: ['is-emri-yaz', 'kuyruk-oku', 'posta-gonder'] }, 'gecelik-toplu-is': { katman: 'makine', konak: 'm1', izin: ['olcum-oku', 'arsiv-yaz', 'fatura-oku'] }, 'arsivleyici': { katman: 'makine', konak: 'm1', izin: ['arsiv-oku', 'arsiv-yaz'] }, 'olcut-ozeti': { katman: 'islev', konak: null, izin: ['olcum-oku'] }, 'rapor-uretici': { katman: 'islev', konak: null, izin: ['fatura-oku', 'arsiv-oku'] }, 'kenar-dogrulayici': { katman: 'kenar', konak: null, izin: ['olcum-yaz'] }, }; export const AD = Object.keys(IS_YUKU); export const KONAK = ['k1', 'k2', 'm1']; export const KENAR_NOKTA = 12; // kenar katmaninin dagitildigi nokta // Olcek adlari: bir yerin sistemde kac kez var oldugu. export const OLCEK = { ornek: AD.length * ORTAM.length, // (is yuku, ortam) cifti konak: KONAK.length * ORTAM.length, tek: 1, }; // Kimligin durdugu yer: [ad, olcek, kalici mi, erisim kaydi tutuyor mu, dondurme nasil ulasiyor] export const YER = { 'dosyada-anahtar': [ ['ornek-diski', 'ornek', true, false, 'elle'], ['makine-goruntusu', 'konak', true, false, 'elle'], ['yapilandirma-deposu', 'ornek', true, true, 'elle'], ['yedek', 'konak', true, false, 'ulasilmaz'], ['gelistirici-dizustu', 'tek', true, false, 'ulasilmaz']], 'ortam-degiskeni': [ ['dagitim-tanimi', 'ornek', true, true, 'elle'], ['surec-ortami', 'ornek', false, false, 'yeniden-baslatma'], ['cokme-dokumu', 'konak', true, false, 'ulasilmaz']], 'ortamin-verdigi': [ ['surec-bellegi', 'ornek', false, true, 'kendiliginden']], }; export const YOL = Object.keys(YER); // Kimlik surec baslarken mi okunuyor: oyleyse dondurme yeniden baslatma istiyor. export const BASLANGICTA_OKUNUR = { 'dosyada-anahtar': true, 'ortam-degiskeni': true, 'ortamin-verdigi': false }; export const adet = (y) => OLCEK[y[1]]; export const topla = (yol, sec) => YER[yol].filter(sec).reduce((a, y) => a + adet(y), 0); // Konak kapsamli kimlikte bir konagin tasidigi izin, uzerindeki is yuklerinin birlesimidir. export const konakIzni = (k) => [...new Set(AD.filter((a) => IS_YUKU[a].konak === k).flatMap((a) => IS_YUKU[a].izin))]; export const konakta = (k) => AD.filter((a) => IS_YUKU[a].konak === k); // Katman basina ortamin verdigi kimligin var olup olmadigi ve en dar kapsami. export const KATMAN = { makine: [true, 'konak'], kap: [true, 'ornek'], islev: [true, 'cagri'], kenar: [false, 'dagitim'], };
// kosum1.mjs — uc yolun sizinti yuzeyi ve dondurme isi tek tabloda import { AD, ORTAM, OLCEK, YER, YOL, topla, BASLANGICTA_OKUNUR } from './kimlik.mjs'; const G = [5, 7, 8, 10, 7, 10, 13]; // sutun genislikleri const satir = (ad, v) => ad.padEnd(18) + v.map((x, i) => String(x).padStart(G[i])).join(''); const say = (yol, mod) => topla(yol, (y) => y[4] === mod); console.log(`is yuku ${AD.length}, ortam ${ORTAM.length}, ornek ${OLCEK.ornek}, konak kalemi ${OLCEK.konak}\n`); console.log(satir('', ['', '', '', '', 'elle', 'yeniden', 'ulasilmayan'])); console.log(satir('yol', ['yer', 'kopya', 'kalici', 'kayitsiz', 'dokun', 'baslatma', 'kopya'])); for (const yol of YOL) console.log(satir(yol, [YER[yol].length, topla(yol, () => true), topla(yol, (y) => y[2]), topla(yol, (y) => !y[3]), say(yol, 'elle'), BASLANGICTA_OKUNUR[yol] ? OLCEK.ornek : 0, say(yol, 'ulasilmaz')]));
is yuku 10, ortam 3, ornek 30, konak kalemi 9
elle yeniden ulasilmayan
yol yer kopya kalici kayitsiz dokun baslatma kopya
dosyada-anahtar 5 79 79 49 69 30 10
ortam-degiskeni 3 69 39 39 30 30 9
ortamin-verdigi 1 30 0 0 0 0 0
Dosyada duran anahtar beş ayrı yerde, toplam yetmiş dokuz kopya hâlinde duruyor ve hepsi kalıcı. Kırk dokuz kopya erişim kaydı tutmayan yerlerde. Ortam değişkeni yolu yer sayısını üçe indiriyor ama toplam kopyayı yalnız altmış dokuza düşürüyor; asıl fark kalıcı ve kayıtsız sütunlarında, her ikisi de otuz dokuza iniyor.
Üçüncü satır ölçüyü yerine oturtuyor. Çalışma ortamının verdiği kimlikte kalıcı kopya sıfır, kayıtsız kopya sıfır. Otuz kopya var — her örneğin belleğinde bir tane — ama hepsi kimlik uç noktasından alınırken kaydediliyor. Kazanç kopyanın azalması değil; kalıcı kopyanın yetmiş dokuzdan sıfıra inmesi ve kırk dokuz sessiz okumanın kaydedilir hâle gelmesidir.
Döndürme İşi
Tablonun sağ üç sütunu maliyet tarafıdır. Bu sütunların nereden geldiğini görmek için yerlerin tek tek dökülmesi gerekiyor.
// kosum2.mjs — kimligin durdugu yerler ve dondurmenin oralara nasil ulastigi import { YER, YOL, adet } from './kimlik.mjs'; for (const yol of YOL) { console.log(yol); for (const y of YER[yol]) console.log(` ${y[0].padEnd(21)}${String(adet(y)).padStart(3)} ${(y[2] ? 'kalici' : 'gecici')}` + ` kayit ${(y[3] ? 'var' : 'yok').padEnd(4)} dondurme: ${y[4]}`); }
dosyada-anahtar ornek-diski 30 kalici kayit yok dondurme: elle makine-goruntusu 9 kalici kayit yok dondurme: elle yapilandirma-deposu 30 kalici kayit var dondurme: elle yedek 9 kalici kayit yok dondurme: ulasilmaz gelistirici-dizustu 1 kalici kayit yok dondurme: ulasilmaz ortam-degiskeni dagitim-tanimi 30 kalici kayit var dondurme: elle surec-ortami 30 gecici kayit yok dondurme: yeniden-baslatma cokme-dokumu 9 kalici kayit yok dondurme: ulasilmaz ortamin-verdigi surec-bellegi 30 gecici kayit var dondurme: kendiliginden
Dosyadaki anahtarı değiştirmek altmış dokuz yere elle dokunmayı ve otuz örneği yeniden başlatmayı gerektiriyor; toplam doksan dokuz dokunuş. Ortam değişkeninde elle dokunuş otuza iniyor, çünkü süreç ortamı yeniden başlatmayla kendiliğinden yenileniyor. Üçüncü yolda iki sütun da sıfır — döndürme diye ayrı bir iş yok.
Asıl bulgu son sütundadır. Dosya yolunda döndürme on kopyaya hiç ulaşmıyor: dokuz yedek ve bir geliştirici dizüstü. Ortam değişkeninde dokuz çökme dökümü aynı durumda ve üçünün de kaydı yok. Eskisini iptal etmek ayrı bir adımdır ve ulaşılamayan kopya varken iptalin güvenle yapılıp yapılamayacağı bilinmiyor: bir yedekten dönen makine iptal edilmiş anahtarla açılır. Doksan dokuz dokunuşluk işin sonunda kapanmayan kalem sıfır değil, on.
Kimliğin Kapsamı
Üçüncü ölçü kapsamdır: kimlik bir örneğe mi verilmiş, yoksa o örneğin koştuğu konağa mı. Konak kapsamlı kimlikte konaktaki her işlem aynı kimliği okuyabiliyor, dolayısıyla kimliğin izni konaktaki bütün iş yüklerinin izinlerinin birleşimidir.
// kosum3.mjs — kimligin kapsami: konak kapsamli kimlik kac izni ve kac isi fazladan aciyor import { AD, ORTAM, IS_YUKU, KONAK, konakIzni, konakta } from './kimlik.mjs'; console.log('konak is yuku birlesim izni izinler'); for (const k of KONAK) { const u = konakIzni(k); console.log(`${k.padEnd(7)}${String(konakta(k).length).padStart(7)}${String(u.length).padStart(15)} ${u.join(', ')}`); } console.log('\nis yuku kapsam kendi konak fazladan fazladan'); console.log(' izni izni izin is yuku'); let kendi = 0, konakli = 0, fazlaIs = 0; for (const a of AD) { const w = IS_YUKU[a], k = w.konak; const konakN = k ? konakIzni(k).length : w.izin.length; const fazlaIsY = k ? konakta(k).length - 1 : 0; kendi += w.izin.length; konakli += konakN; fazlaIs += fazlaIsY; console.log(`${a.padEnd(19)}${(k ?? 'konaksiz').padEnd(9)}${String(w.izin.length).padStart(5)}` + `${String(konakN).padStart(7)}${String(konakN - w.izin.length).padStart(9)}${String(fazlaIsY).padStart(10)}`); } const O = ORTAM.length; console.log(''); for (const [ad, v] of [ ['ornek kapsamli kimlikte (ornek, izin)', kendi * O], ['konak kapsamli kimlikte (ornek, izin)', konakli * O], ['fazladan verilen izin kalemi', `${(konakli - kendi) * O} (%${Math.round(((konakli - kendi) / kendi) * 100)})`], ['fazladan erisilen (ornek, is yuku) kalemi', fazlaIs * O], ['tek ornekten en cok fazladan acilan is', Math.max(...KONAK.map((k) => konakta(k).length - 1))], ['fazladan hicbir sey acmayan ornek', `${AD.filter((a) => !IS_YUKU[a].konak).length * O} / ${AD.length * O}`], ]) console.log(`${ad.padEnd(42)}${v}`);
konak is yuku birlesim izni izinler
k1 3 6 olcum-yaz, kuyruk-yaz, olcum-oku, kuyruk-oku, gunluk-yaz, yapilandirma-oku
k2 2 5 fatura-oku, fatura-yaz, posta-gonder, is-emri-yaz, kuyruk-oku
m1 2 4 olcum-oku, arsiv-yaz, fatura-oku, arsiv-oku
is yuku kapsam kendi konak fazladan fazladan
izni izni izin is yuku
okuma-toplayici k1 2 6 4 2
dogrulayici k1 3 6 3 2
gunluk-tasiyici k1 2 6 4 2
faturalama k2 3 5 2 1
is-emri k2 3 5 2 1
gecelik-toplu-is m1 3 4 1 1
arsivleyici m1 2 4 2 1
olcut-ozeti konaksiz 1 1 0 0
rapor-uretici konaksiz 2 2 0 0
kenar-dogrulayici konaksiz 1 1 0 0
ornek kapsamli kimlikte (ornek, izin) 66
konak kapsamli kimlikte (ornek, izin) 120
fazladan verilen izin kalemi 54 (%82)
fazladan erisilen (ornek, is yuku) kalemi 30
tek ornekten en cok fazladan acilan is 2
fazladan hicbir sey acmayan ornek 9 / 30
Üst blok birleşimin ne kadar büyüdüğünü gösteriyor. k1 üzerinde üç iş yükü var, hiçbirinin
ihtiyacı üçten fazla izin değil, konağın birleşim izni altı. Günlük taşıyıcı iki izne ihtiyaç
duyuyor ama konak kimliğiyle altı izin taşıyor; fazladan gelen dördün ikisi ölçüm ve kuyruk
yazmadır — günlük taşıyıcının hiç dokunmadığı iki veri yolu.
Alt blok sistem toplamıdır. Örnek kapsamlı kimlikte altmış altı (örnek, izin) kalemi var, konak
kapsamlı kimlikte yüz yirmi. Fazladan verilen elli dört kalem, gerçek ihtiyacın yüzde seksen ikisi
kadar. Bir örneğin ele geçirilmesi otuz (örnek, iş yükü) kaleminde fazladan erişim açıyor; en kötü
durumda tek bir işlemden iki iş yükü daha açılıyor.
Son satır kapsam ölçüsünün sınırını söylüyor: otuz örneğin dokuzu konak paylaşmıyor, kapsam sorusu onlarda hiç doğmuyor. Kapsam kalemi, konak paylaşımının kalemidir. Kimliği dosyadan çalışma ortamına taşımak yer ve döndürme sütunlarını sıfırlıyor ama bu sütunu sıfırlamıyor — çalışma ortamının verdiği kimlik de konak kapsamlı olabilir.
Kenar ve İşlev Katmanı
Kapsam katmana göre değişiyor: çalışma ortamı kimliği her katmanda aynı biçimde vermiyor, bazılarında hiç vermiyor.
// kosum4.mjs — kenar ve islev katmaninda kimlik nasil veriliyor: kapsam ve kalici kopya ayri sayilir import { AD, ORTAM, IS_YUKU, KATMAN, KENAR_NOKTA } from './kimlik.mjs'; const O = ORTAM.length; const katmanda = (kt) => AD.filter((a) => IS_YUKU[a].katman === kt); const kalici = (kt) => (KATMAN[kt][0] ? 0 : katmanda(kt).length * KENAR_NOKTA * O); console.log('katman is yuku ornek ortamin verdigi en dar kalici dondurmede'); console.log(' kimlik kapsam kopya dokunus'); for (const kt of Object.keys(KATMAN)) { const n = katmanda(kt).length; console.log(`${kt.padEnd(8)}${String(n).padStart(7)}${String(n * O).padStart(7)} ` + `${(KATMAN[kt][0] ? 'var' : 'yok').padEnd(17)}${KATMAN[kt][1].padEnd(10)}` + `${String(kalici(kt)).padStart(6)}${String(kalici(kt)).padStart(10)}`); } const alan = Object.keys(KATMAN).filter((k) => KATMAN[k][0]); const dar = alan.filter((k) => KATMAN[k][1] !== 'konak'); const say = (ks) => ks.reduce((a, k) => a + katmanda(k).length * O, 0); console.log(''); for (const [ad, v] of [ ['ortamin verdigi kimligi alabilen ornek', `${say(alan)} / ${AD.length * O}`], ['ornek ya da daha dar kapsam alabilen', `${say(dar)} / ${AD.length * O}`], ['konak kapsaminda kalan ornek', `${say(alan.filter((k) => KATMAN[k][1] === 'konak'))} / ${AD.length * O}`], ['hic alamayan ornek', `${say(Object.keys(KATMAN).filter((k) => !KATMAN[k][0]))} / ${AD.length * O}`], ['en iyi yolda sistemde kalan kalici kopya', Object.keys(KATMAN).reduce((a, k) => a + kalici(k), 0)], ]) console.log(`${ad.padEnd(42)}${v}`);
katman is yuku ornek ortamin verdigi en dar kalici dondurmede
kimlik kapsam kopya dokunus
makine 2 6 var konak 0 0
kap 5 15 var ornek 0 0
islev 2 6 var cagri 0 0
kenar 1 3 yok dagitim 36 36
ortamin verdigi kimligi alabilen ornek 27 / 30
ornek ya da daha dar kapsam alabilen 21 / 30
konak kapsaminda kalan ornek 6 / 30
hic alamayan ornek 3 / 30
en iyi yolda sistemde kalan kalici kopya 36
Makine katmanında kimlik var ama en dar kapsam konaktır: makineye verilen kimliği o makinede koşan her şey okuyabiliyor. Kap katmanında örnek kapsamı mümkün, her iş yükü kendi kimliğini alabiliyor. İşlev katmanı en darıdır — kimlik çağrı başına veriliyor, çağrı bitince ortadan kalkıyor, kalıcı kopya sıfır.
Kenar satırı ötekilerden ayrı duruyor. Kenar noktalarında yerel bir kimlik uç noktası yok; kimlik dağıtım paketinin içinde gidiyor ve on iki nokta çarpı üç ortam otuz altı kalıcı kopya ediyor. Döndürme de aynı otuz altı yere dokunuyor. Kimliği en kötü koşullarda taşıyan katman, dışarıya bakan katmandır.
Alt blok toplamı veriyor. Otuz örneğin yirmi yedisi çalışma ortamının verdiği kimliği alabiliyor ama yalnız yirmi biri örnek ya da daha dar kapsam alabiliyor; altısı konak kapsamında kalıyor, üçü hiç alamıyor. En iyi yol seçildiğinde bile sistemde otuz altı kalıcı kopya kalıyor, hepsi tek bir katmanda. Yetmiş dokuzdan otuz altıya inmek gerçek bir kazançtır ama sıfır olmuyor; kalan kalem katmanın verdiği imkânsızlıktan kalıyor.
Özet
- Dosyada duran anahtar 5 yerde 79 kopya hâlinde ve hepsi kalıcı; 49’u erişim kaydı tutmayan bir yerde. Ortam değişkeni kalıcı kopyayı 39’a indiriyor. Çalışma ortamının verdiği kimlikte 30 kopya var ama kalıcı kopya 0, kayıtsız kopya 0 — kazanç kopya sayısında değil, kopyanın kalıcılığında ve kaydedilebilirliğindedir.
- Döndürme dosya yolunda 69 elle dokunuş ve 30 yeniden başlatma, ortam değişkeninde 30 dokunuş ve 30 yeniden başlatma, çalışma ortamı kimliğinde 0 istiyor.
- Döndürmenin hiç ulaşamadığı kopya dosya yolunda 10 (9 yedek, 1 dizüstü), ortam değişkeninde 9 (çökme dökümü); bunlar iptalin güvenle yapılıp yapılamayacağını belirsiz bırakıyor.
- Konak kapsamlı kimlik
(örnek, izin)kalemini 66’dan 120’ye çıkarıyor: 54 fazladan izin, gerçek ihtiyacın %82’si. Ele geçen bir örnek 30(örnek, iş yükü)kaleminde fazladan erişim açıyor; 30 örneğin 9’unda konak paylaşımı olmadığı için bu kalem hiç doğmuyor. - Katman kimliği belirliyor: 30 örneğin 27’si çalışma ortamının kimliğini alabiliyor ama yalnız 21’i örnek ya da daha dar kapsam alabiliyor, 6’sı konak kapsamında kalıyor, 3’ü hiç alamıyor.
- En iyi yolda bile 36 kalıcı kopya kalıyor ve hepsi kenar katmanında; orada yerel kimlik uç noktası olmadığı için kimlik dağıtım paketiyle 12 noktaya çoğalıyor.
Sonraki Adım
Bu ders kimliğin nereden geldiğini değiştirdi ama o kimliğin ne yapabildiğine hiç bakmadı. Kapsam
ölçülürken çıkan sayı bunu zaten söylüyor: k1 kimliği altı izin taşıyor ve üstündeki üç iş
yükünün hiçbiri altısını birden kullanmıyor. Örnek kapsamına inildiğinde bile aynı soru duruyor —
bir iş yüküne yazılan izin kümesi, o iş yükünün gerçekten kullandığı kümeyle aynı mı? Sonraki dersin
sorusu budur. Kullanım geçmişi ile verilmiş politika yan yana konduğunda kullanılmayan izin oranı
kaç çıkıyor, daraltılmış politika kaç satır ediyor ve daraltma kaç meşru işi durduruyor — geçmişte
hiç görünmemiş ama gerekli olan nadir yol, daraltmanın bedelidir.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.