İçeriğe geç
academia.sh

Ders 03 / 16

Ters Vekil ve İleri Vekil

Aynı sınır sayısı iki vekilde iki ayrı kuyruk üretir; sınır 30'da ters vekil 6 özneyi korumaz ve 1160 birim boşta bırakır, ileri vekil aynı 1160 birimi kısılan meşru talep olarak sayar, üstelik kırk özneden 9'unu ve 430 birimi hiç göremediği için raporunda yalnız 993 birim görünür.

İçindekiler

Önceki iki derste dengeleyici hep aynı yerde durdu: kırk öznenin önünde, onların adına karar vererek. Yükü kim gönderirse göndersin kaldıraç öznelerin tarafındaydı ve amacı onları korumaktı.

Aracı bu duruşa mahkûm değildir. Aynı düzenek ters yöne çevrilebilir: istemcilerin önünde durup onların adına karar verebilir. Bu dersin sorusu vekilin ne yaptığı değil — kimin adına yaptığı, ve bu tercihin aynı sayıyı nasıl iki ayrı kuyruğa çevirdiğidir.

Aynı Aracı, İki Duruş

İkisi de aracıdır (intermediary): isteği alır, kendi kararını uygular, karşı tarafa iletir. Ayrım durdukları yerdedir.

Ters vekil (reverse proxy) öznelerin önünde durur. Dışarıdan bakan için tek adres odur; arkasındaki kırk özne doğrudan görünmez. Sunucu tarafının onu koymasının nedenleri sıralanabilir: isteği bir dağıtım kuralına sokmak, şifreli bağlantıyı burada sonlandırmak, yanıtı saklamak, ve arkadaki topolojiyi dışarıya kapatmak. Karar öznelerin adına alınır. Özne bunu isteyip istemediği sorulmadan alınır — zaten kendi önündeki aracıyı seçen taraf o değildir.

İleri vekil (forward proxy) istemcilerin önünde durur. Dışarıya çıkan her istek ondan geçer; hedef tarafın gördüğü adres istemcinin değil vekilindir. İstemci tarafının onu koymasının nedenleri de sıralanabilir: hangi hedeflere çıkılabileceğini sınırlamak, çıkan isteği kaydetmek, sık istenen yanıtı saklamak, ve istemciyi hedeften gizlemek. Karar istemcilerin adına alınır.

Yük dengeleyici ile ters vekilin ilişkisi ve ters vekilin üretim yapılandırması Sistem Tasarımı ve Sunucu Tarafı müfredatlarında ele alındı; o anlatı burada tekrarlanmıyor. Fark tek cümledir: orada vekilin rolü ve yapılandırması ölçüldü, burada tek bir sınır sayısının kırk öznede bıraktığı kuyruk.

Yapılandırma tarafında ikisi birbirine benzer ve tam da bu yüzden karıştırılır:

# öğretilen yapılandırma dökümü, çalıştırılmamıştır

ters-vekil {
  dinle        *:443
  yukari-akis  ozne-01 ... ozne-40
  sinir        es-zamanli 30 / ozne
  amac         ozneyi korumak
}

ileri-vekil {
  dinle        ic-ag:3128
  cikis        her hedef
  sinir        hiz 30 / istemci
  amac         istemciyi sinirlamak ve gizlemek
}

İki dökümde de aynı sayı geçiyor. Ölçüm bu sayının ne yaptığını sorar.

Kaldıraç Tek Bir Sayıdır

Kaldıraç şudur: bir sınır sayısı, kırk özneye birden uygulanır. Ters vekilde bu sayı bir eşzamanlılık sınırıdır — bir özneye aynı anda en çok bu kadar iş geçer. İleri vekilde bir hız sınırıdır — bir istemci aynı anda en çok bu kadar iş çıkarabilir.

