İçeriğe geç
academia.sh

Ders 11 / 13

PACELC

Bölünme dışındaki gecikme ödünleşimi: CAP teoreminin sustuğu bölgenin adlandırılması, bölünme yokken senkron onay ile eşzamansız yayma politikalarının onay bekleme adımı, yazma başına ileti sayısı ve okumada görülen eskilik penceresi bakımından ölçülmesi, varış aralığı ile gecikme varsayımlarının duyarlılığının gösterilmesi ve bir sistemin iki dalda ayrı ayrı sınıflandırılması.

İçindekiler

Önceki dersin ölçümünde bir sütun açıklanmadan kaldı. Reddetme politikası 12 ileti, yanıt verme politikası 6 ileti harcadı; fark, yanıtlanan her okumanın komşuya doğrulatılmasından geliyordu ve bu iletiler bağ açıkken de gönderildi. Yani tutarlılıkla ilgili karar, ağ hiç bölünmese bile bitmiyor.

CAP teoremi bu bölgede sessizdir: bölünme yoksa teoremin diyeceği bir şey yoktur. Oysa karar oradadır ve her istekte ödenir. PACELC teoremi CAP’in sustuğu yeri doldurur ve bu dersin konusu odur.

Teoremin İkinci Dalı

PACELC iki dallı bir cümledir. Birinci dal CAP’in söylediğidir: bölünme (P) varsa hizmet erişilebilirliği (A) ile tutarlılık (C) arasında seçim yapılır. İkinci dal yenidir: başka durumda (E, else — yani bölünme yokken) gecikme (L, latency) ile tutarlılık (C) arasında seçim yapılır.

İkinci dalın gerekçesi basit bir olgudur: bir kopyanın elindeki değerin en güncel değer olduğunu doğrulaması, komşusuyla konuşmasını gerektirir. Bu konuşma ağ üzerinden geçer ve bir bedeli vardır. Bedel bölünmeye bağlı değildir; bağ sapasağlam olsa da her doğrulama bir gidiş dönüş ister. Bu yüzden tutarlılık, kesinti yokken de ücretsiz değildir; yalnız ödenen para birimi değişir — reddedilen istek değil, beklenen zaman.

Bölünme Yokken İki Yazma Politikası

Ölçülecek seçim yazma yolundadır. Taşıyıcıdan gelen bir durum olayı iki biçimde ele alınabilir: her yazmayı iki kopyaya da onaylatmak (onayli) ya da bir kopyaya yazıp taşıyıcıya hemen onay verip komşuya sonra yaymak (yayilan). Aşağıdaki model bu iki politikayı aynı olay dizisiyle koşturur. Bağ hiç kesilmez.

Bu bir modeldir, ölçüm değil: tur soyut bir zaman adımıdır, gecikme D tur cinsinden bir parametredir ve hiçbir yerde saat okunmaz. Bu yüzden çıktı her koşumda aynıdır.

