İçeriğe geç
academia.sh

Ders 18 / 20

Vale Anahtarı Kalıbı

Doğrudan kaynak erişimi için sınırlı yetki: kanıt baytının servisin üzerinden kaldırılmasıyla aktarım başına 80.000 baytın 512 bayta inmesi, depo yavaşladığında tutulan yuvanın 64'te doyup 28 aktarımı düşürmesi, açık yetki penceresinin anahtar süresiyle büyümesi ve kapsam daraltmanın getirisinin doğrusal olmaması.

İçindekiler

Talep fişi kanıtı kuyruğun dışına çıkardı ama yolun tamamı hâlâ servisin içinden geçiyor. Taşıyıcı kanıtı servise yüklüyor, servis depoya yazıyor; alıcı kanıtı istediğinde servis depodan okuyup istemciye aktarıyor. Kuyruktan kaldırılan 40.000 bayt, isteğe bağlı yolda iki kez geçmeye devam ediyor.

Vale anahtarı (valet key), istemciye kaynağa doğrudan erişecek kadar dar ve kısa süreli bir yetki verip veriyi servisin dışından akıtan yerleşimdir. Kimlik ve Yetki kursu imzalı bağlantıyı, kapsamı ve süreli belirteci kurdu; doğrulama mekaniği burada tekrarlanmaz. Bu dersin ölçüleri üçtür: servisin üzerinden geçmeyen bayt, açılan yetki penceresi ve kapsamı daraltmanın maliyeti.

Baytın Servisten Çıkması

DD12 — teslim kanıtının görüntülenme oranı 0,02. Gerekçesi: kanıt yalnız itiraz ya da denetim durumunda okunur, her gönderide değil. Duyarlılığı ölçüye zaten oran olarak giriyor. DD13 — kanıt aktarım havuzu 64 yuva ve arıza senaryosu: kanıt deposu yavaşlıyor, yanıt süresi 1 turdan 20 tura çıkıyor ve 80 tur sürüyor. Tur süresi bu kursun DD6 varsayımıdır (0,25 saniye), yani yavaşlama 20 saniye sürer. Sıklığı ayda 2 kez alınır.

Düzenek süreç içi bir modeldir: depo, ağ ve istemci yoktur; tur soyut bir adım, yuva bir sayaç, bayt sayılan bir niceliktir.

// vale/yol.mjs — kanit aktariminin iki yolunun surec ici modeli.
// Gercek depo, ag ve istemci yoktur: tur soyut bir adim, yuva bir sayac, bayt sayilir.

export const KANIT = 40_000, ANAHTAR = 512;   // DD8 kanit bayti; DD14 vale anahtari yaniti

// yol: "vekil" = bayt servisin uzerinden gecer; "vale" = servis yalniz anahtar uretir.
// Her tur: gelen aktarimlar yuva ister, depo suresi kadar yuvayi tutar, sonra birakir.
export function kos({ tur, gelen, havuz, normalSure, arizaSure, arizaBasi, arizaBitis, yol }) {
  const tutulan = [];
  const s = { kabul: 0, red: 0, tepeYuva: 0, servisBayt: 0, yuvaTur: 0, anahtar: 0 };
  let artik = 0;
  for (let t = 0; t < tur; t += 1) {
    for (let i = tutulan.length - 1; i >= 0; i -= 1) if (tutulan[i] <= t) tutulan.splice(i, 1);
    const sure = t >= arizaBasi && t < arizaBitis ? arizaSure : normalSure;
    artik += gelen;
    const n = Math.floor(artik);
    artik -= n;
    for (let i = 0; i < n; i += 1) {
      if (yol === "vale") { s.kabul += 1; s.anahtar += 1; s.servisBayt += ANAHTAR; continue; }
      if (tutulan.length >= havuz) { s.red += 1; continue; }
      tutulan.push(t + sure);
      s.kabul += 1; s.servisBayt += KANIT * 2;      // istemciden alinir, depoya yazilir
    }
    s.tepeYuva = Math.max(s.tepeYuva, tutulan.length);
    s.yuvaTur += tutulan.length;
  }
  return s;
}
// vale/olc.mjs — kanit deposu yavasladiginda iki yolun tuttugu yuva ve dusen aktarim
import { kos, KANIT, ANAHTAR } from "./yol.mjs";

