Ders 01 / 16
Web Sunucusu Rolleri
Statik sunum, ters vekil ve yük dağıtımı rollerinin varsayılan kurulumdan sonra açık bıraktığı yüzey: on sekiz kalemin rol rol sayımı, üç rolü tek süreçte birleştirmenin on dört benzersiz kalemi on yediye çıkarması ve dış kapıdan erişilebilir kalem sayısını ondan on yediye taşıması, dört sertleştirme adımının kapattığı on üç kaleme karşılık durdurduğu dört meşru iş ve geriye kalan dört kapatılamayan kalem.
İçindekiler
Önceki kurs sistemi görünür yaptı: ölçüm noktaları kondu, kayıtlar bir yerde toplandı, uyarılar bir nöbetçiye ulaştı, olayın kim tarafından nasıl kapatıldığı yazıldı. Görünürlük kurulunca görülen şey de değişti — panolar uygulamanın davranışını gösteriyor, ama uygulamanın üstünde durduğu makine hakkında hiçbir şey söylemiyor.
O makine bir gün kuruldu ve kurulduğu gün ne verildiyse onunla duruyor. Paket açıldı, süreç başlatıldı, istekler akmaya başladı ve iş görünce kimse bir daha bakmadı. Bu ders o bakışı bir sayıya çevirir: kurulumdan sonra hiçbir şey yapılmadığında kaç kalem açık kalır.
Ölçü birimi açık yüzey kalemidir. Bir kalem, dışarıdan ya da içeriden erişilebilen tek bir şeydir: dinlenen bir kapı, sunulan bir yol, yanıtta görünen bir bilgi, kimlik sorulmayan bir yönetim ucu. Kalem sayısı bir güvenlik notu değildir; bir sayımdır ve sayım yapılmadan hiçbir sertleştirme adımı savunulamaz.
Üç Rol Ayrı Ayrı
Bir web sunucusu üç işten birini ya da üçünü birden yapar.
Statik sunum diskteki dosyayı isteğe karşılık verir. Girdi bir yol, çıktı bir dosyadır; arada uygulama kodu yoktur. Ters vekil isteği alır, kendi bir şey üretmez ve arkadaki bir yukarı akışa iletir; yanıtı geri taşır. Yük dağıtımı aynı işi birden çok yukarı akış üyesi arasında böler; hangi üyenin ayakta olduğunu izler ve düşeni havuzdan çıkarır. Üç rolün de ne olduğu daha önce kurulmuştu; bu ders rolleri yeniden tanımlamaz, kurulum sonrası bıraktıkları kalemi sayar.
Sayım kurgu bir sistem üzerinde yapılır: bölgesel bir su sayacı ölçüm ağı. Saha ekipleri el terminalleriyle sayaç okur, bir toplayıcı okumaları alır, bir doğrulayıcı denetler, faturalama ve iş emri servisleri devralır. Üç ortam vardır ve gecelik bir toplu iş koşar. Sistem de sayılar da kurgudur; ölçülen, sayıların birbirine oranıdır.
- WS1. Kalem listesi bir ürünün varsayılan yapılandırma dosyasından okunmaz; kurulum sonrası tipik olarak açık kalan şeylerin kurgu bir listesidir. Ölçülen liste değil, listeden çıkan orandır.
- WS2. Bir kalem “dış” ise genel kapıdan, “iç” ise yalnız iç ağdan erişilir. Ayrı süreçlerde bu ayrım süreç sınırıyla korunur.
- WS3. Meşru iş akışı, bir kalem kapandığında duran gerçek bir işi temsil eder; altı akış vardır ve her biri tek bir kaleme yaslanır.
- WS4. Paylaşım anahtarı aynı olan kalemler birleştirmede tek kaleme iner: üç rolün de dinlediği şifresiz kapı tek kapıdır, üçünün de bastığı sürüm başlığı tek başlıktır.
// roller/yuzey.mjs — model: uc web sunucusu rolunun varsayilan kurulumundan sonra acik // kalan yuzey kalemleri. Gercek bir urunun varsayilan dosyasi degil, kurgu olcum aginin // kurulum sonrasi kalem listesidir; butun sayilar bu listeden turetilir. // [rol, kalem, tur, erisim, paylasim anahtari] const KALEM = [ ["statik", "sifresiz-kapi", "dinlenen kapi", "dis", "kapi-80"], ["statik", "varlik-kok", "sunulan yol", "dis", null], ["statik", "dizin-listesi", "sunulan yol", "dis", null], ["statik", "yedek-dosyalar", "sunulan yol", "dis", null], ["statik", "ornek-sayfa", "sunulan yol", "dis", null], ["statik", "surum-basligi", "gorunen bilgi", "dis", "surum"], ["vekil", "sifresiz-kapi", "dinlenen kapi", "dis", "kapi-80"], ["vekil", "sifreli-kapi", "dinlenen kapi", "dis", null], ["vekil", "yukari-akis-kapisi", "dinlenen kapi", "ic", null], ["vekil", "surum-basligi", "gorunen bilgi", "dis", "surum"], ["vekil", "hata-sayfasi-izi", "gorunen bilgi", "dis", null], ["vekil", "vekil-durum-ucu", "yonetim ucu", "ic", null], ["dagitim", "sifresiz-kapi", "dinlenen kapi", "dis", "kapi-80"], ["dagitim", "surum-basligi", "gorunen bilgi", "dis", "surum"], ["dagitim", "uye-adresi-basligi", "gorunen bilgi", "dis", null], ["dagitim", "oturum-cerezi-uye", "gorunen bilgi", "dis", null], ["dagitim", "saglik-ucu", "yonetim ucu", "ic", null], ["dagitim", "uye-yonetim-ucu", "yonetim ucu", "ic", null], ]; // Tek surecte birlestirmenin dogurdugu, hicbir rolde tek basina bulunmayan kalemler. const BIRLESME = [ ["birlesik", "capraz-kok", "sunulan yol", "dis"], ["birlesik", "ortak-yonetim-kapisi", "yonetim ucu", "dis"], ["birlesik", "tek-surec-kimligi", "birlesik yetki","dis"], ]; // Mesru is akislari: her akis hangi kaleme yaslaniyor. const AKIS = [ ["el-terminali-okuma", "statik/sifresiz-kapi"], ["saha-varlik-sunumu", "statik/varlik-kok"], ["toplayici-yuklemesi", "vekil/sifreli-kapi"], ["nobetci-saglik-cagrisi","dagitim/saglik-ucu"], ["dagitim-akisi", "dagitim/uye-yonetim-ucu"], ["oturum-yapiskanligi", "dagitim/oturum-cerezi-uye"], ]; const kimlik = (r, k) => `${r}/${k}`; const roller = ["statik", "vekil", "dagitim"]; const EN = [10, 7, 10, 9, 9, 9, 6, 5]; const satir = (h) => h.map((d, i) => String(d)[i ? "padStart" : "padEnd"](EN[i])).join(""); const olc = (s) => [s.length, ...["dinlenen kapi", "sunulan yol", "gorunen bilgi", "yonetim ucu"] .map((t) => s.filter((x) => x[2] === t).length), s.filter((x) => x[3] === "dis").length, s.filter((x) => x[3] === "ic").length]; console.log(satir(["rol", "kalem", "dinlenen", "sunulan", "gorunen", "yonetim", "dis", "ic"])); for (const rol of roller) console.log(satir([rol, ...olc(KALEM.filter((x) => x[0] === rol))])); console.log(satir(["toplam", ...olc(KALEM)])); // Birlestirme: paylasim anahtari ayni olan kalemler tek kaleme iner. const gorulen = new Set(); const tekil = []; for (const [rol, kalem, tur, erisim, pay] of KALEM) { const anahtar = pay ?? kimlik(rol, kalem); if (gorulen.has(anahtar)) continue; gorulen.add(anahtar); tekil.push([rol, kalem, tur, erisim, pay]); } const birlesik = [...tekil.map((x) => [...x]), ...BIRLESME.map((x) => [...x, null])]; console.log(`\nayri uc surec: ${KALEM.length} kalem -> ${tekil.length} benzersiz` + ` (dis ${tekil.filter((x) => x[3] === "dis").length}, ic ${tekil.filter((x) => x[3] === "ic").length})`); // Tek surec tek dinleyiciyle koser: "ic" isaretli kalem de genel kapidan erisilir. for (const k of birlesik) k[3] = "dis"; console.log(`tek surec: ${tekil.length} + ${BIRLESME.length} dogan = ${birlesik.length} kalem` + ` (dis ${birlesik.length}, ic 0)`); // Sertlestirme adimlari: her adim bir yuklem, kapattigi kalem ve getirdigi yeni kalem. const ADIM = [ ["gorunen bilgiyi kapat", (x) => x[2] === "gorunen bilgi", []], ["sunulan yolu daralt", (x) => x[2] === "sunulan yol" && x[1] !== "varlik-kok", [["izin-listesi-dosyasi", "bakim yuzeyi"]]], ["yonetim ucunu dis kapidan al", (x) => x[2] === "yonetim ucu", [["ayri-yonetim-dinleyicisi", "dinlenen kapi"], ["yonetim-kimligi", "sir"]]], ["sifresiz kapiyi kapat", (x) => x[1] === "sifresiz-kapi", []], ]; let acik = birlesik.map((x) => [...x]); const yeni = []; console.log("\nadim kapatilan yanlis kapatilan yeni yuzey kalan acik"); for (const [ad, yuklem, getirdigi] of ADIM) { const dusen = acik.filter(yuklem); acik = acik.filter((x) => yuklem(x) === false); const bozulan = AKIS.filter(([, k]) => dusen.some((d) => kimlik(d[0], d[1]) === k)); yeni.push(...getirdigi); console.log(ad.padEnd(32) + String(dusen.length).padStart(9) + String(bozulan.length).padStart(18) + String(getirdigi.length).padStart(12) + String(acik.length + yeni.length).padStart(12) + (bozulan.length ? ` ${bozulan.map((b) => b[0]).join(", ")}` : "")); } console.log(`\nkapatilamayan kalem (${acik.length}): ${acik.map((x) => x[1]).join(", ")}`); console.log(`kapatmanin getirdigi (${yeni.length}): ${yeni.map((x) => x[0]).join(", ")}`);
rol kalem dinlenen sunulan gorunen yonetim dis ic statik 6 1 4 1 0 6 0 vekil 6 3 0 2 1 4 2 dagitim 6 1 0 3 2 4 2 toplam 18 5 4 6 3 14 4 ayri uc surec: 18 kalem -> 14 benzersiz (dis 10, ic 4) tek surec: 14 + 3 dogan = 17 kalem (dis 17, ic 0) adim kapatilan yanlis kapatilan yeni yuzey kalan acik gorunen bilgiyi kapat 4 1 0 13 oturum-yapiskanligi sunulan yolu daralt 4 0 1 10 yonetim ucunu dis kapidan al 4 2 2 8 nobetci-saglik-cagrisi, dagitim-akisi sifresiz kapiyi kapat 1 1 0 7 el-terminali-okuma kapatilamayan kalem (4): varlik-kok, sifreli-kapi, yukari-akis-kapisi, tek-surec-kimligi kapatmanin getirdigi (3): izin-listesi-dosyasi, ayri-yonetim-dinleyicisi, yonetim-kimligi
Sayım belirlenimlidir: liste sabittir, rastgelelik yoktur, süre ölçülmez.
Rolün Kendi Yüzeyi
İlk tablo üç rolü yan yana koyuyor. Üçünün de kalem sayısı altı, ama kalemlerin türü farklı.
Statik sunumun altı kaleminin dördü sunulan yoldur ve tek bir ayara bağlıdır: kök dizin. Kök dizinde ne varsa sunulur. Varlık kökü meşrudur — saha ekiplerinin tarayıcısı oradan beslenir. Dizin listesi, kurulumla gelen örnek sayfa ve kökün içine bir gün bırakılmış yapılandırma yedeği ise kimsenin karar vermediği şeylerdir. Statik rolün bütün altı kalemi dıştan erişilebilir: bu rolün iç yüzeyi yoktur, çünkü kendine ait bir yönetim ucu yoktur.
Ters vekilin altı kaleminin üçü dinlenen kapıdır ve burada bir ayrıntı önemlidir: üçüncü kapı yukarı akışın kendi kapısıdır. Vekil kurulurken arkadaki uygulama bir kapıda dinlemeye başlar ve o kapı çoğu kurulumda makinenin bütün arayüzlerine bağlanır. Vekil bir kapı açmaz; vekilin varlığı arkasında ikinci bir kapı açar ve o kapıya vekile uğramadan da gidilebilir. Vekilin bütün ayarları, arkadaki kapıya doğrudan gelen bir isteği hiç görmez.
Yük dağıtımının altı kaleminin üçü görünen bilgidir ve üçü de havuzun iç yapısını dışarıya taşır: yanıt başlığındaki üye adresi, oturum çerezindeki üye kimliği, sağlık ucunun döktüğü üye listesi. Bu rol iç yapıyı görünür kılmak için kurulur — hangi üyenin cevap verdiğini bilmek sorun ararken gereklidir — ve aynı görünürlük dışarıya da açıktır.
Üç rolün toplamı on sekiz kalem: beş dinlenen kapı, dört sunulan yol, altı görünen bilgi, üç yönetim ucu. On dördü dış, dördü iç.
Dağılımdaki asimetri bir şey söylüyor. Statik rolde yüzey dosya sisteminde duruyor: kalemi kapatmak bir dizinin içeriğine karar vermektir. Vekil rolünde yüzey ağ topolojisinde duruyor: kalemi kapatmak bir kapının hangi arayüze bağlandığına karar vermektir. Dağıtım rolünde yüzey yanıtın kendisinde duruyor: kalemi kapatmak bir başlığı ya da çerezi çıkarmaktır. Üç rol için tek bir sertleştirme yordamı yazılamamasının nedeni budur; sayı eşit olsa da kapatma işi üç ayrı yerde yapılır.
Birleştirmenin Yaptığı
İkinci ölçüm üç rolü tek sürece koyuyor. Bu, bir makinede en sık görülen düzendir: aynı süreç hem statik dosyayı sunar, hem isteği arkaya iletir, hem üyeler arasında böler.
Birleştirme önce bir azalma üretir. Üç rolün de dinlediği şifresiz kapı tek kapıya iner, üç rolün de bastığı sürüm başlığı tek başlığa iner. On sekiz kalem on dört benzersiz kaleme düşer. Kalem sayısına bakan biri burada durup birleştirmenin yüzeyi daralttığını söyleyebilir.
İki şey bu okumayı bozar.
Birincisi, birleştirme kendi kalemlerini doğurur. Statik kök artık vekilin genel kapısından da erişilebilir; ayrı süreçlerde bu iki yol arasında bir sınır vardı, tek süreçte yoktur. Üç rolün yönetim uçları tek dinleyicide toplanır. Tek süreç üç rolün izinlerini birden taşır: aynı kimlik hem statik kökü okur, hem yukarı akışa bağlanır, hem havuz üyeliğini değiştirir. Üç yeni kalem, on dördü on yediye çıkarır.
İkincisi ve daha ağırı, erişim damgası düşer. Ayrı üç süreçte on dört kalemin onu dıştan erişilebilirdi; dördü — iki yönetim ucu, sağlık ucu ve yukarı akış kapısı — süreç sınırının arkasındaydı. Tek süreç tek dinleyiciyle koşar ve o dinleyici genel kapıdır. On yedi kalemin on yedisi dıştan erişilebilir hâle gelir.
Birleştirmenin ölçüsü budur: kalem sayısı on sekizden on yediye düşerken dıştan erişilebilir kalem sayısı ondan on yediye çıkar. Sayım kalem üzerinden yapıldığında birleştirme iyi görünür; erişim üzerinden yapıldığında yüzey yüzde yetmiş büyümüştür.
Dört Adım ve Durdurduğu İş
Üçüncü tablo on yedi kalemli yüzeye dört sertleştirme adımı uyguluyor. Her adım iki sayı üretir: kaç kalem kapandı ve kaç meşru iş durdu.
İlk adım görünen bilgiyi kapatıyor: sürüm başlığı, hata sayfasının izi, üye adresi başlığı ve üye çerezi. Dört kalem kapanıyor ve bir iş duruyor — oturum yapışkanlığı. Saha ekibinin çok adımlı okuma formu, ilk adımı hangi üye karşıladıysa sonraki adımların da o üyeye gitmesine yaslanıyordu ve bunu üye çerezinden okuyordu. Çerez gidince form ikinci adımda başka bir üyeye düşüyor. Bu adım “sızdırılan bilgiyi kapat” başlığıyla savunulur ve savunma eksiktir: kapattığı dördüncü kalem bilgi sızıntısı değil, taşıma düzeneğiydi.
İkinci adım sunulan yolu daraltıyor: dizin listesi, yedek dosyalar, örnek sayfa ve birleşmenin doğurduğu çapraz kök. Dört kalem kapanıyor, hiçbir iş durmuyor. Bedeli başka yerde: kapatma bir izin listesi dosyasıyla yapılıyor ve o dosya artık bakılması gereken bir yer. Yeni bir varlık dizini eklendiğinde listeye eklenmezse sunulmaz; bu, ilerideki bir arızanın kaynağıdır.
Üçüncü adım yönetim uçlarını dış kapıdan alıyor. Dört kalem kapanıyor ve iki iş duruyor: nöbetçinin sağlık çağrısı ve dağıtım akışının üye ekleme çağrısı. İkisi de meşrudur ve ikisi de o uçlardan geçiyordu. Adım tamamlanabilmesi için iki yeni kalem getiriyor: yalnız iç ağdan erişilen ayrı bir yönetim dinleyicisi ve o dinleyiciye giren bir yönetim kimliği. İkinci kalem bir sırdır ve sırların kendi ömrü, kendi sızıntı penceresi vardır.
Dördüncü adım şifresiz kapıyı kapatıyor. Tek kalem kapanıyor, bir iş duruyor: sahadaki eski el terminalleri yalnız şifresiz konuşuyor. Bu, en küçük kapatma ve en görünür kırılmadır — durduğu gün bütün saha ekibi arar.
Dört adım on üç kalem kapattı, dört meşru işi durdurdu ve üç yeni kalem getirdi. Oran on üçe dörttür: kapatılan her üç kaleme karşılık bir iş durmuştur. Bu oran adımlar arasında hiç eşit dağılmıyor — ikinci adım dört kalemi sıfır durdurmayla kapatırken, dördüncü adım tek kalemi bir durdurmayla kapatıyor. Sıralamayı belirleyen budur: ucuz adım önce, pahalı adım sonra. Yüzey kalemi sayısına bakan bir sıralama dördüncü adımı en sona koymazdı, çünkü o adım en çok konuşulan kalemi kapatıyor ve sayı olarak en azını veriyor.
Kapatılamayan Dördü
Dört adımın sonunda geriye dört kalem kalıyor ve dördü de kapatılamaz kalemdir.
Varlık kökü ve şifreli kapı makinenin var oluş nedenidir; kapatmak sistemi kapatmaktır. Yukarı akış kapısı kapatılamaz çünkü vekilin arkaya bağlanması ondan geçer; daraltılabilir — yalnız geri döngü arayüzüne bağlanabilir — ama açık kalır. Tek süreç kimliği ise ancak birleştirmeyi geri alarak, yani üç rolü üç sürece bölerek kapanır; hiçbir yapılandırma satırı onu kapatmaz.
Sondaki tablo yedi açık kalem gösteriyor: dört kapatılamayan ve üç yeni. Başlangıçtaki on yedi ile karşılaştırıldığında bu bir kazançtır. Yeni yüzeyin sayılmadığı bir raporda kazanç on yedi kalemden dört kaleme inmek diye yazılırdı; sayıldığında yediye inmektir.
Özet
- Üç web sunucusu rolünün varsayılan kurulumu on sekiz kalem bıraktı: beş dinlenen kapı, dört sunulan yol, altı görünen bilgi, üç yönetim ucu; on dördü dış, dördü iç erişimli.
- Rollerin kalem sayısı eşitti, türü değildi: statik sunumun dördü sunulan yol, ters vekilin üçü dinlenen kapı, yük dağıtımının üçü görünen bilgiydi.
- Tek süreçte birleştirme on sekiz kalemi on dört benzersize indirdi, üç kalem doğurdu ve iç erişimli dört kalemi dışa taşıdı: dıştan erişilebilir kalem sayısı ondan on yediye çıktı.
- Dört sertleştirme adımı on üç kalem kapattı, dört meşru işi durdurdu ve üç yeni kalem getirdi; yönetim uçlarını kapatan adım tek başına iki işi durdurdu ve iki yeni kalem ekledi.
- Geriye dört kapatılamayan kalem kaldı; biri olan tek süreç kimliği hiçbir ayarla değil, yalnız rolleri ayrı süreçlere bölerek kapanır.
Sonraki Adım
Bu ders yüzeyi dışarıdan saydı: kaç kapı dinliyor, kaç yol sunuluyor, kaç uç açık. Sayımın tamamı isteğin sunucuya varmasıyla ilgiliydi. İstek vardıktan sonra ne olduğuna hiç bakılmadı.
Ters vekil isteği alıp arkaya ilettiğinde istek olduğu gibi geçmez. Bağlantı vekilde biter ve
arkaya yeni bir bağlantı açılır; o yeni bağlantının öteki ucunda istemci değil vekil durur.
İstemcinin adresi, isteğin şifreli gelip gelmediği, istemcinin hangi adı istediği ve isteğin
özgün yolu — dördü de bağlantının kendisinde taşınıyordu ve bağlantı bitti. Sonraki ders
node:http ile iki katlı bir vekil zinciri kurar, gerçek istek geçirir, zincirden geçerken
kaybolan dört bilgiyi tek tek sayar, her kaybın uygulamada ürettiği yanlış kararı gösterir ve
kaybı kapatmak için eklenen başlığa güvenmenin açtığı yüzeyi ölçer.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.