// pacelc/model.mjs — bolunme YOKKEN iki yazma politikasi. Tur soyut bir zaman adimidir;
// gecikme D tur cinsinden bir model parametresidir, olculmus bir sure degildir. Ayni takip
// numarasina gelen olaylar siralidir, bu yuzden ucusta tek yazma bulunur.
export function kosum({ tur: N, gecikme: D, aralik, politika }) {
  const yazma = new Map(); // yazmaNo -> { gelis, kabul, gorunur }
  const kuyruk = [];
  let ucus = null, ileti = 0, sira = 0;

  for (let t = 1; t <= N; t++) {
    if ((t - 1) % aralik === 0) {
      sira += 1;
      yazma.set(sira, { gelis: t, kabul: null, gorunur: null });
      kuyruk.push(sira);
    }
    if (politika === "onayli") {
      if (ucus !== null && ucus.biter === t) {
        const y = yazma.get(ucus.no);
        y.kabul = t;      // onay geldi: yazma ayni turda iki kopyada gorunur olur
        y.gorunur = t;
        ileti += 2;       // gidis + onay
        ucus = null;
      }
      if (ucus === null && kuyruk.length > 0) ucus = { no: kuyruk.shift(), biter: t + 2 * D };
    } else {
      while (kuyruk.length > 0) {
        const y = yazma.get(kuyruk.shift());
        y.kabul = t;      // yerel kopyaya yazildi, tasiyiciya hemen onay verildi
        y.gorunur = t + D; // komsuya D tur sonra ulasir
        ileti += 1;
      }
    }
  }

  const tumu = [...yazma.values()];
  const kabuller = tumu.filter((y) => y.kabul !== null);
  const gorunenler = kabuller.filter((y) => y.gorunur <= N);
  const enBuyuk = (a, f) => Math.max(0, ...a.map(f));
  const ort = (a, f) => (a.length === 0 ? 0 : a.reduce((t, y) => t + f(y), 0) / a.length);
  return {
    gelen: tumu.length, kabul: kabuller.length, ileti,
    beklemeOrt: ort(kabuller, (y) => y.kabul - y.gelis),
    iletiPerYazma: kabuller.length === 0 ? 0 : ileti / kabuller.length,
    eskilikMax: enBuyuk(gorunenler, (y) => y.gorunur - y.kabul),
    uctanUcaMax: enBuyuk(gorunenler, (y) => y.gorunur - y.gelis),
  };
}

Modelin ölçtüğü dört sayı ayrı ayrı tanımlanmalıdır. Bekleme, olayın geldiği tur ile taşıyıcıya onay verildiği tur arasındaki farktır. Eskilik penceresi, bir yazmanın onaylandığı tur ile ikinci kopyada görünür olduğu tur arasındaki farktır. Uçtan uca, olayın geldiği tur ile ikinci kopyada görünür olduğu tur arasındaki farktır. İleti, kabul edilmiş yazma başına harcanan ileti sayısıdır.

// pacelc/olc.mjs — E dalindaki odunlesim: iki politika, iki varis araligi, uc gecikme degeri
import { kosum } from "./model.mjs";

const TUR = 24;
const s = (x, n) => String(x).padStart(n);
console.log(`bolunme yok. ${TUR} tur. varis araligi ve gecikme D varsayimdir; tur soyut bir adimdir.`);
console.log();
console.log("aralik | D | politika | kabul | bekleme ort | bekleyen | ileti/yazma | eskilik | uctan uca");
console.log("-------|---|----------|-------|-------------|----------|-------------|---------|----------");
for (const aralik of [1, 4]) {
  for (const D of [1, 2, 4]) {
    for (const politika of ["onayli", "yayilan"]) {
      const r = kosum({ tur: TUR, gecikme: D, aralik, politika });
      console.log(`${s(aralik, 6)} | ${s(D, 1)} | ${politika.padEnd(8)} | ` +
        `${s(`${r.kabul}/${r.gelen}`, 5)} | ${s(r.beklemeOrt.toFixed(1), 11)} | ` +
        `${s(r.gelen - r.kabul, 8)} | ${s(r.iletiPerYazma.toFixed(2), 11)} | ` +
        `${s(`${r.eskilikMax} tur`, 7)} | ${s(`${r.uctanUcaMax} tur`, 9)}`);
    }
  }
}
node pacelc/olc.mjs
bolunme yok. 24 tur. varis araligi ve gecikme D varsayimdir; tur soyut bir adimdir.

