İçeriğe geç
academia.sh

Ders 16 / 16

Kapı Bekçisi Kalıbı

Doğrulamanın ayrı bir katmana yalıtılması: kapıda verilebilen denetimlerle uygulamada kalması gerekenlerin ayrılması, geçersiz isteğin uygulamaya ulaşma oranının ve taşıdığı baytın ölçülmesi, güvenilmeyen girdiye dokunan birim sayısının düşürülmesi ve sonucun K01'in uçtaki tepe hızına uygulanması.

İçindekiler

Beş ders boyunca kenara yerleştirilen her iş bir kazanç ve bir bedelle yazıldı, ama hepsinin ortak bir kabulü vardı: kenara ulaşan istek işlenmeye değer bir istektir. Uçtaki tepe hızın bir bölümü ise hiçbir zaman yanıtlanmayacak isteklerden oluşur — tanınmayan yollar, zorunlu alanı eksik gövdeler, sınırı aşan boyutlar, biçimsiz belirteçler.

Kapı bekçisi (gatekeeper), doğrulamayı ayrı bir katmana yalıtan yerleşimdir: güvenilmeyen girdiyi yalnız bu katman görür, uygulama yalnız doğrulanmış ve normalleştirilmiş isteği alır. Ağ geçidinden farkı sorumluluk kapsamıdır; ağ geçidi yönlendirir, toplar ve boşaltılmış işleri yapar, kapı bekçisi tek bir soru sorar: bu istek uygulamaya ulaşmalı mı. Bu ders o sorunun kaç istekte “hayır” olduğunu ölçer.

Kapıda Verilebilen Doğrulama

Üçüncü dersin taşınabilirlik kuralı burada da geçerlidir: yalnız isteğin kendisine bakan bir denetim kapıda verilebilir, alan verisine bakan bir denetim veremez. Model bunu iki denetim kümesiyle ayırır ve altmış istekten oluşan belirlenimli bir küme üzerinde koşturur. Küme kurgudur: altı kusur türünün her biri beşer kez geçer, çünkü ölçülmek istenen şey gerçekçi bir hata oranı değil, kusurların hangisinin kapıda tutulabildiğidir.

// kapi/istek.mjs — belirlenimli istek kumesi ve iki dogrulama katmani; surec ici model
export const GONDERI = { "TR-4821": { sahip: "M7" }, "TR-9007": { sahip: "M3" } };
const TEMEL = { yol: "/takip", takipNo: "TR-4821", belirtec: "b.M7.imza", govdeBayt: 120 };

// Her on ikinci istekte bir kusur; kume 60 istekten olusur, alti kusur turu beser kez gecer.
export function kume(n = 60) {
  const KUSUR = {
    6: { yol: "/yok" },                    // taninmayan yol
    7: { takipNo: undefined },             // sema: zorunlu alan eksik
    8: { govdeBayt: 9000 },                // govde boyutu asimi
    9: { belirtec: "bozuk" },              // bicimsiz belirtec
    10: { takipNo: "TR-0001" },            // kayitli olmayan gonderi
    11: { belirtec: "b.M3.imza" },         // baskasinin gonderisi
  };
  return Array.from({ length: n }, (_, i) => ({ ...TEMEL, ...(KUSUR[i % 12] ?? {}) }));
}

// Kapi bekcisi: yalnizca istegin kendisine bakar (yol, sema, boyut, belirtec bicimi).
export const KAPI = {
  yol: (r) => r.yol === "/takip",
  sema: (r) => typeof r.takipNo === "string" && /^TR-\d{4}$/.test(r.takipNo),
  boyut: (r) => r.govdeBayt <= 2048,
  belirtec: (r) => /^b\.M\d+\.imza$/.test(r.belirtec),
};

// Uygulama: alan verisine bakan iki dogrulama; kapida verilemez.
export const UYGULAMA = {
  varlik: (r) => GONDERI[r.takipNo] !== undefined,
  yetki: (r) => GONDERI[r.takipNo]?.sahip === r.belirtec.split(".")[1],
};

