---
title: 'Dış Yapılandırma Deposu'
source: 'https://academia.sh/tr/kurslar/dayaniklilik-kaliplari/dis-yapilandirma-deposu'
course: 'Dayanıklılık ve Güvenilirlik'
language: tr
updated: '2026-08-17T18:10:59+00:00'
license: 'CC BY-SA 4.0'
---

# Dış Yapılandırma Deposu

Çalışma zamanı ayarlarının merkezileştirilmesi: bir değişikliğin üç kopyaya 25 saniyede yayılması, önbelleğin depo okumasını 5139 kat düşürmesi, yanlış bir değerin kademeli yaymada 61.668 yerine 20.556 hatalı yanıt üretmesi ve depo düştüğünde son bilinen değerle çalışmanın 40 saniyelik eşdeğer kesintiyi sıfıra indirmesi.

Önceki üç dersin kararları koda gömülü sayılarla duruyor: kanıtın yaşam süresi bir sabit,
anahtar süresi bir sabit, aktarım havuzunun boyu bir sabit, tekillik defterinin penceresi bir
sabit. Bir arıza sırasında anahtar süresini kısaltmak ya da kanıt yolunu tümden kapatmak
gerekirse tek yol yeniden dağıtımdır ve yeniden dağıtım K01'in aylık 43,2 dakikalık kesinti
bütçesindeki 15,0 dakikalık planlı paydan yer alır.

**Dış yapılandırma deposu** (external configuration store), çalışma zamanı ayarlarını uygulama
biriminin dışında tek bir yerde tutan ve kopyaların oradan okuduğu yerleşimdir. Backend kursu
yapılandırmanın şemayla tanımlanmasını, açılışta doğrulanmasını ve gizli değerin ayrılmasını
kurdu; burada o kurallar tekrarlanmaz. Bu dersin sorusu **çalışma zamanıdır**: bir değişiklik
kopyalara ne kadar sürede yayılır, önbellek deponun yükünü ne kadar düşürür, depo düştüğünde ne
olur ve yanlış konan bir değer kaç kopyaya bulaşır.

## Yayılma ve Karışık Pencere

Düzenek süreç içi bir modeldir: gerçek depo, ağ ve kopya süreci yoktur; zaman modellenmiş
saniyelerle ilerler ve hiçbir sayı bu makinenin hızına bağlı değildir. Kopya sayısı ve kopya
başına istek hızı Uygulama Katmanı ve Servis Etkileşimi kursundaki Durumsuz Servisler dersinden
alınır: 3 kopya, kopya başına 171,30 istek/s.

**DD16 — yenileme aralığı 30 saniye.** Gerekçesi: bir ayarın yürürlüğe girmesi için beklenebilir
en uzun süre bir dakikanın altında tutulur. Duyarlılığı 5 ve 300 saniyeyle verilir.
**DD17 — yanlış bir değerin fark edilme süresi 120 saniye.** Gerekçesi: yanlış değer bir hata
oranı sıçraması olarak görünür ve doğrulanması zaman alır; farkın nasıl edileceği bu kursun
konusu değildir, Başarım Karşıt Kalıpları ve İzleme kursuna aittir.

```js
// yapilandirma/depo.mjs — dis yapilandirma deposunun ve kopya onbelleklerinin surec ici modeli.
// Gercek depo, ag ve kopya sureci yoktur; zaman modellenmis saniyelerle ilerler, sayaclar aciktir.

// yayma: "hepsine" = deger butun kopyalar icin gecerli; "kademeli" = once 0. kopya, dogrulanirsa otekiler
export function hedef(kopyaNo, t, { yayma, yanlisAn, farkEtme }) {
  const pencerede = t >= yanlisAn && t < yanlisAn + farkEtme;
  if (yayma === "kademeli") return kopyaNo === 0 && pencerede ? "yanlis" : "dogru";
  return pencerede ? "yanlis" : "dogru";
}

export function kos(a) {
  const { sure, kopya, aralik, kayma, hizKopya, dusAn, kalkAn, yenidenAn, diskOnbellek } = a;
  const deger = Array.from({ length: kopya }, () => "dogru");
  const ayakta = Array.from({ length: kopya }, () => true);
  const s = { hataliYanit: 0, dusenIstek: 0, depoOkuma: 0, basarisizOkuma: 0,
    ilkGorme: -1, sonGorme: -1, karisik: 0, yayilma: -1 };

  for (let t = 0; t < sure; t += 1) {
    if (t === yenidenAn)                         // devralma sonrasi bir kopya yeniden basliyor
      ayakta[kopya - 1] = diskOnbellek || !(t >= dusAn && t < kalkAn);
    if (t >= kalkAn && !ayakta[kopya - 1]) ayakta[kopya - 1] = true;
    for (let k = 0; k < kopya; k += 1) {
      if (t >= k * kayma && (t - k * kayma) % aralik === 0) {
        s.depoOkuma += 1;
        if (t >= dusAn && t < kalkAn) s.basarisizOkuma += 1;   // son bilinen deger korunur
        else deger[k] = hedef(k, t, a);
      }
      if (!ayakta[k]) { s.dusenIstek += hizKopya; continue; }
      if (deger[k] === "yanlis") s.hataliYanit += hizKopya;
    }
    const n = deger.filter((d) => d === "yanlis").length;
    const beklenen = deger.map((_, k) => hedef(k, t, a)).filter((d) => d === "yanlis").length;
    if (n > 0 && s.ilkGorme < 0) s.ilkGorme = t;
    if (n > 0) s.sonGorme = t;
    if (n > 0 && n < kopya) s.karisik += 1;
    if (s.yayilma < 0 && beklenen > 0 && n === beklenen) s.yayilma = t - a.yanlisAn;
  }
  return s;
}
```

