İçeriğe geç
academia.sh

Ders 12 / 16

Programlanabilir Arayüzler

Aynı değişiklik üç istek biçimiyle uygulandığında ekleme biçimi kırk aygıtın kırkında ikinci uygulamada durumu değiştirir; yanıt alınamayan dokuz aygıt yeniden denendiğinde ekleme beşini bozar, etkisiz iki biçim hiçbirini bozmaz ama tam değişim dokuz aygıtın model dışı alanını siler.

İçindekiler

Önceki ders yapılandırma modelinin ne söyleyebildiğini ölçtü ve modelin yazıldığı yerde durduğunu varsaydı. Model bir işe yaraması için aygıta ulaşmak zorundadır: bir yerden bir istek gider, aygıt onu alır, uygular ve bir yanıt döner. Bu yolun kendi kuralları vardır.

En önemlisi tek bir soruda toplanır: aynı isteği iki kez göndermek ne yapar? Soru kuramsal görünür ama işletmede en sık karşılaşılan durumdan doğar — yanıt gelmez ve operatör isteğin uygulanıp uygulanmadığını bilemez. Bu dersin ölçtüğü şey arayüzün hızı ya da zarafeti değil, bu sorunun yanıtıdır.

Arayüz Ne Sağlar

Bir aygıta yapılandırma göndermenin en eski yolu, bir kabuk oturumu açıp komut yazmaktır. Bu yolun otomasyon açısından üç kusuru vardır ve üçü de aynı kökten gelir: çıktı insan için biçimlendirilmiştir.

Bir betik, komutun başarılı olup olmadığını ancak çıktı metnini ayrıştırarak anlayabilir. Metnin biçimi değişirse betik sessizce yanlış okur. Hata durumunda dönen şey bir hata kodu değil, bir cümledir. Ve birden çok komutun birlikte uygulanması diye bir kavram yoktur — üçüncü komut kabul edilmezse ilk ikisi çoktan yürürlüktedir.

Programlanabilir arayüz (programmable interface) üçünü birden kapatır. İstek de yanıt da önceki dersin modeline göre yapılandırılmıştır; alanlar adlarıyla gelir ve ayrıştırılacak bir metin yoktur. Hata, işlenebilir bir yapı olarak döner: hangi alanın hangi kısıtı çiğnediği bildirilir. Ve değişiklik bir işlem sınırı içine alınabilir — istek önce aday yapılandırma olarak biriktirilir, doğrulanır, sonra tek bir adımda yürürlüğe alınır.

# ogretilen istek/yanit dokumu , calistirilmamistir

istek
  hedef  : aygit/34
  islem  : birlestir
  govde  : { oncelik: 3 , kural: [ taban , sablon_kurali ] }

yanit
  durum  : kabul
  degisen: [ oncelik , kural ]
  islem  : 7f

Yanıttaki degisen listesi arayüzün en çok işe yarayan alanıdır: aygıt neyin gerçekten değiştiğini söyler. Liste boş dönerse istek uygulanmış ama hiçbir şeyi değiştirmemiştir — yani aygıt zaten istenen durumdaydı.

Üç İstek Biçimi

Aynı değişiklik üç ayrı biçimde istenebilir ve üçü aygıtta aynı sonucu bırakmaz.

Ekleme. İstek “şu kuralı listeye ekle” der. Aygıt listeye bir satır daha koyar. İki kez gönderilirse liste iki satır alır.

Birleştirme. İstek “şu alanların değeri şudur” der. Aygıt alanları anahtarlarına göre eşler ve üzerine yazar; listelerde aynı girdiyi yinelemez. İki kez gönderilirse ikincisi hiçbir şey değiştirmez.

Tam değişim. İstek yapılandırmanın tamamını verir. Aygıt kendisindekini atar ve isteği neyse onu kurar. İki kez gönderilirse ikincisi hiçbir şey değiştirmez — ama ilk gönderim, istekte bulunmayan her alanı da silmiştir.

Bir arayüzün etkisiz (idempotent) olması budur: isteği bir kez uygulamakla iki kez uygulamak aynı durumu bırakıyorsa arayüz etkisizdir. Etkisizlik bir hız ya da doğruluk özelliği değildir; yeniden denenebilirlik özelliğidir.