export const gecer = (denetimler, r) => Object.values(denetimler).every((d) => d(r));

Belirteç doğrulama Kimlik Doğrulama ve Yetkilendirme kursunda kuruldu; buradaki belirtec denetimi imzayı sınamaz, yalnız biçimi sınar — kapıda verilebilecek olan budur.

// kapi/olc.mjs — kapi bekcisi olan ve olmayan yerlesimi olcer, sonra K01 hesabina baglar
import { kume, KAPI, UYGULAMA, gecer } from "./istek.mjs";

const istekler = kume();
const gecersiz = istekler.filter((r) => !(gecer(KAPI, r) && gecer(UYGULAMA, r)));
const kapidaTutulan = gecersiz.filter((r) => !gecer(KAPI, r));

const bayt = (liste) => liste.reduce((t, r) => t + r.govdeBayt, 0);
const ulasan = (kapiVar) => (kapiVar ? istekler.filter((r) => gecer(KAPI, r)) : istekler);

const ALAN = ["uygulamaya ulasan istek", "uygulamaya ulasan gecersiz istek",
  "uygulamaya ulasan govde bayti", "guvenilmeyen girdiye dokunan birim",
  "uygulamanin disa acik adresi", "dogrulama kodu tasiyan birim"];
const olc = (kapiVar) => {
  const u = ulasan(kapiVar);
  return {
    "uygulamaya ulasan istek": `${u.length}/${istekler.length}`,
    "uygulamaya ulasan gecersiz istek": u.filter((r) => !gecer(UYGULAMA, r) || !gecer(KAPI, r)).length,
    "uygulamaya ulasan govde bayti": bayt(u),
    "guvenilmeyen girdiye dokunan birim": kapiVar ? 1 : 3,
    "uygulamanin disa acik adresi": kapiVar ? 0 : 1,
    "dogrulama kodu tasiyan birim": kapiVar ? 1 + 3 : 3,
  };
};

const olcum = [["kapi yok", olc(false)], ["kapi bekcisi", olc(true)]];
console.log(`${"olcu".padEnd(36)}${olcum.map(([a]) => a.padStart(14)).join("")}`);
for (const a of ALAN) console.log(`${a.padEnd(36)}${olcum.map(([, o]) => String(o[a]).padStart(14)).join("")}`);

const oran = kapidaTutulan.length / gecersiz.length;
console.log(`\ngecersiz istek = ${gecersiz.length}/${istekler.length}, ` +
  `kapida tutulan = ${kapidaTutulan.length}, kapida tutulamayan = ${gecersiz.length - kapidaTutulan.length}`);
console.log(`kapinin tuttugu gecersiz orani = ${oran.toFixed(3)} (${Object.keys(KAPI).length} kapi ` +
  `denetimi, ${Object.keys(UYGULAMA).length} uygulama denetimi)`);

// K01 Kabaca Buyukluk Hesabi: uctaki tepe 513.89, tepe okuma 416.67 istek/s (hesap sinifi)
const UC_TEPE = 513.89, OKUMA_TEPE = 416.67, ONBELLEK_ARKASI = 41.67;
console.log(`\n${"T3".padEnd(6)}${"kapinin arkasina istek/s".padStart(25)}${"okuma/s".padStart(11)}` +
  `${"onbellek arkasi/s".padStart(19)}`);
for (const T3 of [0.08, 0.16]) {                       // T3: uctaki isteklerin gecersiz orani
  const kalan = 1 - T3 * oran;
  console.log(`${T3.toFixed(2).padEnd(6)}${(UC_TEPE * kalan).toFixed(2).padStart(25)}` +
    `${(OKUMA_TEPE * kalan).toFixed(2).padStart(11)}${(ONBELLEK_ARKASI * kalan).toFixed(2).padStart(19)}`);
}
console.log(`kapi yok (T3 = 0.08 icin bile) -> ${UC_TEPE.toFixed(2)} istek/s, ` +
  `${OKUMA_TEPE.toFixed(2)} okuma/s, ${ONBELLEK_ARKASI.toFixed(2)} onbellek arkasi/s`);
