---
title: 'Erişilebilirlik Kalıpları'
source: 'https://academia.sh/tr/kurslar/sistem-tasarimina-giris/erisilebilirlik-kaliplari'
course: 'Sistem Tasarımına Giriş'
language: tr
updated: '2026-08-17T18:10:56+00:00'
license: 'CC BY-SA 4.0'
---

# Erişilebilirlik Kalıpları

Etkin–etkin ve etkin–pasif devralmanın kalıp olarak karşılaştırılması: aynı arıza senaryosunda devralma turunun ve o sırada düşen istek sayısının ölçülmesi, etkin–etkin düzende çakışan yazma ile son yazan kazanır kuralının ürettiği kayıp yazmanın sayılması, tur sayılarının kursun varsayım tablosuyla isteğe çevrilmesi ve anahtar sahipliğinin çakışmayı nasıl kaldırdığının gösterilmesi.

Buraya kadarki üç ders aynı örtük varsayımı taşıdı: kopyaların hepsi ayaktadır ve sorun yalnız
aralarındaki bağdan ya da gecikmeden gelir. Bir kopya tamamen düştüğünde soru değişir. Artık
yerine geçecek bir kopyanın bulunması, isteklerin oraya yönlendirilmesi ve bu geçiş sırasında
düşen isteklerin hesaplanması gerekir.

Geçişin nasıl düzenlendiği bir **kalıp** seçimidir ve bu ders iki kalıbı aynı arıza senaryosunda
ölçer. Kalıpların altındaki mekanizmalar başka yerde kuruldu: çoğunluk kuralı, çitleme ve sağlık
denetimi sıklığının yanlış devralmayla ödünleşimi İlişkisel Veritabanı Yönetimi kursunun
konusudur; bir bileşen düştüğünde isteğin geri kalanının yanıtlanabilmesi, yani arıza yalıtımı,
Mimari Biçemler kursunda ölçüldü. Burada ölçülen, kalıbın istek ve yazma cinsinden ne kadar
tuttuğudur.

## İki Kalıp

**Etkin–pasif**: yazmayı yalnız bir kopya kabul eder, öteki hazır bekler. Pasif kopya yazma
almadığı için çakışma olanaksızdır. Etkin kopya düştüğünde yazma kabul eden hiçbir kopya kalmaz;
devralma tamamlanana kadar yazmalar düşer.

**Etkin–etkin**: kopyaların hepsi yazma kabul eder. Bir kopya düştüğünde ötekiler çalışmaya
devam eder, devralma penceresi yoktur. Karşılığında iki kopya aynı anahtara birbirinden habersiz
yazabilir; bu duruma **çakışan yazma** denir ve bir çözüm kuralı gerektirir. Bu dersteki kural
**son yazan kazanır**: aynı pencerede yazılan iki değerden biri seçilir, öteki hiçbir yerde
görünmez.

Gönderi takip servisinde çakışma uydurma bir durum değildir: aynı gönderi bir aktarma noktasında
iki bölgenin tarayıcısından geçebilir ve iki bölge aynı turda yazabilir.

## Düzenek

Model iki bölgeli bir kopya kümesi kurar. Tarama olayları belirli bir bölgede oluşur; `b34`
bölgesi 9. turdan 12. tura kadar erişilemez. Gecikme, algılama ve terfi tur cinsinden model
parametreleridir.

```js
// kalip/model.mjs — iki bolgeli devralma modeli. Tur soyut bir adimdir; gecikme, algilama ve
// terfi tur cinsinden model parametreleridir, olculmus sureler degildir.
export const OLAY = [            // [tur, tarama bolgesi, durum]
  [1, "b34", "kabul"], [2, "b34", "cikis"],
  [3, "b34", "aktarma-34"], [3, "b35", "hat-35"],
  [4, "b34", "aktarma-41"],
  [5, "b34", "dagitim"], [5, "b35", "dagitim-35"],
  [6, "b35", "teslim-denemesi"],
  [7, "b34", "adres-dogrulama"], [7, "b35", "yeniden-dagitim"],
  [8, "b34", "hat-06"], [9, "b34", "aktarma-06"], [10, "b35", "teslim"],
  [11, "b34", "imza"], [12, "b35", "kapali"], [13, "b34", "fatura-hazir"],
  [14, "b34", "fatura-kesildi"], [14, "b35", "fatura-onay"],
  [15, "b35", "arsiv"], [16, "b34", "arsiv-onay"],
];
export const ARIZA = { bolge: "b34", baslangic: 9, bitis: 12 };
const GECIKME = 1, ALGILAMA = 2, TERFI = 1;
const oteki = (b) => (b === "b34" ? "b35" : "b34");
const canli = (bolge, tur) =>
  bolge !== ARIZA.bolge || tur < ARIZA.baslangic || tur > ARIZA.bitis;

export function kosum({ kalip, tur: N }) {
  const s = { kabul: 0, dusen: 0, cakisan: 0, kayipCakisma: 0, kayipYayilmamis: 0, ileti: 0 };
  let ucus = [], etkin = "b34", devralmaBaslangici = null, devralmaTuru = 0;

  for (let tur = 1; tur <= N; tur++) {
    if (tur === ARIZA.baslangic) { // dusen bolgeden cikmis, henuz varmamis yayilimlar kaybolur
      s.kayipYayilmamis += ucus.filter((m) => m.kaynak === ARIZA.bolge).length;
      ucus = ucus.filter((m) => m.kaynak !== ARIZA.bolge);
    }
    ucus = ucus.filter((m) => m.varir !== tur); // varan yayilimlar hedefte gorunur oldu

    if (kalip === "etkin-pasif" && canli(etkin, tur) === false) {
      if (devralmaBaslangici === null) devralmaBaslangici = tur;
      if (tur === devralmaBaslangici + ALGILAMA + TERFI) {
        etkin = oteki(etkin);
        devralmaTuru = ALGILAMA + TERFI;
      }
    }

    const yazan = new Set();
    for (const [, tarama] of OLAY.filter(([t]) => t === tur)) {
      const hedef = kalip === "etkin-pasif" ? etkin
        : (canli(tarama, tur) ? tarama : oteki(tarama));
      if (canli(hedef, tur) === false) { s.dusen += 1; continue; } // kabul edecek kopya yok
      if (hedef !== tarama) s.ileti += 1;   // tarama uzaktaki kopyaya iletildi
      s.kabul += 1;
      s.ileti += 1;                         // kabul eden kopya komsuya yayar
      yazan.add(hedef);
      ucus.push({ kaynak: hedef, hedef: oteki(hedef), varir: tur + GECIKME });
    }
    if (yazan.size === 2) {  // iki bolge ayni turda, birbirini gormeden yazdi
      s.cakisan += 1;
      s.kayipCakisma += 1;   // son yazan kazanir: yenilen yazma hicbir yerde gorunmez
    }
  }
  return { ...s, devralmaTuru, etkin };
}
```

```js
// kalip/olc.mjs — ayni ariza senaryosunda iki kalip: devralma, dusen istek, cakisma, kayip
import { kosum, OLAY, ARIZA } from "./model.mjs";

const TUR = 16;
const s = (x, n) => String(x).padStart(n);
console.log(`${TUR} tur, ${OLAY.length} tarama olayi. ${ARIZA.bolge} bolgesi ` +
  `${ARIZA.baslangic}-${ARIZA.bitis}. turlarda erisilemez.`);
console.log();
console.log("kalip        | kabul | dusen | devralma | cakisan | kayip(cakisma) | kayip(yayilmamis) | ileti");
console.log("-------------|-------|-------|----------|---------|----------------|-------------------|------");
const kayit = {};
for (const kalip of ["etkin-pasif", "etkin-etkin"]) {
  const r = kosum({ kalip, tur: TUR });
  kayit[kalip] = r;
  console.log(`${kalip.padEnd(12)} | ${s(`${r.kabul}/${OLAY.length}`, 5)} | ${s(r.dusen, 5)} | ` +
    `${s(`${r.devralmaTuru} tur`, 8)} | ${s(r.cakisan, 7)} | ${s(r.kayipCakisma, 14)} | ` +
    `${s(r.kayipYayilmamis, 17)} | ${s(r.ileti, 5)}`);
}
console.log();
console.log(`etkin-pasif devralma sonrasi etkin kopya = ${kayit["etkin-pasif"].etkin}`);
console.log(`etkin-etkin: ariza turlarinda dusen istek = ${kayit["etkin-etkin"].dusen}`);
```

```sh
node kalip/olc.mjs
```

```
16 tur, 20 tarama olayi. b34 bolgesi 9-12. turlarda erisilemez.

kalip        | kabul | dusen | devralma | cakisan | kayip(cakisma) | kayip(yayilmamis) | ileti
-------------|-------|-------|----------|---------|----------------|-------------------|------
etkin-pasif  | 17/20 |     3 |    3 tur |       0 |              0 |                 1 |    24
etkin-etkin  | 20/20 |     0 |    0 tur |       4 |              4 |                 1 |    22

etkin-pasif devralma sonrasi etkin kopya = b35
etkin-etkin: ariza turlarinda dusen istek = 0
```

