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 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ı
turda bir kabul edebilir. Varış aralığı ’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 ’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 satırında bu sayı 15,
oysa 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
onaylipolitikasının eskilik penceresi bütün koşumlarda 0 tur,yayilanpolitikası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
onaylipolitikasının beklemesi 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.