olcu                                      kapi yok  kapi bekcisi
uygulamaya ulasan istek                      60/60         40/60
uygulamaya ulasan gecersiz istek                30            10
uygulamaya ulasan govde bayti                51600          4800
guvenilmeyen girdiye dokunan birim               3             1
uygulamanin disa acik adresi                     1             0
dogrulama kodu tasiyan birim                     3             4

gecersiz istek = 30/60, kapida tutulan = 20, kapida tutulamayan = 10
kapinin tuttugu gecersiz orani = 0.667 (4 kapi denetimi, 2 uygulama denetimi)

T3     kapinin arkasina istek/s    okuma/s  onbellek arkasi/s
0.08                     486.48     394.45              39.45
0.16                     459.08     372.23              37.23
kapi yok (T3 = 0.08 icin bile) -> 513.89 istek/s, 416.67 okuma/s, 41.67 onbellek arkasi/s

Sayıların Okunması

Otuz geçersiz isteğin yirmisi kapıda tutuluyor, onu tutulamıyor: oran 0,667. Tutulamayanlar kayıtlı olmayan gönderiyi soran ve başkasının gönderisini isteyen isteklerdir; ikisi de gönderi kaydını okumadan ayırt edilemez. Kapı bekçisi bu yüzden doğrulamayı kaldırmaz, ikiye böler ve dogrulama kodu tasiyan birim sayısı 3’ten 4’e çıkar. Kalıbın adı yanıltıcı olabilir: kapı, uygulamanın kendi doğrulamasının yerine geçmez.

Bayt satırı en büyük farkı veriyor: uygulamaya ulaşan gövde 51.600 bayttan 4.800 bayta iniyor, 0,093 katına. Düşüşün neredeyse tamamı boyutu aşan beş istekten geliyor. Uygulamaya ulaşmayan istek yalnız bir işlem tasarrufu değil, ayrıştırılmayan bir gövdedir.

Son iki satır kalıbın asıl amacını taşıyor. guvenilmeyen girdiye dokunan birim 3’ten 1’e, uygulamanin disa acik adresi 1’den 0’a iniyor. Ham gövdeyi ayrıştıran, biçimini sınayan ve sınırı aşanı reddeden kod tek bir birimde toplanır; uygulama birimleri yalnız kapıdan geçmiş, biçimi bilinen bir istek görür. Bu, üçüncü dersteki güven sınırı sorusunun aynısıdır ve aynı bedeli taşır: kapı atlanabiliyorsa 0/3 koruma varsayımı çöker.

Hesaba Dönüş

Modelin geçersiz oranı (30/60) gerçekçi değildir ve öyle sunulmaz. Gerçek oran bu kursun varsayımıdır (T3 = 0,08: uçtaki isteklerin yüzde sekizi biçimsel olarak geçersizdir). Gerekçesi eski istemci sürümlerinin, süresi dolmuş belirteçlerin ve tarayıcı yeniden denemelerinin sürekli bir taban üretmesidir; K01’in tablosuna eklenmez, çünkü K01 yalnız yanıtlanan isteği sayıyordu. Modelden gelen 0,667 ise varsayım değil, denetim listelerinden çıkan bir orandır.

İkisi birleştiğinde K01’in üç sayısı birden oynuyor. Uçtaki tepe 513,89 istek/s, kapının arkasına 486,48 istek/s olarak geçiyor; tepe okuma 416,67’den 394,45’e, onbellek arkasi okuma/s 41,67’den 39,45’e iniyor. Kapı yokken üçü de değişmiyor. T3 iki katına çıktığında — yüzde on altı geçersiz — sayılar 459,08, 372,23 ve 37,23 oluyor: kazanç T3 ile doğru orantılı büyüyor, çünkü kapının tuttuğu pay sabit.