aralik | D | politika | kabul | bekleme ort | bekleyen | ileti/yazma | eskilik | uctan uca
-------|---|----------|-------|-------------|----------|-------------|---------|----------
     1 | 1 | onayli   | 11/24 |         7.0 |       13 |        2.00 |   0 tur |    12 tur
     1 | 1 | yayilan  | 24/24 |         0.0 |        0 |        1.00 |   1 tur |     1 tur
     1 | 2 | onayli   |  5/24 |        10.0 |       19 |        2.00 |   0 tur |    16 tur
     1 | 2 | yayilan  | 24/24 |         0.0 |        0 |        1.00 |   2 tur |     2 tur
     1 | 4 | onayli   |  2/24 |        11.5 |       22 |        2.00 |   0 tur |    15 tur
     1 | 4 | yayilan  | 24/24 |         0.0 |        0 |        1.00 |   4 tur |     4 tur
     4 | 1 | onayli   |   6/6 |         2.0 |        0 |        2.00 |   0 tur |     2 tur
     4 | 1 | yayilan  |   6/6 |         0.0 |        0 |        1.00 |   1 tur |     1 tur
     4 | 2 | onayli   |   5/6 |         4.0 |        1 |        2.00 |   0 tur |     4 tur
     4 | 2 | yayilan  |   6/6 |         0.0 |        0 |        1.00 |   2 tur |     2 tur
     4 | 4 | onayli   |   2/6 |        10.0 |        4 |        2.00 |   0 tur |    12 tur
     4 | 4 | yayilan  |   6/6 |         0.0 |        0 |        1.00 |   4 tur |     4 tur

Sayıların Okunması

En temiz iki sütun eskilik ve iletidir. onayli politikasının eskilik penceresi altı koşumun altısında 0 tur; yayilan politikasının eskilik penceresi tam olarak D tur — 1, 2 ve 4. Bu, ikinci dalın tanımını sayıya çeviriyor: eşzamansız yayma, tutarlılığı gecikme parametresi kadar bir pencereyle takas eder. Karşılığında ileti sayısı yazma başına 2,00’dan 1,00’a iner. Onay iletisi, tutarlılığın kesinti yokken de ödenen ücretidir.

Bekleme sütunu ücretin kime kesildiğini gösteriyor. yayilan politikasında bekleme her koşumda 0,0 tur: taşıyıcı onayını hemen alır. onayli politikasında bekleme, varış aralığı 4 olan koşumlarda tam olarak 2D2D turdur — 2,0 ve 4,0. Yani seyrek varışta senkron onayın bedeli öngörülebilir ve sabittir.

Varış aralığı 1 olan koşumlar bambaşka bir şey gösteriyor. Orada bekleme 7,0’a, 10,0’a ve 11,5’e çıkıyor ve bekleyen sütunu 13, 19, 22 oluyor. Sebep şudur: aynı takip numarasına gelen olaylar sıralı olmak zorundadır, bu yüzden uçuşta tek bir yazma bulunur ve politika her yazmayı 2D2D turda bir kabul edebilir. Varış aralığı 2D2D’nin altına düştüğünde kuyruk büyür. Bu, Gecikme ve Verim dersindeki bağımsızlığın aynısıdır: yazma başına gecikme 2D2D’de sabit kalırken verim düşer ve düşen verim beklemeyi büyütür. Kuyruğun ne yapılacağı — reddetmek, yavaşlatmak, geri basınç uygulamak — Önbellekleme, Kuyruklar ve Eşzamansız İşleme kursunun konusudur ve burada yeniden ele alınmaz.

uctan uca sütununda bir okuma tuzağı var. Varış aralığı 1 ve D=4D = 4 satırında bu sayı 15, oysa D=2D = 2 satırında 16. Sayı küçüldüğü için durum iyileşmiş değildir: sütun yalnız kabul edilmiş yazmalar üzerinden hesaplanıyor ve o satırda 24 olayın yalnız 2’si kabul edildi. Kuyrukta kalan 22 olayın uçtan uca gecikmesi henüz tanımlı değildir. Doluluğa yaklaşan bir düzenekte gecikme ortalaması yanıltıcı olur; bekleyen sütunu okunmadan gecikme sütunu okunmamalıdır.

Son olarak onayli politikasının uçtan uca sayısının 0 olmadığına dikkat edilmelidir. Senkron onay, okuyucunun gerçeği daha çabuk görmesini sağlamaz; sistemin henüz doğrulayamadığı bir şeyi söz vermemesini sağlar. Eskilik penceresi 0 çıkıyor çünkü ölçü, sistemin verdiği sözle okunan değer arasındadır. Olay ile okunan değer arasındaki mesafe kapanmaz, yalnız görünmez olur.