Yanıt Kaybı ve Yeniden Deneme

Etkisizliğin neden bir işletme sorunu olduğu tek bir kurguda görülür. İstek gönderilir, aygıt onu alır ve uygular, ama yanıt geri dönerken kaybolur. Operatörün elinde hiçbir bilgi yoktur: istek aygıta hiç ulaşmamış da olabilir, uygulanmış da olabilir. İkisi dışarıdan ayırt edilemez.

Bu durumda yapılabilecek tek şey yeniden denemektir. Etkisiz bir arayüzde yeniden deneme bedelsizdir — istek uygulanmışsa ikincisi hiçbir şey yapmaz, uygulanmamışsa uygular. Etkisiz olmayan bir arayüzde ise yeniden deneme, başarılı olmuş aygıtları bozar. Ve bozulanlar tam olarak isteğin çalıştığı aygıtlardır.

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

  • OT13 — Kırk aygıtlık özne kümesi kursun sabitidir. Her aygıtın değişiklikten önceki durumu niteliklerinden türetilir: arayüz, adres ve bir taban kuralı; özel aygıtta ek olarak modelin taşımadığı yerel kural.
  • OT14 — Üç istek biçimi aynı değişikliği taşır: bir kural eklemek ve önceliği ayarlamak. Fark yalnız isteğin biçimindedir, içeriğinde değil.
  • OT15 — Etkisizlik ölçütü durumların karşılaştırılmasıdır: isteği bir kez uygulamakla iki kez uygulamak aynı durumu bırakıyorsa arayüz etkisizdir. Ölçüm arayüzün kendi bildirimine bakmaz.
  • OT16 — Yanıt kaybı kurgunun parametresidir: her beş aygıttan birinde yanıt alınamaz ve yanıtsız kalanların yaklaşık yarısında istek aslında uygulanmıştır. Bu bir ölçüm değildir; oran değişirse satırlar aynı yönde ölçeklenir.
  • OT17 — Yeniden deneme, yanıt alınamayan bütün aygıtlara aynı isteği yeniden gönderir. Operatör hangisinin uygulandığını bilemez; bilseydi yeniden denemeye gerek kalmazdı.
  • OT18 — Şablon aygıtın sınıfına göre yazılır ve rapor etkileşim sınıfı üzerine kuruludur; sınıfı uyuşmayan özel aygıt sapar, başka sınıftaki sapma rapora düşmez.

Ölçüm

"""Programlanabilir arayuz: ayni istegi iki kez gondermenin sonucu.

Bolum 1 - uc istek bicimi, ikinci uygulamanin biraktigi fark.
Bolum 2 - yanit kayboldugunda yeniden deneme neyi bozar.
Bolum 3 - kuyruk: sablonun disinda kalan ve raporda gorunmeyen.
"""
TOHUM = 20260812
EK = "sablon_kurali"
BICIMLER = ("ekleme", "birlestirme", "tam degisim")


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": ("etkilesim", "toplu", "yedek")[r(3)],
                      "ozel": r(9) == 0})
    return liste


def durum(o):
    """Aygitin degisiklikten onceki yapilandirmasi."""
    d = {"arayuz": "ana", "adres": f"a{o['no']}", "kural": ["taban"]}
    if o["ozel"]:
        d["yerel_kural"] = f"k{o['no']}"
    return d


def istek(d, bicim):
    """Ayni degisiklik uc ayri istek bicimiyle uygulanir."""
    y = {k: (list(v) if isinstance(v, list) else v) for k, v in d.items()}
    if bicim == "ekleme":
        y["kural"] = y["kural"] + [EK]
    elif bicim == "birlestirme":
        y["kural"] = [k for k in y["kural"] if k != EK] + [EK]
    elif bicim == "tam degisim":
        y = {"arayuz": "ana", "adres": d["adres"], "kural": ["taban", EK]}
    y["oncelik"] = "3"
    return y