Sayıların büyüklüğü de okunmalı: yüzde sekiz geçersizin üçte ikisi tutulduğunda uçtaki hız yalnız 0,947 katına iniyor. Kapı bekçisi bir ölçekleme aracı değildir; kazandırdığı asıl sayı üstteki tablodadır — güvenilmeyen girdiye dokunan birim ve uygulamanın dışa açık adresi.

Özet

  • Kapı bekçisi doğrulamayı ayrı bir katmana yalıtır: güvenilmeyen girdiyi yalnız o katman görür, uygulama doğrulanmış isteği alır.
  • Kapıda verilebilen denetim isteğin kendisine bakandır; altmış istekli kümede otuz geçersizin yirmisi kapıda tutuldu, onu tutulamadı (oran 0,667).
  • Doğrulama kaldırılmaz, bölünür: doğrulama kodu taşıyan birim 3’ten 4’e çıkıyor.
  • Uygulamaya ulaşan istek 60/60’tan 40/60’a, gövde 51.600 bayttan 4.800 bayta (0,093 katına) iniyor; düşüşün neredeyse tamamı boyutu aşan isteklerden gelir.
  • Kalıbın asıl kazancı yalıtımdır: güvenilmeyen girdiye dokunan birim 3’ten 1’e, uygulamanın dışa açık adresi 1’den 0’a iniyor.
  • K01’e dönüş (T3 = 0,08 varsayımıyla): uçtaki 513,89 istek/s kapının arkasında 486,48’e, tepe okuma 416,67’den 394,45’e, önbellek arkası okuma 41,67’den 39,45’e iniyor; T3 = 0,16’da sırasıyla 459,08, 372,23 ve 37,23.

Kurs Kapanışı

Kurs, isteğin kullanıcıdan uygulamaya kadarki yolunu durak durak tasarladı ve her durakta aynı üç soruyu sordu: bu durak hangi kararı veriyor, giriş kursunun hesabındaki hangi sayıyı oynatıyor, karşılığında hangi sayı büyüyor. Derslerin bıraktığı ölçüler aşağıdaki tabloda toplanıyor.