const V3 = 400_000, V8 = 3, GUN = 86_400;         // K01: gunluk gonderi, tepe carpani
const DD12 = 0.02;                                // kanitin goruntulenme orani
const TUR_S = 0.25, TUR = 320, HAVUZ = 64;        // DD6 tur suresi; DD13 havuz
const hizYukleme = (V3 / GUN) * V8, hizOkuma = ((V3 * DD12) / GUN) * V8;
const hiz = hizYukleme + hizOkuma;
const gelen = hiz * TUR_S;

console.log(`tepe kanit aktarimi ${hiz.toFixed(4)}/s (yukleme ${hizYukleme.toFixed(4)}, ` +
  `okuma ${hizOkuma.toFixed(4)}; DD12 = ${DD12})`);
console.log(`${TUR} tur x ${TUR_S} s = ${(TUR * TUR_S).toFixed(0)} s; tur basina ${gelen.toFixed(4)} aktarim`);
console.log(`DD13: depo yaniti 1 turdan 20 tura cikiyor, 80 tur (${(80 * TUR_S).toFixed(0)} s) suruyor`);

console.log(`\n${"yol".padEnd(8)}${"durum".padEnd(10)}${"kabul".padStart(8)}${"red".padStart(7)}` +
  `${"tepe yuva".padStart(11)}${"ort. yuva".padStart(11)}${"servis MB".padStart(12)}`);
for (const yol of ["vekil", "vale"])
  for (const [ad, arizaSure, arizaBasi, arizaBitis] of
    [["arizasiz", 1, TUR, TUR], ["arizali", 20, 80, 160]]) {
    const r = kos({ tur: TUR, gelen, havuz: HAVUZ, normalSure: 1,
      arizaSure, arizaBasi, arizaBitis, yol });
    console.log(`${yol.padEnd(8)}${ad.padEnd(10)}${String(r.kabul).padStart(8)}` +
      `${String(r.red).padStart(7)}${String(r.tepeYuva).padStart(11)}` +
      `${(r.yuvaTur / TUR).toFixed(2).padStart(11)}${(r.servisBayt / 1e6).toFixed(3).padStart(12)}`);
  }
console.log(`\nbir aktarimda servisten gecen bayt: vekil ${KANIT * 2}, vale ${ANAHTAR} ` +
  `(oran ${((KANIT * 2) / ANAHTAR).toFixed(1)} kat)`);
tepe kanit aktarimi 14.1667/s (yukleme 13.8889, okuma 0.2778; DD12 = 0.02)
320 tur x 0.25 s = 80 s; tur basina 3.5417 aktarim
DD13: depo yaniti 1 turdan 20 tura cikiyor, 80 tur (20 s) suruyor

yol     durum        kabul    red  tepe yuva  ort. yuva   servis MB
vekil   arizasiz      1133      0          4       3.54      90.640
vekil   arizali       1105     28         64      18.65      88.400
vale    arizasiz      1133      0          0       0.00       0.580
vale    arizali       1133      0          0       0.00       0.580

bir aktarimda servisten gecen bayt: vekil 80000, vale 512 (oran 156.3 kat)

Bu sayılar ölçüm sınıfındadır ve süreç içi bir modelden gelirler; girdileri K01’in hesabı ile bu dersin varsayımlarıdır.

Yavaşlayan Deponun Servise Bulaşması

Arızasız satırlar iki yolun sessiz farkını veriyor: seksen saniyede vekil yol servisten 90,640 MB geçiriyor, vale yolu 0,580 MB. Aktarım başına 80.000 bayta karşı 512 bayt, 156,3 kat. Ortalama tutulan yuva vekil yolda 3,54; bu, gelen hız ile hizmet süresinin çarpımıdır ve arızasız günde 64 yuvalık havuzun yanında küçüktür.