```js
// yapilandirma/olc.mjs — yanlis bir degerin bulasma kapsami ve deponun dusmesindeki davranis
import { kos } from "./depo.mjs";

const KOPYA = 3, HIZ_KOPYA = 171.30;             // M19/K03: 3 kopya, kopya basina 171,30 istek/s
const UC_TEPE = 513.89, BUTCE = 28.2 * 60;       // K01: uctaki tepe istek/s, aylik ariza payi
const ARALIK = 30, FARK = 120, SURE = 600;       // DD16 yenileme araligi, DD17 fark etme suresi
const TABAN = { sure: SURE, kopya: KOPYA, aralik: ARALIK, hizKopya: HIZ_KOPYA, yanlisAn: 65,
  farkEtme: FARK, dusAn: SURE, kalkAn: SURE, yenidenAn: -1, diskOnbellek: true };

console.log(`${KOPYA} kopya, kopya basina ${HIZ_KOPYA} istek/s (M19/K03), uctaki tepe ${UC_TEPE}`);
console.log(`DD16 yenileme araligi ${ARALIK} s, DD17 fark edilme suresi ${FARK} s; ` +
  `yanlis deger 65. saniyede yaziliyor`);
console.log(`\n${"yayma".padEnd(10)}${"kayma".padStart(7)}${"yayilma".padStart(9)}` +
  `${"ilk gorme".padStart(11)}${"son gorme".padStart(11)}${"karisik s".padStart(11)}` +
  `${"hatali yanit".padStart(14)}${"bulasan kopya".padStart(15)}`);
for (const yayma of ["hepsine", "kademeli"])
  for (const kayma of [0, 10]) {
    const r = kos({ ...TABAN, yayma, kayma });
    console.log(`${yayma.padEnd(10)}${String(kayma).padStart(7)}${String(r.yayilma).padStart(9)}` +
      `${String(r.ilkGorme).padStart(11)}${String(r.sonGorme).padStart(11)}` +
      `${String(r.karisik).padStart(11)}${r.hataliYanit.toFixed(0).padStart(14)}` +
      `${String(yayma === "hepsine" ? KOPYA : 1).padStart(15)}`);
  }

// Depo dusmesi: 200. saniyede dusuyor, 180 s kapali; 260. saniyede bir kopya yeniden basliyor.
console.log(`\ndepo dusmesi: 180 s kapali; 260. saniyede bir kopya devralma sonrasi yeniden basliyor`);
console.log(`${"davranis".padEnd(24)}${"basarisiz okuma".padStart(17)}${"dusen istek".padStart(13)}` +
  `${"esdeger kesinti s".padStart(19)}${"ariza payinin".padStart(15)}`);
for (const [ad, diskOnbellek] of [["son bilinen degerle", true], ["depo zorunlu", false]]) {
  const r = kos({ ...TABAN, yayma: "hepsine", kayma: 10, yanlisAn: SURE,
    dusAn: 200, kalkAn: 380, yenidenAn: 260, diskOnbellek });
  const kesinti = r.dusenIstek / UC_TEPE;        // uctaki tepe hiza gore esdeger kesinti saniyesi
  console.log(`${ad.padEnd(24)}${String(r.basarisizOkuma).padStart(17)}` +
    `${r.dusenIstek.toFixed(0).padStart(13)}${kesinti.toFixed(2).padStart(19)}` +
    `${`%${((100 * kesinti) / BUTCE).toFixed(2)}`.padStart(15)}`);
}

console.log(`\n${"DD16".padStart(8)}${"depo okuma/s".padStart(14)}${"en kotu yayilma".padStart(17)}` +
  `${"hatali yanit ust siniri".padStart(25)}`);
for (const a of [5, 30, 300])
  console.log(`${`${a} s`.padStart(8)}${(KOPYA / a).toFixed(4).padStart(14)}` +
    `${`${a} s`.padStart(17)}${(UC_TEPE * (FARK + a)).toFixed(0).padStart(25)}`);
console.log(`her istekte okunsaydi depo okuma ${UC_TEPE}/s; DD16 = ${ARALIK} s ile ` +
  `${(UC_TEPE / (KOPYA / ARALIK)).toFixed(0)} kat az`);
```

```
3 kopya, kopya basina 171.3 istek/s (M19/K03), uctaki tepe 513.89
DD16 yenileme araligi 30 s, DD17 fark edilme suresi 120 s; yanlis deger 65. saniyede yaziliyor

yayma       kayma  yayilma  ilk gorme  son gorme  karisik s  hatali yanit  bulasan kopya
hepsine         0       25         90        209          0         61668              3
hepsine        10       25         70        209         40         61668              3
kademeli        0       25         90        209        120         20556              1
kademeli       10       25         90        209        120         20556              1

depo dusmesi: 180 s kapali; 260. saniyede bir kopya devralma sonrasi yeniden basliyor
davranis                  basarisiz okuma  dusen istek  esdeger kesinti s  ariza payinin
son bilinen degerle                    18            0               0.00          %0.00
depo zorunlu                           18        20556              40.00          %2.36

    DD16  depo okuma/s  en kotu yayilma  hatali yanit ust siniri
     5 s        0.6000              5 s                    64236
    30 s        0.1000             30 s                    77084
   300 s        0.0100            300 s                   215834
her istekte okunsaydi depo okuma 513.89/s; DD16 = 30 s ile 5139 kat az
```

Bu sayılar **ölçüm** sınıfındadır ama zaman ekseni modellenmiş saniyedir; koşum aritmetiktir ve
ortama bağlı değildir.

## Yayılma Bir Pencere Açar

Değişiklik 65. saniyede depoya yazılıyor, kopyalar 25 saniye sonra tamamlanmış oluyor. Yayılma
süresi yenileme aralığından küçük olabilir — yazma anı ile bir sonraki yenileme arasındaki
mesafeye bağlıdır — ama üst sınırı aralıktır. Alt tablonun son sütunu bunu doğruluyor: DD16 = 5,
30, 300 saniyede en kötü yayılma sırasıyla 5, 30, 300 saniyedir.

İkinci satır kaymanın ne yapıp ne yapmadığını gösteriyor. Kopyaların yenilemesi 10 saniyelik
kaymayla dağıtıldığında ilk gören kopya 90 yerine 70. saniyede görüyor ve **40 saniyelik karışık
pencere** açılıyor: kopyaların bir kısmı yeni, bir kısmı eski değerle yanıt veriyor. Toplam hatalı
yanıt ise iki satırda da 61.668; kayma yayılmayı hızlandırmıyor, yalnız zamana yayıyor.

Karışık pencere bir kusur olarak okunmamalı. İstemcinin bir isteği yeni değerle, hemen ardından
gelen isteği eski değerle karşılanabilir; bir yapılandırma değişikliği **atomik değildir** ve
değerlerin yan yana anlamlı olması gerekir. Birbirine bağımlı iki ayar tek tek yazılırsa karışık
pencerede geçersiz bir bileşim oluşur; bu yüzden bağımlı ayarlar tek bir kayıt olarak yazılır.

## Bulaşma Kapsamı ve Deponun Düşmesi

Üçüncü ve dördüncü satırlar yanlış bir değerin kapsamını ölçüyor. Değer bütün kopyalar için
geçerli yazıldığında üç kopyaya birden bulaşıyor ve DD17 = 120 saniyelik fark etme penceresinde
**61.668 hatalı yanıt** üretiyor. Aynı değer önce tek bir kopyaya işaretlenip doğrulandıktan
sonra ötekilere verildiğinde bulaşan kopya 1'de kalıyor ve hatalı yanıt **20.556** oluyor, yani
tam üçte biri. Kademeli yaymanın karışık penceresi 120 saniyedir ve bu, kusur değil kalıbın
kendisidir: iki değerin bir arada yaşadığı süre, farkın edilebilmesi için ayrılmış süredir.

Alt tabloda depo düşüyor: 180 saniye kapalı kalıyor ve bu sırada bir kopya devralma sonrası
yeniden başlıyor. İki davranış ayrılıyor. **Son bilinen değerle çalışma** seçildiğinde 18
başarısız okuma oluyor, kopyalar önbellekteki değeri sürdürüyor, yeniden başlayan kopya değeri
diskteki kopyasından yüklüyor ve düşen istek 0. **Depo zorunlu** seçildiğinde aynı 18 başarısız
okuma oluyor ama yeniden başlayan kopya açılamıyor: 120 saniye boyunca 20.556 istek düşüyor. Bu,
uçtaki tepe hıza göre 40,00 saniyelik eşdeğer kesintidir ve K01'in aylık 28,2 dakikalık arıza
payının yüzde 2,36'sını tek bir olayda harcar.

Sonuç bir tasarım kuralıdır: **dış yapılandırma deposu, kendisi düştüğünde uygulamayı düşürmeyecek
biçimde okunmalıdır.** Aksi halde tek bir yardımcı bileşen, bağımlı olduğu bütün servislerin
hizmet erişilebilirliğine üst sınır koyar. Açılışta doğrulama kuralı bununla çelişmez; doğrulama
son bilinen değer üzerinde yapılır, eksik olan depo değil değerdir.

## İki Günün Sayısı

**Arızasız günün bedeli üç kalemdir.** Birincisi depo okumasıdır ve önbellek onu küçük tutar:
DD16 = 30 saniye ile üç kopya saniyede 0,1000 okuma yapar. Her istekte okunsaydı 513,89 okuma/s
olurdu — 5139 kat. İkincisi gecikmedir: bir ayar değişikliği anında yürürlüğe girmez, en kötü
durumda DD16 kadar bekler. Üçüncüsü karışık penceredir; kopyalar bir süre farklı değerlerle
çalışır ve bu, bağımlı ayarların tek kayıtta tutulmasını zorunlu kılar.

DD16 bu üç kalemi birbirine bağlar ve iki yönlü çeker. Aralık 5 saniyeye indirilirse depo
okuması 0,6000/s'ye çıkar (altı kat) ama hatalı yanıtın üst sınırı 77.084'ten 64.236'ya iner.
Aralık 300 saniyeye çıkarılırsa okuma 0,0100/s'ye düşer ve üst sınır 215.834'e çıkar. **Yenileme
aralığı bir başarım parametresi değil, bir geri alma süresidir**: yanlış bir değerin ne kadar
süre yürürlükte kalacağını belirler.

**Arızalı günün kazancı iki kalemdir.** Depo düştüğünde son bilinen değerle çalışma düşen isteği
20.556'dan 0'a, eşdeğer kesintiyi 40,00 saniyeden sıfıra indirir; aylık arıza payının yüzde
2,36'sı korunur. Ve yanlış bir değerin bulaşma kapsamı kademeli yaymayla üç kopyadan bire,
hatalı yanıt 61.668'den 20.556'ya iner. İkisi de arızasız günde hiçbir şey iyileştirmez; birincisi
bir okuma yolu, ikincisi bir yayma prosedürü ekler.

## Özet

- Bir değişiklik üç kopyaya 25 saniyede yayıldı; üst sınır yenileme aralığıdır ve DD16 = 5/30/300
  saniyede sırasıyla 5, 30, 300 saniyedir.
- Yenilemeyi kaydırmak yayılmayı hızlandırmıyor, 40 saniyelik karışık pencere açıyor; toplam
  hatalı yanıt iki durumda da 61.668. Bağımlı ayarlar bu yüzden tek kayıtta yazılır.
- Önbellekli okuma depo yükünü 0,1000 okuma/s'de tutuyor; her istekte okunsaydı 513,89 olurdu,
  5139 kat.
- Kademeli yayma bulaşan kopyayı 3'ten 1'e, hatalı yanıtı 61.668'den 20.556'ya indiriyor;
  karşılığında 120 saniyelik karışık pencereyi kalıcı kılıyor.
- Depo düştüğünde son bilinen değerle çalışma düşen isteği 20.556'dan 0'a indiriyor: 40,00
  saniyelik eşdeğer kesinti, K01'in aylık 28,2 dakikalık arıza payının yüzde 2,36'sı.
- DD16 bir başarım parametresi değil geri alma süresidir: 5 saniyede hatalı yanıt üst sınırı
  64.236, 300 saniyede 215.834.

## Sonraki Adım

Bu konudaki beş kalıp aynı sistemin içinde çalıştı. Tekillik defteri, telafi zinciri, talep fişi,
vale anahtarı ve dış yapılandırma deposu — hepsi **yeni** düzenin parçaları ve hepsi K01'in
sayılarına oturuyor. Fakat gönderi takip ve ücretlendirme servisi sıfırdan doğmadı: eski sistem
hâlâ ayakta, aynı takip numaralarını yanıtlıyor, aynı fatura satırlarını üretiyor ve yeni düzenin
yanında duruyor. Beş kursun tasarladığı hiçbir şey o sistemin nasıl devralınacağını söylemedi —
hangi yolun ne zaman taşınacağı, taşınmamış yolların nereye gideceği, iki sistemde birden tutulan
durumun nasıl tutarlı kalacağı ve geçişin ne kadar süreceği hiç sorulmadı. Sonraki ders eski
sistemin aşamalı olarak değiştirilmesini ele alır.