Ders Durağın kararı Oynadığı K01 sayısı Karşılığında büyüyen
Alan Adı Sistemi Tasarımı yönlendirme politikası gecikmeye göre 1,171 mesafe birimi (coğrafi 1,710, ağırlıklı 2,144) devralma penceresi 39–905 sn, aylık kesinti bütçesinin %0,50–%14,28’i
İçerik Dağıtım Ağları önbelleğin konumu uygulamaya ulaşan okuma 416,67 → 41,76 istek/s 480 baytlık gövde telde 653 bayt (1,360); depoya ulaşan istek 138,89’da kaldı
İtme ve Çekme Tabanlı Dağıtım içeriğin yayma modeli çekmede kökene 42,34 istek/s — K01’in 41,67’si korunuyor itmede tepe 1.166,64 itme/s, 4,48 Mbit/s ve kenarlarda 6,91 GB
Statik İçerik Barındırma içerik yolunun ayrılması uygulama süreci 3.291,67 → 513,89 istek/s, 241,60 → 1,60 Mbit/s 2.777,78 istek/s ve 240,00 Mbit/s içerik sürecine geçti
Yük Dengeleyici Rolü dağıtım + sağlık denetimi 513,89 istek/s en az 3 kopya; arıza başına düşen istek 102.778 → 34,26 denetimin kendi yükü 15 istek/s, uçtaki yükün %2,9’u
Katman 4 Dengeleme bağlantı düzeyinde dağıtım karar 51,39 karar/s (63 istek için 6) istek sapması 4,00; hedefi tutmak 3 yerine 5 kopya
Katman 7 Dengeleme içerik farkındalıklı yönlendirme istek sapması 4,00 → 1,07, akışlar ayrı havuzlarda karar 51,39 → 513,89 karar/s; 3 yerine 4 kopya
Dengeleme Algoritmaları dağıtım algoritması yer değiştiren anahtar %74,98 → %22,46 ısınmada depoya ulaşan 138,89 → 223,13 istek/s (bölme kalanıyla 420,07)
Yük Dengeleyici ve Ters Vekil rollerin ayrılması kopya listesi düştüğünde içerik yolu 6/6 yanıtlandı durak 2 → 3; tek kopyalı duraklarla aylık kesinti 215,6 → 258,6 dk
Oturum Yapışkanlığı durumun kopyaya bağlanması 0,50 doluluk hedefi için gereken kopya 3 → 4 dengesizlik 1,000 → 1,173; bir kopya düşünce oturumların 33/100’ü ve isteklerin %39,11’i kayboluyor
API Ağ Geçidi kenar sorumluluklarının yeri tekrarlanan satır 135 → 45, sorumluluk başına birim 3 → 1 uçtaki 513,89 istek/s tek bileşende; durak-istek/s 513,89 → 1027,78; geçit durunca 0/3
Ağ Geçidi Yönlendirme ve Toplama tek istekte çoklu çağrı uçtaki istek 833,34 → 416,67 istek/s (×0,50) gövde 405 → 764 bayt; çıkış 1,60 → 2,55 Mbit/s
Ağ Geçidi Yük Boşaltma denetimin kenara taşınması satır 171 → 107; 4/6 denetim kenarda, 513,89 istek/s’de koşuyor korumasız servis 0/3 → 3/3, ya da doğrulama 513,89 → 1027,78 kez/s
Ön Yüz İçin Backend istemciye özel gövde kullanılmayan alan 37 → 0; 583,34 → 416,67 istek/s, 3,56 → 1,90 Mbit/s kenar birimi 1 → 3; servisin sunması gereken toplu uç 0 → 2
Elçi ve Yan Araba Kalıpları ortak işin ayrı sürece verilmesi servisin gördüğü sözleşme 1 (dış 2); kullanabilen birim 4/6 → 6/6 toplam süreç 6 → 12; durak-istek/s 1027,78 → 1541,67
Kapı Bekçisi Kalıbı doğrulamanın yalıtılması kapının arkasına 513,89 → 486,48 istek/s; okuma 416,67 → 394,45 doğrulama kodu taşıyan birim 3 → 4; kapıda tutulamayan geçersiz 10/30

Tablonun kuralı adıyla anılmalı: her durak, giriş kursunun varsayım tablosundan çıkan hesaplara geri bağlandı. Kenarda alınan bir kararın ölçüsü üç sayıdan biridir — uygulamaya ulaşan istek, sınırdan geçen bayt ve bir birim düştüğünde yanıtlanan istek oranı. Bu üçünden birine bağlanmayan bir kenar kararı, savunulabilir bir karar değildir; sağ kolonun hiçbir satırda boş olmaması da bunun öteki yarısıdır. Kursun eklediği üç varsayım (takip sayfasının ücreti de istemesi, istemci karışımı, geçersiz istek oranı) K01’in tablosuna karışmadı; kendi adlarıyla, gerekçeleriyle ve duyarlılıklarıyla yazıldı.

Kursun bıraktığı soru bir katman ileridedir. İstek artık uygulamaya ulaştı: adı çözüldü, kenar önbelleğinden geçti, bir kopyaya düştü, ağ geçidinden ve kapıdan geçti. Ama uygulamanın kendi içindeki servis etkileşimi tasarlanmadı — servislerin durumsuz olup olmadığı, birbirlerinin adresini nasıl buldukları, bir çağrı yanıt vermediğinde ne kadar bekleyip kaç kez deneyecekleri ve birden çok servise yayılan bir iş akışının koreografiyle mi orkestrasyonla mı kurulacağı. Bu kursun ağ geçidi, iki servisi paralel çağırıp yanıtlarını birleştirirken bu soruların hepsine sessizce bir yanıt varsaydı. Sonraki kurs Uygulama Katmanı ve Servis Etkileşimi o varsayımları açar.

İ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