def uygula(oz, sablon_sinifi):
    """Tek sablon kirk aygita uygulanir; ozel aygitlar sapar."""
    uyan = sapan = gizli = 0
    for o in oz:
        if o["sinif"] == sablon_sinifi or not o["ozel"]:
            uyan += 1
        else:
            sapan += 1
            if o["sinif"] != "etkilesim":
                gizli += 1
    return uyan, sapan, gizli


oz = ozneler()
print(f"özne {len(oz)} | model dışı alan taşıyan aygıt "
      f"{sum(o['ozel'] for o in oz)} | istek biçimi {len(BICIMLER)}")
print()
print(f"{'istek biçimi':<14s} {'ikinci uygulama değiştirir':>26s} {'etkisiz':>8s} "
      f"{'model dışı alanı silinen':>25s}")
for b in BICIMLER:
    degisen = silinen = 0
    for o in oz:
        d = durum(o)
        bir = istek(d, b)
        iki = istek(bir, b)
        if iki != bir:
            degisen += 1
        if "yerel_kural" in d and "yerel_kural" not in bir:
            silinen += 1
    print(f"{b:<14s} {degisen:26d} {'hayır' if degisen else 'evet':>8s} "
          f"{silinen:25d}")

print()
r = uretec(TOHUM + 11)
yanitsiz, uygulanmis = [], set()
for o in oz:
    if r(5) == 0:
        yanitsiz.append(o["no"])
        if r(2) == 0:
            uygulanmis.add(o["no"])
print(f"yanıt alınamayan aygıt {len(yanitsiz)} | bunlardan isteği aslında "
      f"uygulamış olan {len(uygulanmis)}")
print()
print(f"{'istek biçimi':<14s} {'yeniden denenen':>16s} {'doğru duruma gelen':>19s} "
      f"{'bozulan':>8s}")
for b in BICIMLER:
    dogru = bozuk = 0
    for no in yanitsiz:
        o = oz[no - 1]
        d = durum(o)
        hedef = istek(d, b)
        onceki = hedef if no in uygulanmis else d
        son = istek(onceki, b)
        if son == hedef:
            dogru += 1
        else:
            bozuk += 1
    print(f"{b:<14s} {len(yanitsiz):16d} {dogru:19d} {bozuk:8d}")

print()
print(f"{'şablon sınıfı':<14s} {'uyan':>6s} {'sapan':>6s} "
      f"{'raporda görünmeyen':>19s} {'şablonu alan ve model dışı alan taşıyan':>40s}")
for s in ("etkilesim", "toplu", "yedek"):
    u, sp, g = uygula(oz, s)
    riskli = sum(1 for o in oz if o["ozel"] and o["sinif"] == s)
    print(f"{s:<14s} {u:6d} {sp:6d} {g:19d} {riskli:40d}")
özne 40 | model dışı alan taşıyan aygıt 9 | istek biçimi 3

istek biçimi   ikinci uygulama değiştirir  etkisiz  model dışı alanı silinen
ekleme                                 40    hayır                         0
birlestirme                             0     evet                         0
tam degisim                             0     evet                         9

yanıt alınamayan aygıt 9 | bunlardan isteği aslında uygulamış olan 5

istek biçimi    yeniden denenen  doğru duruma gelen  bozulan
ekleme                        9                   4        5
birlestirme                   9                   9        0
tam degisim                   9                   9        0

şablon sınıfı    uyan  sapan  raporda görünmeyen  şablonu alan ve model dışı alan taşıyan
etkilesim          34      6                   6                                        3
toplu              34      6                   3                                        3
yedek              34      6                   3                                        3

Etkisizliğin Ölçüsü

Üst tablo üç biçimi ayırıyor. Ekleme biçiminde ikinci uygulama kırk aygıtın kırkında durumu değiştiriyor; arayüz etkisiz değil. Birleştirme ve tam değişim biçimlerinde ikinci uygulama hiçbir aygıtta bir şey değiştirmiyor; ikisi de etkisiz.