Arızalı satır asıl ayrımı yapıyor. Depo yanıt süresi yirmi kat uzayınca tutulan yuva ortalaması 18,65’e, tepe 64’e çıkıyor — havuz doyuyor — ve 28 aktarım reddediliyor. Kabul edilen aktarım 1133’ten 1105’e iniyor. Vale yolunda aynı yavaşlamada tutulan yuva 0, reddedilen 0, kabul 1133: servis kanıtın baytına hiç dokunmadığı için deponun yavaşlaması servisin havuzuna yansımıyor. İstemci hâlâ yavaş bir depoyla konuşur, ama bekleyen taraf istemcidir; bulaşma kapsamı servisin dışında kalır. Havuzun doyması yalnız kanıt aktarımını değil, aynı havuzu paylaşan başka işleri de etkiler; havuzların ayrılması bu kursun Arıza Yalıtımı konusundaki bölme kalıbının sorusudur.

Kapsam ve Süre

Kalıbın karşılığı bir yetkidir ve yetki iki eksende ölçülür: ne kadar süre açık kaldığı ve kaç nesneyi açtığı.

DD14 — vale anahtarı süresi 300 saniye. Gerekçesi: bir kanıt yüklemesi ya da görüntülemesi tek bir kullanıcı eylemidir ve dakikalar sürmez; süre yeniden deneme payı bırakacak kadar uzun tutulur. Duyarlılığı 60 ve 3600 saniyeyle verilir. DD15 — bir anahtarın sızma olasılığı 10⁻⁶; anahtar günlük kaydına, tarayıcı geçmişine ya da paylaşılan bir bağlantıya düşebilir. İkisi de varsayımdır.

// vale/kapsam.mjs — kapsam daraltmanin anahtar uretimi, yetki penceresi ve maruz kalma etkisi
const V3 = 400_000, V8 = 3, V12 = 730, GUN = 86_400;   // K01: gonderi, tepe carpani, saklama
const SATICI = 4000, UC_TEPE = 513.89;                 // K01 hesabi: satici sayisi, uctaki tepe
const DD14 = 300, DD15 = 1e-6;                         // anahtar suresi (s), anahtar sizma olasiligi
const GUNLUK = V3 / SATICI;                            // satici basina gunluk gonderi = 100

// Kapsam: [ad, gunluk anahtar uretimi, bir anahtarin eristigi nesne sayisi]
const KAPSAM = [["tek nesne", V3, 1], ["satici-gun oneki", SATICI, GUNLUK],
  ["satici kovasi", SATICI, GUNLUK * V12]];

console.log(`DD14 anahtar suresi ${DD14} s, DD15 sizma olasiligi ${DD15}; ` +
  `gunde ${V3.toLocaleString("tr-TR")} kanit, ${SATICI} satici, satici basina ${GUNLUK} gonderi`);
console.log(`\n${"kapsam".padEnd(18)}${"anahtar/gun".padStart(13)}${"tepe anahtar/s".padStart(16)}` +
  `${"K01 ucunun".padStart(12)}${"acik pencere".padStart(14)}${"yuzey".padStart(9)}` +
  `${"nesne-saniye/gun".padStart(18)}`);
for (const [ad, uretim, yuzey] of KAPSAM) {
  const tepe = (uretim / GUN) * V8, acik = tepe * DD14;
  const maruz = uretim * DD15 * yuzey * DD14;
  console.log(`${ad.padEnd(18)}${uretim.toLocaleString("tr-TR").padStart(13)}` +
    `${tepe.toFixed(4).padStart(16)}${`%${((100 * tepe) / UC_TEPE).toFixed(3)}`.padStart(12)}` +
    `${acik.toFixed(1).padStart(14)}${yuzey.toLocaleString("tr-TR").padStart(9)}` +
    `${maruz.toFixed(1).padStart(18)}`);
}

console.log(`\n${"DD14 duyarliligi".padStart(17)}${"tek nesne acik".padStart(16)}` +
  `${"satici-gun acik".padStart(17)}${"kova nesne-saniye".padStart(19)}`);