Neden kırk ayrı sınır yazılmadığı sorusu haklıdır ve yanıtı ölçünün dışındadır. Kırk ayrı sayı yazılabilir; yazıldığı anda kırk ayrı bakım yükü doğar. Bir öznenin kapasitesi değiştiğinde ona ait satırın da değişmesi gerekir; değişmezse sınır sessizce yanlışa döner ve hiçbir gösterge bunu bildirmez. İşletmenin tek sayıya yönelmesi bir kolaycılık değil, bakım maliyetinin doğrudan sonucudur — tek satır tek yerde durur ve kırk özneyi birden izler. Bu kursun ölçtüğü kaldıraç–özne oranı da buradan doğar: tek satırın bedeli kuyruktur, kırk satırın bedeli ise kırk satırın zamanla gerçekten kırk özneyi anlatmaz hâle gelmesidir.

Kuyruk her iki duruşta da vardır ama adı ve sahibi değişir.

Ters vekilde sınır kapasitesinden büyük olan özneyi korumaz: özne sınıra ulaşmadan kendi kapasitesini aşar ve sınır hiç devreye girmez. Sınır kapasitesinden küçük olan özneyi ise kapasitesinin altında tutar; aradaki fark kullanılmayan kapasitedir.

İleri vekilde aynı iki koşul tersine okunur. Talebi sınırın üstünde olan istemci kısılır ve aradaki fark reddedilmiş meşru taleptir. Talebi sınırın altında kalan istemci sınırdan hiç etkilenmez.

Bir fark daha var ve ölçümün en keskin sütununu o üretiyor. Ters vekil atlatılamaz: özneye giden tek yol odur, kırk öznenin kırkı da önünden geçer. İleri vekil atlatılabilir; istemcinin onu kullanması bir yapılandırma tercihidir ve kimi özne doğrudan çıkacak biçimde ayarlanmıştır.

Ölçümün varsayımları:

  • TY14 — Kırk özne kursun sabit kümesidir ve değiştirilmez.
  • TY15 — Ters vekil kurgusunda özne bir sunucudur ve kapasite alanı onun karşılayabildiği iş miktarıdır — önceki iki dersteki okumanın aynısı.
  • TY16 — İleri vekil kurgusunda özne bir istemcidir ve kapasite alanı onun meşru talebi olarak okunur. Küme değişmez, okuma değişir; iki duruşun aynı sayılar üzerinde karşılaştırılabilmesinin koşulu budur.
  • TY17 — Sınır tek bir sayıdır ve özne başına uygulanır; öznelere ayrı ayrı sınır yazılmaz. Kaldıracın tekliği bu varsayımdadır.
  • TY18 — İleri vekili atlayan özneler kurgudaki ozel işaretli aygıtlardır. Atlama bir kusur değil, kayıtlı bir yapılandırma tercihidir; vekil onların trafiğini ne sınırlar ne görür.
  • TY19 — Ters vekil tek giriş noktasıdır; hiçbir özne onu atlayamaz.
  • TY20 — Ölçüm bir ağ ölçümü değildir; hiçbir bağlantı açılmaz. Sayılan şey sınırın kırk özne üzerindeki aritmetiğidir.

Ölçüm

"""Ayni sinir, iki vekil: kimin adina karar verildigi kuyrugu degistirir."""
TOHUM = 20260812
SINIFLAR = ("etkilesim", "toplu", "yedek")


def uretec(tohum):
    d = tohum % 2147483646 + 1

    def r(n):
        nonlocal d
        d = (d * 48271) % 2147483647
        return d % n
    return r


def ozneler(sayi=40, tohum=TOHUM):
    r, liste = uretec(tohum), []
    for i in range(sayi):
        liste.append({"no": i + 1, "kapasite": 20 + r(81), "gecikme": 5 + r(45),
                      "sinif": SINIFLAR[r(3)], "ozel": r(9) == 0})
    return liste


def ters(oz, sinir):
    """Ozne sunucudur; sinir onun adina konur. Kuyruk: korunmayan ve bosta birakilan."""
    korunmayan = sum(1 for o in oz if o["kapasite"] < sinir)
    bosta = sum(max(0, o["kapasite"] - sinir) for o in oz)
    return korunmayan, bosta


def ileri(oz, sinir, gecen):
    """Ozne istemcidir; sinir onun adina konur. Kuyruk: kisilan ve hic gorunmeyen."""
    g = [o for o in oz if o["no"] in gecen]
    kisilan = sum(1 for o in g if o["kapasite"] > sinir)
    birim = sum(max(0, o["kapasite"] - sinir) for o in g)
    return kisilan, birim


oz = ozneler()
gecen = {o["no"] for o in oz if not o["ozel"]}
tum = {o["no"] for o in oz}
print(f"özne {len(oz)} | toplam talep {sum(o['kapasite'] for o in oz)} | "
      f"ileri vekilden geçen {len(gecen)} | vekili atlayan {len(oz) - len(gecen)} "
      f"({sum(o['kapasite'] for o in oz if o['ozel'])} birim)")
print()
print(f"{'sınır':>6s} | {'ters vekil':^22s} | {'ileri vekil (geçen 31)':^24s} | "
      f"{'kırkı da geçseydi':^27s}")
print(f"{'':>6s} | {'korunmayan':>10s} {'boşta':>11s} | "
      f"{'kısılan':>8s} {'kısılan birim':>15s} | {'kısılan':>8s} {'birim':>11s} "
      f"{'eşit':>5s}")
for sinir in (30, 45, 60, 75, 90):
    k, b = ters(oz, sinir)
    ki, bi = ileri(oz, sinir, gecen)
    kt, bt = ileri(oz, sinir, tum)
    print(f"{sinir:6d} | {k:10d} {b:11d} | {ki:8d} {bi:15d} | {kt:8d} {bt:11d} "
          f"{sum(1 for o in oz if o['kapasite'] == sinir):5d}")
print()
print(f"ters vekilden geçmeyen özne: {len(oz) - len(tum)} "
      f"(tek giriş noktasıdır, kırkı da geçer) | "
      f"ileri vekilin hiç görmediği özne: {len(oz) - len(gecen)}, "
      f"{sum(o['kapasite'] for o in oz if o['ozel'])} birim")
özne 40 | toplam talep 2336 | ileri vekilden geçen 31 | vekili atlayan 9 (430 birim)

 sınır |       ters vekil       |  ileri vekil (geçen 31)  |      kırkı da geçseydi     
       | korunmayan       boşta |  kısılan   kısılan birim |  kısılan       birim  eşit
    30 |          6        1160 |       27             993 |       33        1160     1
    45 |         12         711 |       23             620 |       28         711     0
    60 |         23         354 |       15             326 |       17         354     0
    75 |         29         128 |       10             125 |       11         128     0
    90 |         34          17 |        4              17 |        4          17     2

ters vekilden geçmeyen özne: 0 (tek giriş noktasıdır, kırkı da geçer) | ileri vekilin hiç görmediği özne: 9, 430 birim

Aynı Aritmetik, İki Ad

Tablonun en önemli özelliği iki sütununun birebir aynı olmasıdır. Ters vekilin “boşta” sütunu 1160, 711, 354, 128, 17 okuyor; en sağdaki “kırkı da geçseydi” birim sütunu da 1160, 711, 354, 128, 17. Aynı sayılar, çünkü ikisi de aynı toplamdır: her öznenin kapasitesi ile sınır arasındaki farkın pozitif kısmı.

Değişen tek şey o toplamın adıdır. Ters vekilde bu sayı, koruma uğruna kullanılmayan kapasitedir: özne daha fazlasını karşılayabilirdi, sınır izin vermedi. İleri vekilde tam aynı sayı, reddedilmiş meşru taleptir: istemci daha fazlasını isteyecekti, sınır izin vermedi. Ölçü değişmedi, kimin adına konduğu değişti.

Bunun doğrudan bir sonucu var. Sınırı büyütmek ters vekilde korumayı azaltır — korunmayan özne 30’da 6 iken 90’da 34‘e çıkar. Aynı hareket ileri vekilde kısıtlamayı azaltır — kısılan özne 30’da 33 iken 90’da 4’e iner. Kaldıracı aynı yöne çevirmek iki duruşta zıt anlam taşır ve bir gösterge tablosunda ikisi aynı sayı olarak görünür.

Pratikte bunun anlamı, sınırın doğru değerinin ölçümden çıkarılamamasıdır. Otuz mu doksan mı sorusunun yanıtı, tablodaki hangi sütunun kabul edilebilir sayıldığına bağlıdır — ve o kararı veren şey kaldıracın kendisi değil, kaldıracı kimin adına çektiğinizdir. İki tarafın aynı sayı üzerinde anlaşamamasının nedeni de budur: birinin koruma dediği şey, ötekinin reddedilmiş talebidir.

Tümleyen Kuyruk

İki kuyruk birbirinin tümleyenidir ve tabloda toplamları doğrulanabilir. Sınır 30’da korunmayan 6, kırkı da geçseydi kısılan 33, sınıra tam eşit olan 1 özne var: altı artı otuz üç artı bir, kırk eder. Sınır 90’da 34 + 4 + 2 = 40. Aradaki üç satırda eşit olan yok ve iki sütun doğrudan kırka tamamlanıyor: 12 + 28, 23 + 17, 29 + 11.

Bunun anlamı şudur: kırk öznenin her biri, her sınır değerinde, iki kuyruktan tam olarak birindedir. Sınırın altında kalan özne ters vekilde korunmuyordur; üstünde kalan özne ileri vekilde kısılıyordur. Bir öznenin ikisinden birden kurtulduğu bir sınır değeri yoktur ve kırkını birden kurtaran bir sayı hiç yoktur. Sınıra tam eşit olan özneler ise iki sütunda da görünmez — kırk öznelik kümede bir ya da iki özne, yani ölçülebilen en küçük farkın (1/40 = 0,025) bir ya da iki katı.

Tek sayılı bir kaldıracın yapabileceği tek şey, kırk özneyi bu iki kuyruk arasında bölmenin yerini seçmektir. Bölmemek seçeneği kaldıracın elinde yoktur.

İleri Vekilin Göremediği

Son satır ikinci farkı veriyor. Ters vekil öznelere giden tek yol olduğu için kırkını birden görür; atlayan 0. İleri vekil ise kırk özneden yalnız 31’inin trafiğini taşıyor: 9 özne doğrudan çıkacak biçimde ayarlanmış ve 430 birimlik talebi vekile hiç uğramıyor.

Bunun raporda karşılığı ortadaki sütunlardır. Sınır 30’da ileri vekilin kendi raporu 993 birim kısıldığını söylüyor. Kırk öznenin tamamı vekilden geçseydi bu sayı 1160 olacaktı. Aradaki 167 birim eksik değil — hiç sayılmamış. Vekilin raporunda ne kısılmış olarak ne de serbest olarak görünüyor, çünkü o trafiğe hiç dokunulmadı.

Aynı boşluk kısılan özne sütununda da var: rapor 27 diyor, gerçek sayı 33. İstemci adına karar veren bir kaldıracın yapısal zayıflığı budur — kararı uygulayabilmesi için istemcinin ona uğramayı kabul etmesi gerekir. Sunucu adına karar veren kaldıraç bu onaya muhtaç değildir, çünkü kendisi zaten yolun üstündedir.

Dokuz öznenin atlamasının bir kusur olmadığını da eklemek gerekir; kayıtlı bir tercihtir ve gerekçesi vardır. Kusur olan, raporun bu dokuzu hiç anmamasıdır: kapsam dışında kalanı söylemeyen bir kapsam raporu, kapsadığı kadarını doğru saysa bile toplamı yanlış gösterir.

Vekilin Sildiği Ayrım

Adres gizlemenin karşı taraftaki karşılığı da bir kaldıraç sorunudur ve işletmede sık gözden kaçar.

İleri vekilden geçen 31 özne, hedef tarafın gördüğü iletide tek bir adres olarak görünür. Hedef taraf kendi kaldıracını — hız sınırını, eşzamanlılık sınırını, erişim kuralını — o tek adrese uygular. Kırk öznenin otuz biri, karşı tarafın defterinde bir özneye inmiştir. En yoğun istemciyi kısmak isteyen bir hedef otuz birini birden kısar; içlerinden birini engellemek istediğinde otuz birini birden engeller. Bu kursun ölçtüğü oran — bir kaldıraç, kaç özne — vekilin arkasında ikinci kez bozulur, ve karşı taraf kaç özneye dokunduğunu bilmez.

Ters vekilde aynı silme ters yöne çalışır. Dışarıdan bakan için arkadaki kırk özne tek adrestir; hangi öznenin yanıt verdiği iletide yazmaz. Topolojiyi kapatmak zaten istenen sonuçtur, ama yan etkisi ölçümü doğrudan vurur: bir yanıtın hangi özneden geldiği iletiden çıkarılamaz. Bu bilgi ayrıca taşınmazsa kırk öznenin kuyruğu tek bir ortalamanın arkasına düşer ve önceki iki dersteki tabloların hiçbiri kurulamaz.

İkisinin saklama yeteneği de aynı ayrımı taşır. Ters vekil öznelerin adına saklar: bir kez üretilmiş yanıt birçok istemciye verilir. İleri vekil istemcilerin adına saklar: bir kez alınmış yanıt birçok istemcinin aynı hedefe isteğine verilir. İki durumda da saklanan kopya kendisi için üretilmediği bir isteğe gidebilir. Bu kararı yöneten kişiye özellik imi Uygulama Katmanı Protokolleri kursunda ölçüldü ve burada tekrarlanmıyor; bu derste önemli olan, saklama kararının da tek bir kaldıraç olduğu ve kırk özneye birden uygulandığıdır.

Özet

  • Ters vekil öznelerin, ileri vekil istemcilerin adına karar verir; ikisi de aracıdır ve yapılandırmaları benzer, ayrım durdukları yerdedir.
  • Tek bir sınır sayısı ters vekilde korunmayan özne ve boşta bırakılan kapasite, ileri vekilde kısılan özne ve reddedilen meşru talep üretir.
  • Boşta bırakılan kapasite ile reddedilen talep aynı toplamdır: her iki sütun da 1160, 711, 354, 128, 17 okur; değişen yalnız sayının adıdır.
  • İki kuyruk tümleyendir: her sınır değerinde korunmayan, kısılan ve sınıra eşit özneler kırka tamamlanır (6 + 33 + 1, 34 + 4 + 2); hiçbir sayı kırkını birden kurtarmaz.
  • Ters vekil atlatılamaz ve kırkını görür; ileri vekili 9 özne atlar, 430 birim hiç uğramaz ve rapor 1160 yerine 993, 33 yerine 27 gösterir.
  • Vekil adres ayrımını da siler: ileri vekilin arkasındaki 31 özne hedef tarafta tek adrese iner ve karşı tarafın kaldıracı otuz birine birden dokunur; ters vekilin arkasında ise yanıtın hangi özneden geldiği iletide kalmaz.

Sonraki Adım

Bu üç derste kaldıraç hep tek bir noktada durdu: isteğin geçmek zorunda olduğu yerde. Ters vekil öznelerin önünde, ileri vekil istemcilerin önünde, ama ikisi de tek bir yerde. Sonraki ders bu noktayı çoğaltır: içerik istemciye yakın duran birçok kopyaya dağıtılırsa, kaldıraç artık dağıtımı değil neyin nerede duracağını ayarlar. Ölçü de değişir — sorulan şey kimin kısıldığı değil, kenarın hangi özneyi hiç görmediğidir: çekme modelinde ilk isteğini bekleyen içerik, itme modelinde hiç istenmeyen içerik.

İ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