İçeriğe geç
academia.sh

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 node ile 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.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat