---
title: PACELC
source: 'https://academia.sh/tr/kurslar/sistem-tasarimina-giris/pacelc'
course: 'Sistem Tasarımına Giriş'
language: tr
updated: '2026-08-17T18:10:57+00:00'
license: 'CC BY-SA 4.0'
---

# 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ı.

Ö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.

```js
// 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.

```js
// 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)}`);
    }
  }
}
```

```sh
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 $2D$ 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ı $2D$
turda bir kabul edebilir. Varış aralığı $2D$'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 $2D$'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 = 4$ satırında bu sayı 15,
oysa $D = 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 $2D$ 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.
