İçeriğe geç
academia.sh

Ders 13 / 13

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.

İçindekiler

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.

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

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

İ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