Kırkın kırkı olması dikkat çekicidir. Etkisizlik ihlali bir azınlık olayı değildir: ekleme biçiminde her aygıt ikinci uygulamada bozulur, çünkü bozulmanın nedeni aygıtın bir özelliği değil isteğin biçimidir. Bu, bu kursta ölçtüğümüz öteki kuyrukların tersidir — burada kuyruk yoktur, kaldıraç kırkın kırkına aynı biçimde yanlış hizmet eder.

Sağdaki sütun ikinci ayrımı veriyor ve etkisiz olmanın yetmediğini gösteriyor. Tam değişim etkisizdir ama 9 aygıtın model dışı alanını siler. İstek o alanı taşımadığı için aygıt onu bir eksik değil, bir fazla sayar ve atar. Önceki dersin dokuz yerel_kural alanı burada yok olur; hem de arayüz hiçbir kusur bildirmeden, çünkü bu tam olarak istenen işlemin tanımıdır.

Yani etkisizlik ile güvenlik ayrı iki özelliktir. Etkisiz olmayan bir arayüz yeniden denemede bozar; etkisiz ama tam değişimli bir arayüz ilk denemede siler. İkisinin kesişiminde duran biçim birleştirmedir: hem yeniden denenebilir hem de dokunmadığı alanı korur.

Yeniden Denemenin Ödettiği

Orta tablo kurguyu çalıştırıyor. Kırk aygıtın 9’unda yanıt alınamıyor ve bunların 5’inde istek aslında uygulanmış. Operatörün elinde bu ayrımı yapacak bir bilgi yok; dokuzunun dokuzunu da yeniden denemek zorunda.

Ekleme biçiminde yeniden deneme sonrası doğru duruma gelen aygıt 4, bozulan 5. Bozulan beş aygıt, isteğin ilk seferde çalıştığı aygıtlardır. Bu sonucun biçimi işletme açısından en kötüsüdür: yordam başarılı olduğu yerde zarar verir, ve zararın büyüklüğü başarının büyüklüğüyle orantılıdır.

Birleştirme ve tam değişim biçimlerinde dokuz aygıdın dokuzu doğru duruma geliyor, bozulan 0. Etkisizliğin kazandırdığı tam olarak budur ve başka bir şey değildir: yeniden denemeyi düşünmeden yapılabilir hâle getirir.

Kırk öznelik bir kümede ölçülebilen en küçük fark 1/40 = 0,025’tir. Beş bozuk aygıt 0,125’lik bir paydır ve bandın rahatça içindedir.

Etkisizliğin Korumadığı Şey

Etkisizlik operatörü kendi yinelemesine karşı korur. Korumadığı bir durum vardır ve arayüzün okuma tarafından doğar.

Bir betiğin tipik döngüsü üç adımdır: aygıdın durumunu oku, üzerinde değişikliği hesapla, sonucu yaz. Okuma etkisizdir, yazma etkisiz olabilir; ama üçü birlikte bir bütün değildir. İki operatör aynı aygıtta aynı anda bu döngüyü çalıştırırsa, ikincisi birincinin okuduğundan sonra yazar ve birincinin yazdığını görmeden onun üstüne yazar. Sonuç iki değişikliğin toplamı değil, ikincisinin tek başına sonucudur; ve hiçbir istek hata döndürmez, çünkü her istek kendi başına geçerlidir.

Etkisizlik burada hiçbir şey yapmaz. Aynı isteği iki kez göndermek sorun değildir; sorun iki ayrı isteğin araya girmesidir. Arayüzün bu duruma karşı iki aracı vardır. Birincisi işlem sınırıdır: değişiklik aday yapılandırmada birikirken aygıt bir kilit tutar ve ikinci operatörün yazması reddedilir. İkincisi damgadır: her yapılandırmanın bir damgası olur, istek “şu damgayı gördüm, onun üstüne yazıyorum” der ve damga değişmişse istek reddedilir. İkisi de sorunu çözmez, görünür kılar — reddedilen istek bir hata değil, bir bildirimdir.

Arayüzün Açtığı Yüzeyler ve Daraltmalar

Programlanabilir bir arayüz, aygıtın yapılandırmasını değiştirebilen bir yoldur; bu tanım gereği bir yüzeydir. Sayılan yüzeyler ve daraltmaları şunlardır.