for (const s of [60, 300, 3600]) {
  const t = (V3 / GUN) * V8 * s, g = (SATICI / GUN) * V8 * s;
  console.log(`${`${s} s`.padStart(17)}${t.toFixed(1).padStart(16)}${g.toFixed(1).padStart(17)}` +
    `${(SATICI * DD15 * GUNLUK * V12 * s).toFixed(0).padStart(19)}`);
}
const [t1, g1, k1] = KAPSAM.map(([, u, y]) => u * DD15 * y * DD14);
console.log(`\nkova -> satici-gun: maruz kalma ${(k1 / g1).toFixed(0)} kat azaliyor, ` +
  `anahtar uretimi degismiyor`);
console.log(`satici-gun -> tek nesne: maruz kalma ${(g1 / t1).toFixed(2)} kat degisiyor, ` +
  `anahtar uretimi ${(V3 / SATICI).toFixed(0)} kat artiyor`);
console.log(`en kotu durum ayni degil: sizan tek anahtarin actigi nesne ` +
  `${KAPSAM.map(([ad, , y]) => `${ad} ${y.toLocaleString("tr-TR")}`).join(", ")}`);
DD14 anahtar suresi 300 s, DD15 sizma olasiligi 0.000001; gunde 400.000 kanit, 4000 satici, satici basina 100 gonderi

kapsam              anahtar/gun  tepe anahtar/s  K01 ucunun  acik pencere    yuzey  nesne-saniye/gun
tek nesne               400.000         13.8889      %2.703        4166.7        1             120.0
satici-gun oneki          4.000          0.1389      %0.027          41.7      100             120.0
satici kovasi             4.000          0.1389      %0.027          41.7   73.000           87600.0

 DD14 duyarliligi  tek nesne acik  satici-gun acik  kova nesne-saniye
             60 s           833.3              8.3              17520
            300 s          4166.7             41.7              87600
           3600 s         50000.0            500.0            1051200

kova -> satici-gun: maruz kalma 730 kat azaliyor, anahtar uretimi degismiyor
satici-gun -> tek nesne: maruz kalma 1.00 kat degisiyor, anahtar uretimi 100 kat artiyor
en kotu durum ayni degil: sizan tek anahtarin actigi nesne tek nesne 1, satici-gun oneki 100, satici kovasi 73.000

Daraltmanın Getirisi Doğrusal Değil

Tablo, kapsamı daraltmanın iki basamağını ayırıyor ve basamaklar birbirine benzemiyor.

Kova kapsamından satıcı-gün önekine inmek 730 kat kazandırıyor ve hiçbir şeye mal olmuyor: anahtar üretimi ikisinde de günde 4000, açık pencere ikisinde de 41,7 anahtar. Beklenen maruz kalma 87.600 nesne-saniyeden 120,0’a düşüyor. Bu, bedava bir daraltmadır ve alınmaması için gerekçe yoktur.

Satıcı-gün önekinden tek nesneye inmek beklenen maruz kalmayı hiç değiştirmiyor — iki satır da 120,0 nesne-saniye — ama anahtar üretimini 100 kat artırıyor: günde 4000 yerine 400.000, tepede 0,1389 yerine 13,8889 anahtar/s. Bu, K01’in uçtaki 513,89 istek/s’sinin yüzde 2,703’ü eder. Beklenen değerin değişmemesinin nedeni aritmetiktir: kapsam yüz kat daralırken üretilen anahtar sayısı yüz kat artıyor, çarpım sabit kalıyor.

Karar buna rağmen tek nesne lehine verilebilir, ama gerekçesi beklenen değer değildir: en kötü durum eşit değil. Sızan tek bir anahtar tek nesne kapsamında 1, satıcı-gün önekinde 100, kova kapsamında 73.000 nesne açar. Beklenen maruz kalma aynı olsa da dağılımın kuyruğu farklıdır ve tek bir olayın taşıyabileceği en büyük zarar üç mertebe ayrılır.