## Sayıların Okunması

Kabul sütunu iki kalıbın ilan ettiği farkı doğruluyor. Etkin–pasif düzen 20 tarama olayının
17'sini kabul etti; devralma 3 tur sürdü ve o üç turda gelen 3 olay düştü. Etkin–etkin düzen
20/20 kabul etti ve arıza turlarında hiçbir istek düşmedi, çünkü `b34` bölgesinin tarayıcıları
`b35`'e yönlendi.

Düşen üç olayın hangileri olduğu önemlidir: 9. turda `aktarma-06`, 10. turda `teslim`, 11. turda
`imza`. Bunların ikisi `b35` bölgesinde oluşan taramalardı ve o bölge ayaktaydı — yine de
düştüler. Sebep, pasif kopyanın tanımıdır: yazma kabul etmez. Etkin–pasif düzende bir bölgenin
ayakta olması, yazmasının kabul edileceği anlamına gelmez.

Çakışma sütunu bedelin nereye taşındığını gösteriyor. Etkin–etkin düzende 3, 5, 7 ve 14.
turlarda iki bölge aynı anahtara birbirini görmeden yazdı: 4 çakışma. Son yazan kazanır kuralı
her çakışmada bir yazmayı sildi, yani 4 kayıp yazma. Bu sayı etkin–pasif düzende 0'dır ve
karşılığında orada 3 düşen istek vardır. İki kalıp aynı arızayı ayrı yerde ödüyor: biri kesinti
olarak, öteki kaybolan veri olarak.

Son iki sütun iki kalıbın **ortak** maliyetini gösteriyor. `kayip(yayilmamis)` her iki kalıpta da
1: `b34` bölgesi düştüğünde ondan çıkmış ama henüz karşıya varmamış bir yayılım vardı ve o
kayboldu. Bu, kalıptan değil eşzamansız yayılımdan gelir; senkron onay seçilse bu sayı 0 olurdu
ve bedeli PACELC dersinde ölçülen bekleme olurdu. İleti sayıları da yakındır (24'e karşı 22);
etkin–etkin düzendeki fazlalık, tarama uzaktaki kopyaya iletildiğinde eklenen atlamalardan
gelir. Yani kalıp seçimi bir ileti tasarrufu kararı değildir.

## Turların İsteğe Çevrilmesi

Tur soyut bir adımdır. Sayıları isteğe çevirmek için iki varsayım gerekir: bir turun kaç saniyeye
karşılık geldiği ve yılda kaç devralma olduğu. Hacim sayıları Kabaca Büyüklük Hesabı dersinin
varsayım tablosundan gelir ve burada yeniden hesaplanır.

```js
// kalip/butce.mjs — modelin tur sayilarini kursun varsayim tablosuyla istege cevirir
const V = { gunlukKullanici: 2_000_000, kullaniciBasinaSorgu: 6, gunlukGonderi: 400_000,
  gonderiBasinaOlay: 7, tepeCarpani: 3 };            // Kabaca Buyukluk Hesabi dersi: V1-V4, V8
const YIL = 365 * 24 * 3600, GUN = 86_400;
const TUR_SANIYE = 1;                                 // varsayim: bir tur bir saniyeye karsilik gelir
const DEVRALMA_YIL = 6;                               // varsayim: yilda kac devralma
const CIFT_TARAMA = 0.05;                             // varsayim: iki bolgede birden uretilen olay orani

const tepeYazma = (V.gunlukGonderi * V.gonderiBasinaOlay / GUN) * V.tepeCarpani;
const tepeUc = tepeYazma + (V.gunlukKullanici * V.kullaniciBasinaSorgu / GUN) * V.tepeCarpani;
console.log(`tepe yazma = ${tepeYazma.toFixed(2)} istek/s, tepe uc = ${tepeUc.toFixed(2)} istek/s`);
console.log();
for (const devralmaTuru of [3, 5]) {
  const sn = devralmaTuru * TUR_SANIYE;
  const yillik = sn * DEVRALMA_YIL;
  console.log(`etkin-pasif, devralma ${devralmaTuru} tur (${sn} sn):`);
  console.log(`  pencerede dusen yazma = ${(sn * tepeYazma).toFixed(2)}, dusen uc istegi = ${(sn * tepeUc).toFixed(2)}`);
  console.log(`  yilda ${DEVRALMA_YIL} devralma -> ${yillik} sn, hizmet erisilebilirligi = ` +
    `%${(100 * (1 - yillik / YIL)).toFixed(5)}`);
}
console.log();
for (const oran of [CIFT_TARAMA, CIFT_TARAMA * 2]) {
  const cakisan = V.gunlukGonderi * V.gonderiBasinaOlay * oran;
  console.log(`etkin-etkin, cift tarama orani ${oran.toFixed(2)}: cakisan yazma = ${cakisan}/gun, ` +
    `son yazan kazanir -> kayip yazma = ${cakisan}/gun`);
}
```

```
tepe yazma = 97.22 istek/s, tepe uc = 513.89 istek/s

etkin-pasif, devralma 3 tur (3 sn):
  pencerede dusen yazma = 291.67, dusen uc istegi = 1541.67
  yilda 6 devralma -> 18 sn, hizmet erisilebilirligi = %99.99994
etkin-pasif, devralma 5 tur (5 sn):
  pencerede dusen yazma = 486.11, dusen uc istegi = 2569.44
  yilda 6 devralma -> 30 sn, hizmet erisilebilirligi = %99.99990

etkin-etkin, cift tarama orani 0.05: cakisan yazma = 140000/gun, son yazan kazanir -> kayip yazma = 140000/gun
etkin-etkin, cift tarama orani 0.10: cakisan yazma = 280000/gun, son yazan kazanir -> kayip yazma = 280000/gun
```

Etkin–pasif kalıbın devralma penceresi bütçeden çok az yer tutuyor: yılda 6 devralma 18 saniye
eder ve hizmet erişilebilirliğini yüzde 99,99994'te bırakır. Devralma 5 tura çıksa 30 saniye ve
yüzde 99,99990 olur. Bütçe açısından bu kalıp neredeyse bedavadır. Bedel yıllık yüzdede değil,
tek bir pencerede toplanır: her devralmada 291,67 durum olayı ve uçta 1.541,67 istek düşer, hepsi
üç saniyenin içinde. Kesinti bütçesi ortalamayı ölçer, tek pencerede yoğunlaşan bir kaybı
ölçmez.

Etkin–etkin kalıbın sayısı bambaşka bir mertebede. Çift tarama oranı yüzde 5 varsayıldığında
günde 140.000 çakışan yazma çıkıyor ve son yazan kazanır kuralı bunların hepsini kayıp yazmaya
çeviriyor; oran iki katına çıkınca 280.000 oluyor. Bu kayıp bir kesinti değildir, bütçede
görünmez ve kendini bir hata olarak duyurmaz — yalnız bazı gönderilerin durum geçmişinde bir
adım eksik kalır.

## Kalıbın Seçimi ve Anahtar Sahipliği

Ölçülen sayılar seçimi akış başına belirliyor. Taşıyıcı durum olayları için etkin–pasif kalıp
yerindedir: üç saniyelik pencerede düşen 291,67 olay taşıyıcı tarafından yeniden gönderilebilir,
oysa kaybolan bir durum güncellemesi geri getirilemez. Gün sonu ücretlendirmesi için de aynısı
geçerlidir; ücretlendirme eksik durum geçmişiyle yanlış fatura üretir. Takip sorgusu ise okumadır
ve iki kalıpta da pasif kopyadan karşılanabilir — okuma için devralma penceresi diye bir şey
yoktur.

Etkin–etkin kalıbın çakışma maliyeti kalıbın zorunlu parçası değildir. Çakışma, aynı anahtara iki
bölgenin yazmasından doğar; yazma anahtara göre tek bir bölgeye yönlendirilirse — bu kalıba
**anahtar sahipliği** eklenmesi denir — çakışan yazma 0'a iner ve her bölge kendi anahtar
kümesinin etkin kopyası olur. Bu düzenlemede sistem bir bütün olarak etkin–etkindir, tek bir
anahtar için etkin–pasiftir. Ölçümdeki 4 çakışma, sahiplik kuralı olmadığında ortaya çıkan
sayıdır; kalıbın kaçınılmaz bedeli değil, eksik bir kararın sonucudur.

## Özet

- Etkin–pasif kalıpta yazmayı tek kopya kabul eder: çakışma 0, ama etkin kopya düştüğünde
  devralma tamamlanana kadar yazma kabul edilmez.
- Aynı arıza senaryosunda etkin–pasif düzen 17/20 olay kabul etti, devralma 3 tur sürdü ve 3
  olay düştü; düşenlerin ikisi ayakta olan bölgede oluşmuştu, çünkü pasif kopya yazma almaz.
- Etkin–etkin düzen 20/20 kabul etti ve arıza turlarında hiç istek düşmedi; karşılığında 4
  çakışan yazma oluştu ve son yazan kazanır kuralı 4 yazmayı sildi.
- Eşzamansız yayılımın kaybı iki kalıpta da aynı çıktı (1 yayılmamış yazma); bu maliyet kalıptan
  değil yazma politikasından gelir.
- Varsayımlarla çevrildiğinde etkin–pasif devralma yılda 18 saniye tutuyor (yüzde 99,99994) ama
  her pencerede 291,67 durum olayı ve 1.541,67 uç isteği düşürüyor; kesinti bütçesi tek pencerede
  yoğunlaşan kaybı ölçmez.
- Çakışma kalıbın zorunlu bedeli değildir: anahtar sahipliği eklendiğinde her anahtarın tek bir
  etkin kopyası olur ve çakışan yazma 0'a iner.

## Kurs Kapanışı

Kurs bir tasarım problemini iki adımda ele aldı. **Yaklaşım** konusu tek satırlık bir isteği
gereksinime ayırdı: bileşen sınırları, sözleşmeler ve nitelik eşikleri ayrıldı, on bir sorunun
beşinin yanıtlı olduğu sayıldı, kapsam daraltmasıyla bileşen 12'den 5'e indirildi ve varsayım
tablosundan uçta tepe 513,89 istek/s ile günde 976 MB veri artışı hesaplandı. Konunun son dersi
tasarımı anlatmanın biçimini verdi: beş alanlı karar kaydı ve kenarları hesaptan etiketlenen bir
diyagram — aynı akış sol kenarda 416,67 istek/s, sağ kenarda 41,67 istek/s taşıyor.

**Temel Nitelikler** konusu bu tahminlerin üzerine niteliklerin her birini sayıya döktü: gecikme
ile verimin bağımsızlığı, eşzamanlılık artarken verimin doğrusala yakın büyümesi ve ortanca
gecikmenin neredeyse sabit kalmasıyla ölçüldü; başarım ile ölçeklenebilirliğin farkı ve yatay ile dikey ölçeklemenin
sınırları ayrıldı; hizmet erişilebilirliği bir bütçeye çevrildi; bütçenin neden harcandığı CAP
teoremiyle adlandırıldı; bölünme dışındaki gecikme ödünleşimi PACELC ile ayrıldı; tutarlılık
modelleri yakınsama ve monotonik okuma cinsinden ayrıldı; devralma iki kalıp olarak ölçüldü.

Kursun asıl kuralı bu sayıların yanında durdu. Her sayının bir **sınıfı** yazıldı: **varsayım**
seçilen bir girdidir ve duyarlılığı gösterilir — günlük etkin kullanıcı 2.000.000 böyle bir
sayıdır ve iki katına çıktığında uçtaki tepe 1,81 katına çıkar. **Hesap** varsayımlardan
aritmetikle çıkar ve `node` ile üretilir — tepe okuma 416,67 istek/s, saklanan veri 712,48 GB,
bu dersteki 1.541,67 düşen istek. **Ölçüm** bir düzenekten çıkar ve ortama bağlılığı işaretlenir
— eşzamanlılık düzeneğinden çıkan verim üst sınırı ile son üç dersin süreç içi model koşumları:
12 turluk bölünmede 6 reddedilen istek, üç kopyalı modelde 8 monotonik okuma ihlali ve bu
derste 4 çakışan yazma. Sınıfsız bir sayı karar taşımaz; kursun ilk dersinde dört karardan biri
bu yüzden denetlenemez sayılmıştı.

Kursun bıraktığı soru bir katman aşağıdadır. Bütün nitelikler tanımlandı, eşikler kondu ve
kalıplar seçildi; ama istek daha sisteme **girmedi**. Takip sorgusu bir alan adının çözülmesiyle
başlar, bir kenar önbelleğinden geçebilir, bir yük dengeleyiciye düşer ve bir ağ geçidinden
uygulamaya ulaşır. Bu yolun hiçbir parçası bu kursta tasarlanmadı — hesapta önbellek yalnız bir
çarpandı, yönlendirme ise modelde tek satırlık bir seçimdi. Sonraki kurs **Trafik Katmanı** o
yolu ele alır: isteğin uygulamaya varmadan önce geçtiği her durak, orada verilen kararlar ve o
kararların bu kursta hesaplanan sayıları nasıl değiştirdiği.
