Ders 06 / 16
Servis Ağı
Aynı trafik kurallarının uygulama kodunda ve yan araba vekilinde uygulanmasının karşılaştırılması: kural değişikliğinde dokunulan servis sayısı ve yıllık iş kalemi, gerçek bir yan araba atlamasının ölçülmesi, her isteğe eklenen atlama ile gecikme, yan arabaların bellek ve çekirdek tüketimi, getirdikleri yeni yüzey kalemi ve üç servisli bir sistemde bedelin kazançtan büyük olduğu başabaş noktası.
İçindekiler
Önceki ders trafiğe kenarda ve kaynakta iki kural koydu. İkisi de isteğin yolunda durdu ve dışarıdan gelen trafiğe uygulandı.
Servisler birbirine de istek gönderir. Kurgu ölçüm ağında doğrulayıcı faturalamaya, faturalama iş emrine, iş emri bildirim geçidine bağlanır ve bu trafiğin hiçbiri kenar vekilden geçmez. Bu çağrıların da kuralları vardır: zaman aşımı kaç saniye, kaç kez yeniden denenir, hangi servis hangisini çağırabilir, çağrı şifreli mi taşınır.
Bu kurallar iki yere konabilir. Uygulama kodunda: her servis kendi istemcisini yapılandırır. Yan araba vekilinde: her servis örneğinin yanına bir vekil konur, bütün giden ve gelen trafik o vekilden geçer, kurallar vekile yazılır. İkinci yerleşimin adı servis ağıdır.
Bu ders iki yerleşimi aynı kural değişikliği üzerinde karşılaştırır ve tek soruyu sorar: yan arabanın kazandırdığı, ödettiğinden büyük mü.
- WS31. Her servisin iki örneği vardır ve her örneğe bir yan araba düşer.
- WS32. “İş kalemi” kurgu bir birimdir: bir değişiklik, bir gözden geçirme ya da bir yayın. Kod yerleşiminde bir kural değişikliği servis başına üç iş kalemi, ağ yerleşiminde toplam iki iş kalemi tutar.
- WS33. Ağ yerleşiminin yıllık sabit bedeli kırk iş kalemidir (denetim düzlemi) ve her yan araba örneği yılda iki iş kalemi ekler (sürüm yükseltme, kimlik dönüşü). Yılda altı trafik kuralı değişir.
- WS34. Bir yan araba örneği altmış dört megabayt bellek ve onda bir çekirdek tüketir; bir
atlamanın eklediği gecikme kurguda kırk mikrosaniyenin on katı, yani
0,4milisaniyedir. - WS35. Gerçek ölçüm bloğu süre basmaz: beklenen atlama ve bağlantı sayısı girdiden
türetilerek yazılır, ölçülen ek gecikme yalnız sıfır ile elli milisaniye arasında olup
olmadığına bakılarak
evetya dahayiryazılır. - WS36. Yeni yüzey kalemi sayımı şudur: her yan araba örneği için bir yönetim ucu ve bir kimlik, artı denetim düzlemi ile kural deposu.
Bir Atlamanın Kendisi
Yan arabanın her isteğe eklediği şey önce bir atlamadır. Aşağıdaki blok bunu modellemez, gerçekten koşar: bir uygulama sunucusu ve önüne konan bir yan araba vekili kurulur, iki yol da aynı sayıda istekle sınanır.
// yanaraba/atlama.mjs — gercek olcum: yan araba vekilinin bir istege ekledigi atlama. // Sunucular bu dosyada kurulur, olcum bitince kapatilir. Ham sure ciktiya basilmaz: // beklenen degerler girdiden turetilir, olculen ek gecikme yalniz bant denetiminden gecer. import { createServer, request } from "node:http"; const ISTEK = 200, ISINMA = 50, BANT = [0, 50]; // bant: milisaniye const UYG = 8951, YAN = 8950; const uygulama = createServer((i, y) => { y.sendDate = false; y.end("olcum"); }).listen(UYG, "127.0.0.1"); const yanAraba = createServer((di, dy) => { // tek isi: istegi bir atlama oteye tasimak dy.sendDate = false; const ii = request({ port: UYG, path: di.url, method: di.method, headers: di.headers }, (iy) => { dy.writeHead(iy.statusCode, iy.headers); iy.pipe(dy); }); ii.on("error", () => dy.writeHead(502).end("kesildi")); di.pipe(ii); }).listen(YAN, "127.0.0.1"); const cagir = (port) => new Promise((coz) => { request({ port, path: "/olcum", agent: false }, (y) => { y.resume(); y.on("end", coz); }).end(); }); async function olc(port, n) { // istek basina ms const b = process.hrtime.bigint(); for (let i = 0; i < n; i += 1) await cagir(port); return Number(process.hrtime.bigint() - b) / 1e6 / n; } await olc(UYG, ISINMA); await olc(YAN, ISINMA); // isinma: iki yol da bir kez kosar const ek = (await olc(YAN, ISTEK)) - (await olc(UYG, ISTEK)); uygulama.close(); yanAraba.close(); console.log(`istek / yol ${ISTEK}`); console.log(`beklenen atlama dogrudan 1, yan arabali 2 (fark 1)`); console.log(`beklenen baglanti / istek dogrudan 1, yan arabali 2 (fark 1)`); console.log(`ek gecikme ${BANT[0]}-${BANT[1]} ms bandinda ${ek >= BANT[0] && ek <= BANT[1] ? "evet" : "hayir"}`);
istek / yol 200 beklenen atlama dogrudan 1, yan arabali 2 (fark 1) beklenen baglanti / istek dogrudan 1, yan arabali 2 (fark 1) ek gecikme 0-50 ms bandinda evet
Ölçülen süre çıktıya girmez, çünkü makineden makineye değişir ve karşılaştırılamaz. Girdiden türeyen iki sayı değişmez: yan arabalı yolda her istek iki atlama ve iki bağlantı harcar, doğrudan yolda bir. Bu, tek yönlü bir çağrı içindir; iki servis arasındaki bir çağrıda her iki uçta da yan araba durduğu için atlama sayısı ikiye çıkar.
Kural Değiştiğinde Dokunulan
İkinci blok yerleşimlerin defterini tutuyor.
// yanaraba/bedel.mjs — model: ayni trafik kurallarinin iki yerde uygulanmasi. "Is kalemi" // kurgu bir birimdir (bir degisiklik, bir gozden gecirme, bir yayin); butun sayilar // asagidaki sabitlerden turer. Urun yoktur, yerlesim vardir. const ORNEK = 2; // her servisin ornek sayisi const KOD_KALEM = 3; // kod yerlesiminde servis basina: degisiklik + gozden gecirme + yayin const AG_KALEM = 2; // ag yerlesiminde kural basina toplam: yapilandirma + dagitim denetimi const DENETIM = 40; // denetim duzleminin yillik sabit is kalemi const YAN_BAKIM = 2; // yan araba ornegi basina yillik: surum yukseltme + kimlik donusu const KURAL = 6; // yilda degistirilen trafik kurali sayisi const ATLAMA_MS = 0.4; // kurgu: bir yan araba atlamasinin ekledigi gecikme const BELLEK = 64, CEKIRDEK = 0.1; // yan araba ornegi basina const SERVIS = [3, 5, 8, 20, 40]; const kodIs = (n) => KURAL * n * KOD_KALEM; const agIs = (n) => KURAL * AG_KALEM + DENETIM + n * ORNEK * YAN_BAKIM; const E = [8, 8, 17, 14, 15, 13, 12, 11, 10]; const yaz = (h) => h.map((d, i) => String(d)[i ? "padStart" : "padEnd"](E[i])).join(""); console.log(yaz(["servis", "ornek", "kodda dokunulan", "kodda is/yil", "agda dokunulan", "agda is/yil", "ag sabiti", "ag is/yil", "kazanan"])); for (const n of SERVIS) console.log(yaz([n, n * ORNEK, n, kodIs(n), 0, KURAL * AG_KALEM, DENETIM + n * ORNEK * YAN_BAKIM, agIs(n), kodIs(n) < agIs(n) ? "kod" : "ag"])); const basabas = [...Array(60).keys()].map((i) => i + 1).find((n) => kodIs(n) >= agIs(n)); console.log(`basabas servis sayisi: ${basabas} (bu sayinin altinda kod yerlesimi ucuzdur)`); // Istek basina bedel ve yan arabanin getirdigi yeni yuzey. const P = [8, 16, 12, 18, 16, 12, 20]; const yaz2 = (h) => h.map((d, i) => String(d)[i ? "padStart" : "padEnd"](P[i])).join(""); console.log("\n" + yaz2(["servis", "ic cagri/istek", "ek atlama", "ek gecikme(ms)", "yan araba MB", "cekirdek", "yeni yuzey kalemi"])); for (const n of SERVIS) { const cagri = Math.min(n - 1, 4), atlama = 2 * (cagri + 1), ornek = n * ORNEK; console.log(yaz2([n, cagri, atlama, (atlama * ATLAMA_MS).toFixed(1), ornek * BELLEK, (ornek * CEKIRDEK).toFixed(1), ornek * 2 + 2])); }
servis ornek kodda dokunulan kodda is/yil agda dokunulan agda is/yil ag sabiti ag is/yil kazanan 3 6 3 54 0 12 52 64 kod 5 10 5 90 0 12 60 72 ag 8 16 8 144 0 12 72 84 ag 20 40 20 360 0 12 120 132 ag 40 80 40 720 0 12 200 212 ag basabas servis sayisi: 4 (bu sayinin altinda kod yerlesimi ucuzdur) servis ic cagri/istek ek atlama ek gecikme(ms) yan araba MB cekirdek yeni yuzey kalemi 3 2 6 2.4 384 0.6 14 5 4 10 4.0 640 1.0 22 8 4 10 4.0 1024 1.6 34 20 4 10 4.0 2560 4.0 82 40 4 10 4.0 5120 8.0 162
Dokunulan Servis Sayısı
Birinci tablonun asıl sütunu üçüncüsüdür. Bir trafik kuralı — diyelim zaman aşımı beş saniyeden iki saniyeye indirilecek — kod yerleşiminde her servise ayrı ayrı dokunur. Üç servisli sistemde üç, kırk servisli sistemde kırk. Her dokunuş bir değişiklik, bir gözden geçirme ve bir yayındır; kırk servislik bir sistemde tek bir kural değişikliği yüz yirmi iş kalemi eder ve yayınlar birbirinden bağımsız olduğu için kuralın her yerde aynı anda geçerli olduğu bir an yoktur.
Ağ yerleşiminde dokunulan servis sayısı sıfırdır. Kural bir kez yazılır, yan arabalara dağıtılır ve uygulama kodu değişmez. Kural değişikliği başına iki iş kalemi, servis sayısından bağımsızdır. Kırk servisli sistemde yıllık yedi yüz yirmi iş kalemi, iki yüz on ikiye iner.
Bu tek sütuna bakıldığında servis ağı her ölçekte kazanır. Öteki sütunlar bunu bozar.
Üç Servis: Bedel Kazançtan Büyük
İlk satır ölçünün kırıldığı yerdir. Üç servisli sistemde kod yerleşimi yılda elli dört iş kalemi, ağ yerleşimi altmış dört. Ağ daha pahalıdır ve nedeni sabit bedeldir: denetim düzleminin kırk iş kalemi, üç servisin toplam kural değişikliği maliyetinden büyüktür.
Başabaş servis sayısı dörttür. Bunun altında kural değişikliğinden kazanılan iş, denetim düzleminin bakımından azdır.
İkinci tablo aynı satırı öteki yönden okuyor. Üç servisli sistemde yan arabalar üç yüz seksen dört megabayt bellek ve altıda üç çekirdek tüketiyor, her isteğe altı atlama ve iki virgül dört milisaniye ekliyor ve on dört yeni yüzey kalemi getiriyor. Bu üç bedelin hiçbiri iş kalemi defterinde görünmez.
Servis ağının kazandırmadığı durum budur ve nadir değildir: üç servisli sistemler çoğunluktadır. Kararın “servis ağı iyi bir uygulamadır” cümlesiyle verildiği yerlerde ödenen bedel, kazanılan altı iş kaleminin karşılığı değil, eksi on iş kalemi artı on dört yüzey kalemidir.
Merkezî Kuralın Yanlış Kapattığı
agda dokunulan sütunundaki sıfır bir koşula bağlıdır: kuralın her servise aynı biçimde
uyması. Bu koşul çoğu kuralda tutmaz.
Zaman aşımını iki saniyeye indiren kural otuz sekiz servis için doğrudur; gecelik toplu işi çağıran servis için değildir, çünkü o çağrı zaten yavaştır. Merkezde tek satırla yazılan kural, o servisin bütün çağrılarını iki saniyede keser. Kod yerleşiminde bu sorun doğmaz — kural zaten her serviste ayrı yazılıdır ve o servis kendi değerini korur. Merkezî yerleşimde çözüm bir istisnadır ve istisna, kuralın kendisi kadar iş kalemi tutar: modelin sabitlerine göre her istisna yılda iki iş kalemi, tıpkı bir kural gibi.
Bu, kursun “yanlış kapatma” sütununun servis ağındaki karşılığıdır. Kural değişikliğinde dokunulan servis sayısını sıfıra indiren adım, kuralın hangi servise ne kadar uyduğu sorusunu ortadan kaldırmaz; o soruyu kod tabanından yapılandırma dosyasına taşır ve orada görünürlüğü azalır. Bir servisin kendi istisnasına kendi kodunda sahip olması bir gözden geçirmede görülür; merkezî kural kümesindeki bir istisna, kümeyi okuyan kişinin dikkatine bağlıdır.
Sayı olarak sonuç şudur: istisna sayısı arttıkça ağ tarafının yıllık iş kalemi kural sayısı gibi büyür ve başabaş servis sayısı dörtten yukarı kayar. On istisnalı bir sistemde ağ tarafı yılda yirmi iş kalemi daha eder ve başabaş noktası altı servise çıkar.
İstek Başına Ödenen
İkinci tablonun ortası ölçek büyüdükçe doymuyor. İç çağrı sayısı dörtte duruyor — zincir uzunluğu servis sayısıyla sınırsız artmaz — ve ek atlama onda, ek gecikme dört milisaniyede sabitleniyor. Bu, servis ağının iyi haberidir: istek başına bedel ölçekle büyümüyor.
Dört milisaniye küçük görünür. Ölçüm ağının gecelik toplu işi her koşumda yüz binlerce iç çağrı yapar ve orada dört milisaniye saatlere döner. Kenar önbelleğinden geçen bir pano isteğinde ise hiç görünmez. Ek gecikmenin anlamı çağrı sayısıyla belirlenir, sayının kendisiyle değil.
Kaynak tüketimi ise ölçekle doğrusal büyüyor. Kırk servisli sistemde yan arabalar beş gigabayt bellek ve sekiz çekirdek tutuyor. Bu, sekiz uygulama örneğinin kaynağıdır; servis ağı çalışması için sistemin yüzde on beş ila yirmisi kadar bir donanımı kendine ayırır ve bu satır hiçbir kural tartışmasında geçmez.
Yan Arabanın Kendi Yüzeyi
Son sütun kursun ölçü birimidir. Her yan araba örneği iki kalem getirir.
Birincisi yönetim ucudur. Yan araba yapılandırmasını gösterir, ölçümlerini döker, kendini yeniden yükler. Bu uç uygulamanın yanında, aynı ağ ad alanında dinler; ilk dersin saydığı “yönetim ucu” kalemi artık makine başına değil, örnek başına vardır. Kırk servisli sistemde seksen yönetim ucu.
İkincisi kimliktir. Yan arabalar birbirine şifreli konuşur ve her birinin bir sertifikası olur. Bu, üçüncü dersin “uygulamada sonlandırma” satırının en uç hâlidir: sertifika artık altı değil, seksen yerde durur. Dördüncü dersin otomasyonu burada zorunlu hâle gelir — seksen sertifikayı elle yenilemek dokuz kalemde değil, seksen kalemde unutulur.
Üçüncüsü tek kalemdir ve en ağırıdır: denetim düzlemi. Bütün yan arabaların kuralını dağıtan bileşen, her servise yazma yetkisi olan tek bir yerdir. Kural deposuyla birlikte iki kalem eder ve ikisi de kapatılamaz — servis ağının varlık nedeni onlardır.
On dört kalemden kırk servisli sistemde yüz altmış ikiye çıkan bu sayım, ilk dersin tek bir makinede saydığı on yedi kalemin yanına konmalıdır. Servis ağı trafik kurallarını tek yere topladı ve yönetim uçlarını her yere dağıttı.
Özet
- Kural değişikliğinde kod yerleşimi her servise dokunur (üç servis üç, kırk servis kırk), ağ yerleşimi hiçbirine; kırk servislik sistemde yıllık iş kalemi yedi yüz yirmiden iki yüz on ikiye iner.
- Gerçek ölçüm yan arabalı yolun her isteğe bir atlama ve bir bağlantı eklediğini doğruladı; ölçülen ek gecikme sıfır ile elli milisaniye bandının içinde kaldı ve ham süre basılmadı.
- Üç servisli sistemde ağ yerleşimi kod yerleşiminden pahalıdır: altmış dörde karşı elli dört iş kalemi. Başabaş servis sayısı dörttür ve denetim düzleminin sabit kırk iş kalemi bu eşiği belirler.
- İstek başına bedel ölçekle doymuyor — on atlama, dört milisaniye — ama kaynak tüketimi doğrusal büyüyor: kırk serviste beş gigabayt bellek ve sekiz çekirdek.
- Yan araba her örneğe iki yüzey kalemi ekler (yönetim ucu ve kimlik); üç serviste on dört, kırk serviste yüz altmış iki kalem. Denetim düzlemi ile kural deposu kapatılamaz kalemlerdir.
Sonraki Adım
Bu konu isteğin yolunu baştan sona kurdu. Yol üç rolden geçiyor, vekil zincirinden geçerken kaybolan dört bilgi aktarılıyor, şifre bir noktada sonlanıyor ve sertifikası kendini tazeliyor, yanıt iki katmanda saklanıyor ve servisler arası trafik tek bir kural kümesine bağlanıyor. Bütün bu ölçümler bir şeyi verili aldı.
İstemci bir yere bağlandı. Bağlandığı yerin bir adı vardı ve o ad bir adrese çözüldü.
İkinci derste olcum.ornek.gecersiz diye bir ad kullanıldı, üçüncü derste sertifika o ad için
düzenlendi sayıldı, beşinci derste bir kenar düğümüne düşen istemcinin oraya nasıl düştüğü hiç
sorulmadı. Adın kendisi, o adın hangi adresi gösterdiği, değiştiğinde eskisinin ne kadar süre
geçerli kaldığı ve o adı kimin adına kaydettiği bu konuda bir kez bile ölçülmedi. Sonraki konu
adın kendisini ele alır: kayıt kümesinin varsayılan hâli, yaşam süresinin bir karar olarak
sonuçları ve adı taşıyan kaydın kime ait olduğu.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.