Süre eksenine bakıldığında sonuç daha basit: açık pencere DD14 ile doğrusal büyür. Anahtar süresi 60 saniyeye çekildiğinde tek nesne kapsamında aynı anda geçerli anahtar 4166,7’den 833,3’e iner; 3600 saniyeye çıkarıldığında 50.000’e çıkar. Kova kapsamında bir saatlik anahtar günde 1.051.200 nesne-saniye üretir. Süreyi kısaltmak her kapsamda doğrusal kazandırır; kapsamı daraltmak yalnız ilk basamakta kazandırır.

İki Günün Sayısı

Arızasız günün bedeli iki kalemdir. Servis, taşımadığı her bayt için bir anahtar üretir: tek nesne kapsamında günde 400.000 imzalama, tepede 13,8889 istek/s, uçtaki hızın yüzde 2,703’ü. Ve kalıcı olarak açık bir yetki penceresi taşınır — tek nesne kapsamında 300 saniyelik süreyle 4166,7 anahtar aynı anda geçerlidir. Vekil yolda böyle bir pencere yoktur; erişim isteğin kendisiyle sınırlıdır.

Arızalı günün kazancı yalıtımdır. Kanıt deposu yirmi kat yavaşladığında vekil yol havuzunu 64 yuvada doyuruyor ve 80 saniyede 28 aktarım düşürüyor; vale yolunda düşen aktarım 0, tutulan yuva 0. Fark bir hız farkı değil, bir bulaşma farkıdır: vekil yolda deponun arızası servisin kaynağına dönüşür, vale yolunda istemcide kalır. Servisten geçmeyen bayt seksen saniyede 90,060 MB’dir (90,640 − 0,580) ve bu bayt, arızada tutulan yuvanın kaynağıdır.

Özet

  • Aktarım başına servisten geçen bayt vekil yolda 80.000, vale yolunda 512; oran 156,3 kat, 80 saniyelik koşumda 90,640 MB’ye karşı 0,580 MB.
  • Depo 20 kat yavaşladığında vekil yolda tutulan yuva ortalaması 18,65, tepe 64 (havuz doyuyor) ve 28 aktarım düşüyor; vale yolunda yuva 0, düşen 0.
  • Arızasız günün bedeli anahtar üretimidir: tek nesne kapsamında günde 400.000 imzalama, tepede 13,8889 istek/s, K01’in uçtaki hızının yüzde 2,703’ü.
  • Açık yetki penceresi süreyle doğrusaldır: DD14 = 60/300/3600 saniyede tek nesne kapsamında 833,3 / 4166,7 / 50.000 anahtar aynı anda geçerlidir.
  • Kapsam daraltmanın ilk basamağı bedava: kova → satıcı-gün beklenen maruz kalmayı 87.600’den 120,0 nesne-saniyeye indiriyor, anahtar üretimini değiştirmiyor.
  • İkinci basamak beklenen değeri değiştirmiyor (120,0 → 120,0) ama anahtar üretimini 100 kat artırıyor; gerekçesi en kötü durumdur — sızan bir anahtarın açtığı nesne 73.000 / 100 / 1.

Sonraki Adım

Kanıt yolu artık üç karara dayanıyor: yükün nerede duracağı, fişin ne zaman silineceği ve anahtarın hangi kapsamla kaç saniye geçerli olacağı. Bu sayıların üçü de koda gömülü: yaşam süresi bir sabit, anahtar süresi bir sabit, havuz boyu bir sabit. Bir arıza sırasında anahtar süresini kısaltmak ya da kanıt yolunu tümden kapatmak gerekirse tek yol yeniden dağıtımdır ve yeniden dağıtım kesinti bütçesinin planlı payından yer alır. Sonraki ders bu ayarların uygulamanın dışına çıkarılmasını ele alır: değişikliğin bütün kopyalara yayılma süresi, önbellekli okumanın bedeli, deponun kendisi düştüğünde davranış ve yanlış konan bir değerin bulaşma kapsamı.

İ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