İki Dalın Ayrı Sınıflandırılması

Bir sistem tek harfle değil, iki dal için ayrı ayrı adlandırılır. Önceki dersin okuma politikaları ile bu dersin yazma politikaları dört bileşim üretir.

Sınıf Bölünmede Bölünme dışında Politika çifti
PC/EC tutarlılık tutarlılık reddet + onayli
PA/EL hizmet erişilebilirliği gecikme yanit-ver + yayilan
PC/EL tutarlılık gecikme reddet + yayilan
PA/EC hizmet erişilebilirliği gecikme yerine tutarlılık yanit-ver + onayli

Üçüncü satır ilk bakışta tuhaf görünür ama tutarlı bir tasarımdır: bağ açıkken yazmalar eşzamansız yayılır, bağ kesildiğinde okuma reddedilir. Sistem hızlıdır ve bölünmede yanlış söylemek yerine susar; ödediği bedel, bağ açıkken de D turluk bir eskilik penceresidir.

Sınıflandırma yine sistem geneli için değil, akış başına yapılır. Gönderi takip servisinde takip sorgusu PA/EL dalını, gün sonu ücretlendirmesi PC/EC dalını seçebilir; ikisi aynı kopyaların üzerinde çalışır. Ücretlendirmenin bir gönderiyi eski durumuyla faturalaması, iki turluk bir pencerede bile yanlış fatura üretir; takip sorgusunun iki tur eski bir durum göstermesi katlanılır bir hatadır.

Özet

  • PACELC iki dallı bir cümledir: bölünme (P) varsa hizmet erişilebilirliği (A) ile tutarlılık (C) arasında, başka durumda (E) gecikme (L) ile tutarlılık (C) arasında seçim yapılır.
  • Modelde onayli politikasının eskilik penceresi bütün koşumlarda 0 tur, yayilan politikasının eskilik penceresi tam olarak gecikme parametresi kadar — 1, 2 ve 4 tur — çıktı.
  • Tutarlılığın bölünme dışındaki ücreti ileti sütununda göründü: yazma başına 2,00 ileti karşısında 1,00 ileti.
  • Varış aralığı 4 iken onayli politikasının beklemesi 2D2D turda sabit kaldı (2,0 ve 4,0); varış aralığı 1’e indiğinde kuyruk büyüdü ve bekleme 7,0’dan 11,5’e çıktı, bekleyen olay 13’ten 22’ye yükseldi.
  • Senkron onay okuyucunun gerçeği daha çabuk görmesini sağlamaz; uçtan uca gecikme kalır, yalnız sistem doğrulayamadığı değeri söz olarak vermez.
  • Sınıflandırma iki dal için ayrı ve akış başına yapılır: takip sorgusu PA/EL, ücretlendirme PC/EC dalında olabilir.

Sonraki Adım

Bu dersin ölçümünde eskilik penceresi tek bir sayıya indi: 0 ya da D tur. Bu, sorunun yalnız kaba hâlidir. Bir okuyucunun D turluk bir pencerede ne göreceği, pencerenin genişliğinden çok hangi güvencenin verildiğine bağlıdır. Aynı gönderiyi iki istemci aynı anda sorduğunda farklı durum görebilir; bir istemci ilerleyen bir durum dizisi yerine geri giden bir dizi görebilir; kendi yazdığı olayı sonraki sorgusunda bulamayabilir. Bunların hepsi aynı D penceresinin içinde olur ve hiçbiri ötekinin yerine geçmez. Sonraki ders bu güvenceleri adlandırır: güçlü, zayıf ve sonunda tutarlılık; aynı olay dizisi üç okuma politikasıyla okunur ve farklı değer görme sayısı, yakınsama için gereken tur sayısı ile monotonik okuma ihlali sayılır.

İ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