Ders 12 / 20
API Ağ Geçidi Servisi
Geçidin hizmet olarak alınmasının sayıları: on iki uç noktalık bir yüzeyin yapılandırma kalemi sayısı, yetkilendirmenin geçitte yapılmasının işlev çağrısı sayısına etkisi ve başabaş önbellek isabet oranı, geçidin soğuk başlangıcı gizlemediğinin zaman aşımı eşiği taranarak gösterilmesi ve zaman aşımına uğrayan isteklerin işlevde tamamlanmayı sürdürmesi.
İçindekiler
Buraya kadar işlevleri uyandıran her şey içeriden geldi: bir kural, bir kuyruk, bir akış adımı, bir saat. Ölçüm ağının bir de dışarıya bakan yüzü var — saha ekiplerinin uygulaması, şube ekranları ve abonelerin kendi tüketimini sorguladığı arayüz. Bu istekler işleve doğrudan ulaşamaz; arada yolu eşleyen, kimliği doğrulayan ve kısan bir katman durur.
Geçidin görevleri daha önce ölçüldü; yol eşleme, kimlik doğrulama ve kısma o derslerin konusuydu ve buradaki ölçüm onları tekrarlamaz. Bu dersin sorusu yine dardır: geçit bir hizmet olduğunda hangi karar devredilir ve karşılığında hangi sayı gelir.
Yapılandırma Yüzeyi
Devredilen kararlar tanıdıktır: geçidin kendisini işleten makineler, o makinelerin ölçeği, sertifika yenilemesi, sürüm yükseltmesi. Karşılığında gelen kısıt bu kez bir sınır değil, bir hacimdir. Geçit servisinde her uç nokta kendi yapılandırma kümesini taşır: yol deseni, yöntem, tümleştirme hedefi, yetkilendirici, istek eşlemesi, kısma sınırı, önbellek anahtarı, günlükleme. Sekiz kalem, uç nokta başına.
Ölçüm ağının dışarıya açılan yüzü on iki uç noktadır. Toplam yapılandırma kalemi 12 × 8 + 6 = 102. Bu sayı bir maliyet değil, bir yüzeydir: 102 yerin her biri yanlış ayarlanabilir ve hiçbiri işlev kodunda görünmez. Önceki derslerdeki kuralla, akış tanımıyla ve zamanlama ifadesiyle aynı türden bir yüzeydir; farkı büyüklüğüdür.
Yüzeyin tehlikeli yanı, kalemlerin birbirinden bağımsız olmasıdır. On üçüncü uç nokta eklendiğinde sekiz kalem daha açılır ve bunlardan biri — yetkilendirici — boş bırakılabilir. Boş bırakılmış bir yetkilendirici hata üretmez; uç nokta çalışır, yanıt döner, ölçütler yeşil kalır. Tek fark, o uç noktanın kimlik sormamasıdır. Önceki derste kuralın görünmezliği bir yüzeydi; burada aynı görünmezlik doğrudan bir erişim kararına dokunuyor. Kısıtın etrafından dolaşmanın yolu, uç nokta tanımlarını tek bir şablondan üretip yetkilendirici alanını zorunlu kılmaktır; bedeli, geçit yapılandırmasının artık elle düzenlenememesi ve her değişikliğin üretim hattından geçmesidir.
- OS25. Günlük istek karışımı 50.000’dir ve üç kurgu kaynaktan gelir: saha uygulaması 12.000, şube ekranı 18.000, abone arayüzü 20.000.
- OS26. Ret nedeni yetkilendirmedir — süresi geçmiş belirteç, eksik kapsam, belirteçsiz istek; ret oranları kaynağa göre 0,03 ile 0,31 arasındadır.
- OS27. Ücret kurgu birimdir: istek başına 0,002 geçit payı, işlev çağrısı başına 0,010.
- OS28. Yapılandırma sayımı 12 uç nokta × 8 kalem artı geçit düzeyinde 6 kalemdir.
- OS29. Soğuk başlangıcın ek süresi 90 birim, geçidin kendi payı 4 birimdir; soğuk çağrılar sabit aralıklarla dağıtılır.
- OS30. İstemci yeniden denemesi tek sefer sayılır; kısma ve yanıt önbelleği ölçülmez.
Yetkilendirme Nerede Yapılıyor
Geçitte reddedilen bir istek işlevi hiç uyandırmaz. Bu cümle doğrudur, ama tek başına eksiktir — reddin kendisi de bir işlem gerektirir ve o işlemin nerede yapıldığı sayıyı değiştirir. Aşağıdaki model aynı günlük istek karışımını dört düzende işler ve her düzende kaç işlev çağrısı yapıldığını sayar.
// gecit.mjs — gecit servisi modeli: yetkilendirme nerede yapiliyor, islev kac kez uyaniyor // Model: gercek bir gecit degil, yetkilendirme yerinin cagri sayisina etkisinin sayilmasi. const KAYNAK = [ // kurgu olcum agindan gunluk istek karisimi { ad: "saha uygulamasi", istek: 12000, ret: 0.06 }, { ad: "sube ekrani", istek: 18000, ret: 0.03 }, { ad: "abone arayuzu", istek: 20000, ret: 0.31 }, ]; const ISTEK = KAYNAK.reduce((t, k) => t + k.istek, 0); const RET = KAYNAK.reduce((t, k) => t + Math.round(k.istek * k.ret), 0); const GECEN = ISTEK - RET; const ONBELLEK = 0.85; // yetkilendirici sonucunun isabet orani const GECIT_UCRET = 0.002, CAGRI_UCRET = 0.010; // kurgu birim: istek basina ve cagri basina const duzen = [ ["yetkilendirme islevde", ISTEK, 0], ["gecitte, onbelleksiz", GECEN, ISTEK], ["gecitte, onbellekli", GECEN, Math.round(ISTEK * (1 - ONBELLEK))], ["gecitte, yerlesik dogrulama", GECEN, 0], ]; console.log("duzen".padEnd(29) + "is cagrisi".padStart(12) + "yetkilendirici".padStart(16) + "toplam cagri".padStart(14) + "ucret".padStart(9)); for (const [ad, is, yetki] of duzen) { const ucret = ISTEK * GECIT_UCRET + (is + yetki) * CAGRI_UCRET; console.log(ad.padEnd(29) + String(is).padStart(12) + String(yetki).padStart(16) + String(is + yetki).padStart(14) + ucret.toFixed(1).padStart(9)); } console.log(`istek: ${ISTEK}, reddedilen: ${RET}, gecen: ${GECEN}`); console.log(`yapilandirma: 12 uc nokta x 8 kalem + gecit duzeyi 6 kalem = ${12 * 8 + 6}`);
node gecit.mjs
duzen is cagrisi yetkilendirici toplam cagri ucret yetkilendirme islevde 50000 0 50000 600.0 gecitte, onbelleksiz 42540 50000 92540 1025.4 gecitte, onbellekli 42540 7500 50040 600.4 gecitte, yerlesik dogrulama 42540 0 42540 525.4 istek: 50000, reddedilen: 7460, gecen: 42540 yapilandirma: 12 uc nokta x 8 kalem + gecit duzeyi 6 kalem = 102
İlk satır yetkilendirmenin işlevde yapıldığı düzendir: 50.000 isteğin tamamı işlevi uyandırır. Bunların 7.460’ı yalnız “hayır” demek için uyanır — belirteci doğrular, geçersiz bulur, yanıt döner. İş yapılmamıştır ama çağrı yapılmıştır; eşzamanlılık havuzundan yer alınmış, soğuk başlangıç ihtimali göze alınmıştır.
İkinci satır beklenenin tersini gösteriyor. Yetkilendirme geçide taşındığında iş çağrısı 42.540’a indi, ama geçidin çağırdığı yetkilendirici işlev her istek için bir kez koştuğundan toplam çağrı 92.540’a, ücret 1.025,4 birime çıktı. Reddi işlevden almak, reddi yapan şeyin kendisi bir işlevse çağrı sayısını azaltmaz; artırır.
Üçüncü satır sınırdır: yetkilendirici sonucu yüzde 85 isabetle önbelleklendiğinde toplam çağrı 50.040, ücret 600,4 birim olur — birinci satırla neredeyse aynı. Başabaş isabet oranı basit bir eşitlikten çıkar: 50.000 × (1 − h) = 7.460, yani h = yüzde 85,1. Bu oranın altında geçitte yetkilendirme pahalıdır, üstünde ucuzdur ve kazanç isabet oranına birebir bağlıdır.
Dördüncü satır asıl kazancın nerede olduğunu söylüyor: geçit belirteci kendi doğrulayabildiğinde araya hiçbir işlev girmez. Toplam çağrı 42.540, ücret 525,4 — birinci satıra göre yüzde 12,4 düşük. Ölçünün sonucu tek cümledir: “geçitte reddedilen istek işlevi uyandırmaz” ancak reddin kendisi bir işlev çağrısı değilse bir kazançtır.
Reddedilen isteklerin dağılımı da kendi başına bir bulgudur. 7.460 reddin 6.200’ü tek bir kaynaktan, abone arayüzünden gelir; oran orada yüzde 31’dir çünkü tarayıcı oturumu kısadır ve belirteç sık sık süresini doldurur. Kalan iki kaynak birlikte 1.260 ret üretir. Yani reddin yüzde 83,1’i tek bir istemcinin belirteç yenileme davranışından doğuyor. Bu, geçit yapılandırmasıyla çözülecek bir şey değildir; istemci belirteci süresi dolmadan yenilediğinde sayı kendiliğinden düşer. Ölçünün buradaki dersi, çağrı sayısını azaltmanın her zaman geçit tarafında bir ayar olmadığıdır.
Ücretin bir ayrıntısı da bu satırlarda gizli. Geçit payı dört düzende de aynıdır: 50.000 × 0,002 = 100 birim. Reddedilen 7.460 istek işlevi uyandırmasa bile geçide ulaşmıştır ve 14,9 birim ücretlendirilmiştir. Geçitte reddetmek çağrıyı önler, isteği önlemez; yetkisiz bir istek seli hiçbir işlev çalıştırmadan fatura üretir ve bunu durduracak şey geçidin kendisi değil, önündeki kısma sınırıdır.
Çağrı sayısının ötesinde bir kazanç daha var ve o sayıya girmiyor. Dört düzenin üçünde iş işlevi hiçbir zaman yetkisiz bir istek görmez; yetkilendirme kodu tek yerde, 12 uç noktanın hepsi için aynı biçimde durur. Birinci düzende aynı denetim on iki işlevde ayrı ayrı yazılıdır ve birinde unutulması sessiz bir açıktır. Bu, 102 kalemlik yapılandırma yüzeyinin karşılığında alınan şeydir.
Dördüncü düzende geçit payı toplam ücretin 100 / 525,4’ü, yani yüzde 19’udur. Bu oran isteğin ne kadar iş yaptığından bağımsızdır: geçit isteği sayar, süreyi saymaz. Uzun süren bir rapor sorgusunda geçit payı toplamın küçük bir dilimi kalır; birkaç alan döndüren kısa bir uç noktada ise geçit, işlevin kendisinden pahalı olabilir. Uç nokta ne kadar ince olursa geçidin payı o kadar büyür ve bu, çok sayıda küçük uç nokta tasarlamanın görünmeyen bir maliyetidir. Aynı işi tek bir uç noktada toplamak payı düşürür; bedeli, yetkilendirme ve kısma sınırlarının artık uç nokta düzeyinde ayrışamamasıdır.
Geçit Soğuk Başlangıcı Gizlemez
Geçit isteği alır, yönlendirir ve yanıtı bekler. Beklerken yapabileceği tek şey vardır: bir süre sonra vazgeçmek. İşlevin ısınmasını bekleyip isteği tutamaz, ısınana kadar başka bir yere gönderemez. Bu yüzden soğuk başlangıcın gecikmesi doğrudan istemciye geçer ve geçidin zaman aşımı eşiği, kimin hata alacağını belirler. Aşağıdaki tarama aynı 42.540 çağrıyı dört farklı eşikte işler; çağrıların gecikmesi ve hangilerinin soğuk olduğu bütün satırlarda aynıdır, değişen tek şey geçidin ne kadar beklediğidir.
// zaman-asimi.mjs — gecit servisi soguk baslangici gizlemez: zaman asimi esigi taranir const TOHUM = 20260714; // uretec tohumu: kosum tekrarlanabilir let d = TOHUM; const r = () => (d = (d * 1103515245 + 12345) % 2147483648) / 2147483648; const N = 42540, GECIT = 4, SOGUK_EK = 90; // kurgu birim: gecidin kendi payi ve soguk ek const CAGRI = []; for (let i = 0; i < N; i++) { const is = r() < 0.88 ? 10 + Math.floor(r() * 31) // olagan sorgu: 10-40 birim : 60 + Math.floor(r() * 81); // rapor sorgusu: 60-140 birim const soguk = i % 47 === 3; // soguk cagrilar sabit araliklarla CAGRI.push({ gecikme: GECIT + is + (soguk ? SOGUK_EK : 0), soguk }); } const SOGUK = CAGRI.filter((c) => c.soguk).length; console.log("zaman asimi".padEnd(13) + "asan istek".padStart(12) + "bunlarin sogugu".padStart(17) + "istemci yeniden denerse".padStart(25)); for (const T of [60, 120, 200, 300]) { const asan = CAGRI.filter((c) => c.gecikme > T); console.log(String(T).padEnd(13) + String(asan.length).padStart(12) + String(asan.filter((c) => c.soguk).length).padStart(17) + String(N + asan.length).padStart(25)); } console.log(`cagri: ${N}, soguk cagri: ${SOGUK}, gecit payi: ${GECIT} birim, tohum: ${TOHUM}`);
node zaman-asimi.mjs
zaman asimi asan istek bunlarin sogugu istemci yeniden denerse 60 5929 906 48469 120 1864 455 44404 200 39 39 42579 300 0 0 42540 cagri: 42540, soguk cagri: 906, gecit payi: 4 birim, tohum: 20260714
En alt satır rahatlatıcı görünüyor: 300 birimlik zaman aşımında hiçbir istek aşmıyor. Bir üst satır asıl bulguyu veriyor. 200 birimlik eşikte 39 istek zaman aşımına uğradı ve 39’unun da tamamı soğuk çağrıydı. Sıcak çağrıların hiçbiri o eşiği aşamaz, çünkü sıcak yolun en kötü durumu 144 birimdir; soğuk yolun en kötü durumu 234’tür. Eşik ikisinin arasına düştüğünde hata alan istemci kümesi tam olarak soğuk başlangıca denk gelen kümedir.
Geçidin kendi payı olan 4 birim küçük görünür, ama nerede göründüğü önemlidir: işlevin süre ölçütünde görünmez. İşlev 30 birimde bittiğini bildirirken istemci 34 birim bekler; soğuk çağrıda işlev yine 30 birim bildirir, istemci 124 birim bekler. İki tarafın gördüğü sayı arasındaki bu fark, geçit hizmetinin gizli kısıtıdır — gecikme şikâyeti geldiğinde işlev ölçütlerine bakan taraf hiçbir anormallik bulamaz. Farkı görebilmenin yolu, geçidin kendi erişim kaydındaki toplam süreyi işlevin bildirdiği süreyle yan yana koymaktır; iki kaynağın birleştirilmesi ayrı bir iştir ve geçidin hizmet olmasının bedellerinden biridir.
60 birimlik eşikte tablo başka bir şey söylüyor: 906 soğuk çağrının hepsi aşıyor. Soğuk başlangığın süresi tek başına eşiği aştığı için, o çağrının ne kadar iş yaptığı önemsizdir. Geçidin zaman aşımını sıkmak, soğuk başlangıcı bir gecikme sorunundan bir hata sorununa çevirir.
Son sütun bedelin ikinci yarısıdır. Zaman aşımı geçidin kararıdır; işlev bundan haberdar değildir ve çalışmayı sürdürür. İstemci hata alıp yeniden denediğinde 60 birimlik eşikte çağrı sayısı 42.540’tan 48.469’a çıkar — yüzde 13,9 fazladan çağrı. Daha kötüsü, ilk çağrı işini tamamlayıp yazmıştır; ikinci çağrı artık sıcak bir örneğe düşer, hızla biter ve aynı yazmayı ikinci kez yapar. Bu, önceki iki derste ölçülen yinelenen etkinin geçit yüzeyindeki biçimidir ve çözümü de aynıdır: yazma bir etkisizlik anahtarına dayanmalıdır.
Geçidin bu noktada yapamadıklarını saymak, hizmetin sınırını çizer. Geçit isteği kuyruğa almaz — kuyruk servisi ayrı bir şeydir ve araya girmesi için isteğin eşzamansıza çevrilmesi gerekir. Geçit kendiliğinden yeniden denemez; denese bile bu, zaman aşımına uğrayan çağrının üstüne ikinci bir çağrı bindirmek olurdu ve son sütundaki 48.469 sayısı istemci yerine geçitten gelirdi. Geçit yanıtı ısınana kadar bekletmez, çünkü hangi işlevin ne zaman ısınacağını bilmez. Yaptığı üç şey vardır: yolu eşler, belirteci doğrular, süreyi keser. Bu üçünün dışında kalan her davranış ya istemcide ya işlevde kurulur; geçidin hizmet olması bu sınırı genişletmez, yalnız üç işi işletme yükünden kurtarır.
Kısıtın etrafından dolaşmanın üç yolu var. Zaman aşımını yükseltmek 39 hatayı sıfırlar ama bağlantıyı daha uzun tutar ve gerçekten takılmış bir isteğin fark edilmesini geciktirir. İşlevi sıcak tutmak soğuk çağrı sayısını düşürür ama boşta çağrı üretir; 906 soğuk çağrının bedeli ile sıcak tutmanın bedeli karşılaştırılmalıdır. Üçüncüsü, ağır uç noktaları eşzamansıza çevirmektir: istek kuyruğa yazılır, geçit hemen yanıt döner, sonuç ayrıca sorulur — bedeli, istemci tarafında iki adımlı bir akış ve sonucun nerede tutulacağı sorusudur.
Ölçüm ağında seçim uç noktanın türüne göre yapılır. Şube ekranının tüketim sorgusu kısadır ve sıcak yolda en kötü 44 birim sürer; orada 300 birimlik bir eşik fazlasıyla yeterlidir. Rapor sorgusu ise soğuk yolda 234 birime çıkabilir ve istemcinin bu kadar beklemesi anlamlı değildir; o uç nokta eşzamansıza çevrilir. Aynı geçit, aynı yapılandırma yüzeyi, iki farklı zaman aşımı kalemi. Bu da 102 kalemin neden 102 olduğunu gösteriyor — kalemler uç nokta başına ayrı tutuluyor, çünkü tek bir eşik bütün uç noktalar için doğru olamaz.
Özet
- Geçit servisinde on iki uç noktalık bir yüzey 102 yapılandırma kalemi taşır; kalemlerin hiçbiri işlev kodunda görünmez.
- Yetkilendirme işlevde yapıldığında 50.000 isteğin tamamı işlevi uyandırdı ve 7.460 çağrı yalnız reddetmek için koştu.
- Yetkilendirme geçide taşınıp reddi bir yetkilendirici işlev yaptığında toplam çağrı 92.540’a çıktı; yüzde 85 önbellek isabetiyle 50.040’a indi ve ücret birinci düzenle eşitlendi. Başabaş isabet oranı yüzde 85,1’dir.
- Geçidin belirteci kendi doğrulaması tek kazançlı düzendir: 42.540 çağrı, yüzde 12,4 daha az ücret. “Geçitte reddedilen istek işlevi uyandırmaz” ancak red bir işlev çağrısı değilse kazançtır.
- 200 birimlik zaman aşımında aşan 39 isteğin tamamı soğuk çağrıydı; 60 birimde 906 soğuk çağrının hepsi aştı. Geçit soğuk başlangıcı gizlemez, yalnız onu gecikme yerine hata olarak gösterir.
- Zaman aşımına uğrayan istekte işlev çalışmayı sürdürür; istemci yeniden denediğinde çağrı sayısı 48.469’a çıkar ve aynı yazma ikinci kez yapılır.
Sonraki Adım
Geçit dışarıdan gelen isteği içeri alıyor. Ölçüm ağının dışarıya gönderdiği bir akış daha var: doğrulama başarısız olduğunda saha ekibine giden iş bildirimi, fatura kesildiğinde aboneye giden ileti. Bu gönderimler de bir hizmete devredilir ve o hizmetin kısıtı buraya kadar görülenlerin hiçbirine benzemez — gönderimin başarısı gönderenin elinde değildir, alan tarafın verdiği karara bağlıdır. Sonraki ders bu kısıtı ölçer: geri dönen ileti ve şikâyet birer olay olarak geri gelir, bu geri bildirim akışı işlenmezse ne olduğu sayılır.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.