Birinci yüzey — yönetim yolunun kendisi. Arayüz açıksa aygıtın yapılandırması ağ üzerinden değiştirilebilir. Daraltma: arayüz ayrı bir yönetim ağına bağlanır ve veri trafiğinin geçtiği yoldan erişilemez; erişim kaynağı adresle sınırlanır; okuma yetkisi ile yazma yetkisi ayrı verilir. Bu üç daraltma birbirinin yerine geçmez, üst üste konur.

İkinci yüzey — kimlik bilgisinin nerede durduğu. Betik aygıta bağlanmak için bir kimlik kullanır ve o kimlik bir yerde durur. Kimlik bilgisi, anahtar ve erişim belirteci bu kursun hiçbir örneğinde yazılmaz. Daraltma: değer betiğin, şablonun ya da yapılandırma deposunun içinde durmaz; betik yalnız bir başvuru taşır ve değeri çalıştığı ortamdan alır.

Üçüncü yüzey — tam değişimin sildiği alan. Ölçümde 9 aygıt, isteğin taşımadığı bir alanı kaybediyor. Bu bir saldırı değil, arayüzün tanımlı davranışıdır ve tam olarak bu yüzden tehlikelidir — hiçbir uyarı üretmez. Daraltma: tam değişim yalnız yapılandırmanın tamamının gerçekten bilindiği durumda kullanılır; bilinmiyorsa birleştirme kullanılır. Model dışı alan taşıyan aygıtlar önceden listelenir ve tam değişimin kapsamı o listeyle kesiştiğinde işlem durdurulur.

Dördüncü yüzey — kendi erişimini kesen değişiklik. Yönetim arayüzünün kendisini kapatan, yönetim ağının adresini değiştiren ya da erişimi filtreleyen bir istek uygulandığı anda aygıta bir daha ulaşılamaz. Böyle bir isteğin komutu bu kursta çalıştırılabilir biçimde yazılmaz; söylenecek şey geri alınamaz olduğudur. Daraltma: değişiklik önce aday yapılandırma olarak yazılır, kuru çalışmayla sonucu hesaplanır, sonra bir geri alma zamanlayıcısıyla yürürlüğe alınır — belirli bir süre içinde operatör onaylamazsa aygıt kendiliğinden eski yapılandırmaya döner. Zamanlayıcı, erişimini kaybetmiş bir operatörün elindeki tek araçtır.

Özet

  • Programlanabilir arayüz yapılandırılmış istek ve yanıt, işlenebilir hata ve işlem sınırı sağlar; kabuk çıktısını ayrıştıran bir betiğin üç kusurunu birden kapatır.
  • Ekleme biçimi etkisiz değildir: ikinci uygulama kırk aygıtın 40’ında durumu değiştirir. Birleştirme ve tam değişim etkisizdir, ikisinde de 0.
  • Yanıt alınamayan 9 aygıtın 5’inde istek aslında uygulanmıştır; yeniden denemede ekleme biçimi bu 5’ini bozar, etkisiz iki biçim 0 bozar.
  • Etkisizlik ile güvenlik ayrıdır: tam değişim etkisizdir ama 9 aygıtın model dışı alanını ilk uygulamada siler ve hiçbir kusur bildirmez.
  • Şablon tarafında uyan 34, sapan 6, raporda görünmeyen 6 / 3 / 3; şablonu alan aygıtların 3’ü model dışı alan taşır ve tam değişimde kaybedecek olan da onlardır.

Sonraki Adım

Bu ders tek bir isteğin tek bir aygıtta ne bıraktığını ölçtü. İşletmede istek tek değildir: bir betik kırk aygıta sırayla bağlanır, her birine aynı şablonu uygular ve sonunda bir rapor yazar. Sonraki ders o betiğin kendisini ölçer — toplu değişikliğin kuru çalışmayla önden hesaplanması, dilimler hâlinde yayılması ve geri alınması. Ve asıl soruyu orada yanıtlarız: şablon uygulandığında kaç aygıt şablonun dışında kalıyor, ve o aygıtların kaçı yazılan raporda görünüyor.

İ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