İçeriğe geç
academia.sh

Ders 09 / 13

Erişilebilirliğin Sayısal İfadesi

Hizmet erişilebilirliği yüzdesinin bir kesinti bütçesine çevrilmesi: yüzdelerin yıl, ay, hafta ve gün başına süreye dönüştürülmesi, bütçenin planlı işler ile arıza arasında bölünmesi, hedefin yükseltilmesinin planlı işleri olanaksız kılması ve seri bir zincirde çarpımın, kopyalamada tümleyenin bileşik erişilebilirliğe etkisinin hesaplanması.

İçindekiler

Önceki üç ders sistemin çalıştığı varsayımıyla ölçüm yaptı: yük, kapasite, hızlanma ve maliyet. Bir birim durduğunda sorulacak sorular başkadır. Sistemin ne kadarı durur, ne kadar süre durur, ve bu süre kabul edilebilir mi? Üçüncü soru bir yüzdeyle yanıtlanır ve yüzde tek başına hiçbir şey söylemez.

Bu ders yüzdeyi bir süreye çevirir, o süreyi harcanabilir bir bütçe olarak ele alır ve bileşenlerin birleştirilmesinin bütçeye ne yaptığını hesaplar. Bütün sayılar hesap sınıfındadır; girdileri açıkça adlandırılmış varsayımlardır.

İki Erişilebilirlik ve İki Tanım

Hizmet erişilebilirliği (availability), sistemin isteklere yanıt verebildiği zamanın toplam zamana oranıdır. Terim, arayüz erişilebilirliği (accessibility) ile karıştırılmamalıdır; ikincisi bir arayüzün yardımcı teknolojilerle kullanılabilmesidir ve Erişilebilir Bileşen Kalıpları kursunun konusudur. Bu derste geçen erişilebilirlik daima hizmet erişilebilirliğidir ve kısaltılmaz.

Oranın iki tabanı vardır ve aynı kesinti iki tabanda farklı görünür. Zaman tabanlı ölçüm çalışan süreyi toplam süreye böler; kesinti dakikası sayılır. İstek tabanlı ölçüm başarılı isteği toplam isteğe böler; kaç kullanıcının etkilendiği sayılır. İkisi ayrışır çünkü trafik düzgün dağılmaz: Kabaca Büyüklük Hesabı dersinin tepe çarpanı 3 olduğuna göre, tepe saatte düşen beş dakika, ortalama yükte düşen beş dakikanın üç katı isteği etkiler. Bu ders bütçeyi zaman tabanlı kurar, çünkü bütçe önceden ayrılan bir miktardır ve trafiği bilmeden ayrılır.

Yüzdeyi Süreye Çevirmek

Yüzde biçimi karşılaştırmayı yanıltır: yüzde 99,9 ile yüzde 99,99 arasındaki 0,09 puanlık fark küçük görünür. Aynı fark dakikaya çevrildiğinde görünmez olmaktan çıkar.

// hizmet/butce.mjs — hizmet erisilebilirligi yuzdesinin donem basina kesinti butcesine cevrilmesi
const DONEM = [["yil", 365 * 24 * 60], ["ay", 30 * 24 * 60], ["hafta", 7 * 24 * 60], ["gun", 24 * 60]];
const YUZDE = [99, 99.5, 99.9, 99.95, 99.99, 99.999];

const yaz = (dk) => (dk >= 60 ? `${(dk / 60).toFixed(1)} sa` : dk >= 1 ? `${dk.toFixed(1)} dk` : `${(dk * 60).toFixed(1)} sn`);

console.log(`${"yuzde".padEnd(9)}${DONEM.map(([a]) => a.padStart(12)).join("")}`);
for (const y of YUZDE) {
  const kesir = 1 - y / 100;
  console.log(`${`%${y}`.padEnd(9)}${DONEM.map(([, dk]) => yaz(kesir * dk).padStart(12)).join("")}`);
}

const bir = 1 - 99.9 / 100;
const iki = 1 - 99.99 / 100;
console.log(`\n%99.9 -> %99.99: aylik butce ${yaz(bir * 43200)} yerine ${yaz(iki * 43200)}, ` +
  `${(bir / iki).toFixed(0)} kat daralma`);
console.log(`bir dokuz eklemek kesinti payini her seferinde 10'a boler; yuzde 0.09 puanlik fark ` +
  `aylik ${yaz((bir - iki) * 43200)} demektir`);
yuzde             yil          ay       hafta         gun
%99           87.6 sa      7.2 sa      1.7 sa     14.4 dk
%99.5         43.8 sa      3.6 sa     50.4 dk      7.2 dk
%99.9          8.8 sa     43.2 dk     10.1 dk      1.4 dk
%99.95         4.4 sa     21.6 dk      5.0 dk     43.2 sn
%99.99        52.6 dk      4.3 dk      1.0 dk      8.6 sn
%99.999        5.3 dk     25.9 sn      6.0 sn      0.9 sn

%99.9 -> %99.99: aylik butce 43.2 dk yerine 4.3 dk, 10 kat daralma
bir dokuz eklemek kesinti payini her seferinde 10'a boler; yuzde 0.09 puanlik fark aylik 38.9 dk demektir

Ay, otuz gün olarak alınmıştır; ayların uzunluğu eşit olmadığı için bütçenin dönemi baştan tanımlanmalıdır, yoksa aynı yüzde şubatta başka bir dakika sayısı verir.

Tablonun ilk sonucu ölçek farkıdır. Sözlü tartışmada “yüzde doksan dokuz erişilebilir” cümlesi güçlü durur; karşılığı bir yılda 87,6 saat, yani üç buçuk günü aşan bir kesintidir. Yüzde 99,999 aynı yılda 5,3 dakikadır — tek bir yeniden başlatma bu bütçenin tamamını harcar.

İkinci sonuç dönem seçiminin ölçüsüdür. Yüzde 99,9 bir ayda 43,2 dakika, bir günde 1,4 dakika verir. İki sayı aynı hedefi anlatır ama farklı davranışa izin verir: aylık bütçe tek bir 43 dakikalık kesintiyi kabul eder, günlük bütçe etmez. Hedefin dönemi hedefin kendisi kadar belirleyicidir.

Bütçe Harcanır

Kesinti bütçesinin asıl kullanımı, kesintiyi başa gelen bir şey olmaktan çıkarıp harcanan bir kaynağa çevirmesidir. Bütçenin bir kısmı bilinçli olarak harcanır: her sürüm geçişinde süreçler kapanıp açılır, planlı bakımda hizmet durur. Kalan kısım arızaya ayrılmış paydır.

Aşağıdaki hesap dört varsayım alır. Hedef yüzde 99,9; gerekçesi takip sorgusunun ticari bir taahhüt taşıması ama ödeme akışı olmamasıdır. Ayda 20 dağıtım ve dağıtım başına 15 saniye yanıtsızlık; gerekçesi sürüm geçişinde eski sürecin kapanıp yenisinin açılmasıdır. Ayda 10 dakika planlı bakım. Bir de kurtarma süresi 10 dakika; İlişkisel Veritabanı Yönetimi kursundaki kurtarma süresi hedefiyle aynı büyüklüktür.

// hizmet/harcama.mjs — aylik kesinti butcesinin planli islere ve arizaya bolunmesi
const AY = 30 * 24 * 60;           // dakika
const HEDEF = 99.9;                // varsayim: hizmet erisilebilirligi hedefi
const DAGITIM = 20;                // varsayim: aylik dagitim sayisi
const DAGITIM_SN = 15;             // varsayim: dagitim basina yanitsizlik (saniye)
const BAKIM_DK = 10;               // varsayim: aylik planli bakim (dakika)
const KURTARMA_DK = 10;            // varsayim: bir arizanin kurtarma suresi (dakika)

function butce(hedef, dagitim) {
  const toplam = (1 - hedef / 100) * AY;
  const planli = (dagitim * DAGITIM_SN) / 60 + BAKIM_DK;
  return { toplam, planli, ariza: toplam - planli, adet: (toplam - planli) / KURTARMA_DK };
}

console.log("hedef      dagitim   aylik butce   planli   arizaya kalan   kaldirilan ariza");
for (const [hedef, dagitim] of [[HEDEF, DAGITIM], [HEDEF, DAGITIM * 2], [99.99, DAGITIM]]) {
  const b = butce(hedef, dagitim);
  console.log(`%${String(hedef).padEnd(9)}${String(dagitim).padStart(7)}` +
    `${b.toplam.toFixed(1).padStart(14)} dk${b.planli.toFixed(1).padStart(9)} dk` +
    `${b.ariza.toFixed(1).padStart(16)} dk${b.adet.toFixed(2).padStart(19)}`);
}

const b = butce(HEDEF, DAGITIM);
console.log(`\nplanli islerin butcedeki payi = ${((b.planli / b.toplam) * 100).toFixed(1)}%`);
console.log(`hedef %99.99 olsa planli isler butcenin ${((butce(99.99, DAGITIM).planli / butce(99.99, DAGITIM).toplam) * 100).toFixed(0)}%'i olur`);
hedef      dagitim   aylik butce   planli   arizaya kalan   kaldirilan ariza
%99.9          20          43.2 dk     15.0 dk            28.2 dk               2.82
%99.9          40          43.2 dk     20.0 dk            23.2 dk               2.32
%99.99         20           4.3 dk     15.0 dk           -10.7 dk              -1.07

planli islerin butcedeki payi = 34.7%
hedef %99.99 olsa planli isler butcenin 347%'i olur

İlk satır bütçenin nasıl bölündüğünü gösteriyor: 43,2 dakikanın 15,0’ı planlı işlere gidiyor, yani bütçenin yüzde 34,7’si daha hiçbir arıza olmadan harcanmış durumda. Arızaya kalan 28,2 dakika, on dakikalık kurtarma süresiyle ayda 2,82 arıza demektir: iki arıza bütçeye sığar, üçüncüsü hedefi kırar.

İkinci satır varsayımın duyarlılığıdır: dağıtım sayısı iki katına çıktığında arıza payı 28,2’den 23,2 dakikaya, kaldırılabilen arıza 2,82’den 2,32’ye düşüyor. Daha sık yayın yapmak, daha az arıza hakkı demektir — ikisi aynı bütçeden ödenir.

Üçüncü satır dersin en sert sonucudur. Hedef yüzde 99,99’a çıkarıldığında aylık bütçe 4,3 dakikaya iner ve planlı işlerin 15,0 dakikası bütçenin yüzde 347’sini tutar; arıza payı eksi 10,7 dakikadır. Hedef, hiçbir arıza olmasa bile karşılanamaz. Bir erişilebilirlik hedefi yükseltilirken dağıtım biçiminin de değişmesi gerekir; yoksa hedef bir niyet beyanı olarak kalır. Kesinti bütçesinin bir hedefi olanaksız olarak işaretleyebilmesi, onu bir ölçüt yapan şeydir.

Bileşik Sistemde Çarpım

Bir isteğin yanıtlanması için birden çok bileşenin birlikte çalışması gerekir. Takip sorgusu uç sürece gelir, önbelleğe bakar, gerekirse gönderi deposuna gider ve durum olay akışından beslenir. Bileşenlerden biri düştüğünde istek yanıtlanamıyorsa, bileşenler seri bağlıdır ve bileşik erişilebilirlik çarpımdır.

// hizmet/bilesik.mjs — seri zincirde carpim, kopyada tumleyen: takip yolunun bilesik erisilebilirligi
const AY = 30 * 24 * 60;           // dakika
const ZINCIR = ["uc surec", "onbellek", "gonderi deposu", "olay akisi"];
const BILESEN = 0.999;             // varsayim: bilesen basina hizmet erisilebilirligi

const dakika = (a) => (1 - a) * AY;
const seri = (a, n) => a ** n;
const kopyali = (a, k) => 1 - (1 - a) ** k;

console.log(`zincir = ${ZINCIR.length} bilesen, bilesen basina %${(BILESEN * 100).toFixed(1)}`);
console.log("bilesen sayisi   bilesik erisilebilirlik   aylik kesinti");
for (let n = 1; n <= ZINCIR.length; n += 1) {
  const a = seri(BILESEN, n);
  console.log(`${String(n).padStart(14)}   ${(a * 100).toFixed(4).padStart(21)}%   ${dakika(a).toFixed(1).padStart(9)} dk`);
}

console.log("\nkopya sayisi   bilesen kesinti payi   zincir kesinti payi   aylik kesinti");
for (const k of [1, 2, 3]) {
  const b = kopyali(BILESEN, k);
  const z = seri(b, ZINCIR.length);
  console.log(`${String(k).padStart(12)}   ${(1 - b).toExponential(2).padStart(20)}   ` +
    `${(1 - z).toExponential(2).padStart(19)}   ${(dakika(z) * 60).toFixed(3).padStart(9)} sn`);
}

const iyi = 0.9999;
console.log(`\nduyarlilik: bilesen %${(iyi * 100).toFixed(2)} olsa kopyasiz zincir ` +
  `%${(seri(iyi, ZINCIR.length) * 100).toFixed(4)}, aylik ${dakika(seri(iyi, ZINCIR.length)).toFixed(1)} dk`);
console.log(`en zayif halka: zincir hicbir bilesenin uzerine cikamaz (ust sinir %${(BILESEN * 100).toFixed(1)})`);
zincir = 4 bilesen, bilesen basina %99.9
bilesen sayisi   bilesik erisilebilirlik   aylik kesinti
             1                 99.9000%        43.2 dk
             2                 99.8001%        86.4 dk
             3                 99.7003%       129.5 dk
             4                 99.6006%       172.5 dk

kopya sayisi   bilesen kesinti payi   zincir kesinti payi   aylik kesinti
           1                1.00e-3               3.99e-3   10352.458 sn
           2                1.00e-6               4.00e-6      10.368 sn
           3                1.00e-9               4.00e-9       0.010 sn

duyarlilik: bilesen %99.99 olsa kopyasiz zincir %99.9600, aylik 17.3 dk
en zayif halka: zincir hicbir bilesenin uzerine cikamaz (ust sinir %99.9)

Birinci tablo çarpımın yönünü veriyor: her bileşen yüzde 99,9 olmasına karşın dört bileşenlik zincir yüzde 99,6006’dır ve aylık kesinti 43,2 dakikadan 172,5 dakikaya, yani neredeyse dört katına çıkar. Kesinti payları yaklaşık olarak toplanır. Bunun tasarım sonucu doğrudandır: bileşen eklemek erişilebilirliği düşürür, çünkü seri bir zincirde her yeni bileşen yeni bir tek nokta demektir. Mimari Biçemler kursunda mikroservis düzeninin faturası birim sayısıyla büyüyen durum sayısı olarak sayılmıştı; buradaki karşılığı çarpımdır.

Aynı tablo bir üst sınır da veriyor. Seri bir zincir en zayıf bileşeninin üzerine çıkamaz: kopyalama olmadan, yüzde 99,9’luk bir bileşen içeren bir yol yüzde 99,95 olamaz. Bir hedef bileşen hedeflerine bölünmeden konursa, tutulup tutulmadığı bileşenlere bakılarak sınanamaz.

İkinci tablo tersi yöndeki tek aracı gösteriyor: aynı bileşenin birden çok kopyasını koymak. Kopyalar koşut bağlıdır — hepsi birlikte düşmedikçe bileşen ayaktadır — ve kesinti payı kopya sayısıyla üs alır. Bir bileşenin kesinti payı binde birden ikinci kopyayla milyonda bire, üçüncü kopyayla milyarda bire iner; dört bileşenlik zincirin aylık kesintisi 10 352 saniyeden 10,4 saniyeye, sonra 0,010 saniyeye düşer.

Bu ikinci tablonun bir varsayımı vardır ve varsayım gerçekte tam tutmaz: kopyaların birbirinden bağımsız düştüğü. Aynı hatalı sürümü çalıştıran iki kopya aynı istekte birlikte düşer; aynı yapılandırma hatası ikisini birlikte bozar. Bağımsızlık tutmadığı ölçüde gerçek erişilebilirlik hesaplananın altında kalır, dolayısıyla bu sayılar bir üst sınırdır. Kopya eklemek de aritmetikte göründüğü kadar ucuz değildir; kopyaların birbirinden habersiz kalması başka bir maliyet doğurur ve o maliyet bu konunun geri kalanının konusudur.

Son satır duyarlılığı veriyor: bileşen erişilebilirliği yüzde 99,99 olsaydı kopyasız zincir yüzde 99,9600 ve aylık kesinti 17,3 dakika olurdu. Aynı sonuca iki yoldan gidilebiliyor — bileşeni iyileştirmek ya da kopyalamak — ve ikisinin maliyeti önceki dersin maliyet eğrileriyle karşılaştırılır.

Özet

  • Hizmet erişilebilirliği sistemin yanıt verebildiği zamanın oranıdır ve arayüz erişilebilirliğinden ayrı bir kavramdır; zaman tabanlı ile istek tabanlı ölçüm aynı kesintiyi farklı gösterir.
  • Yüzde 99,9 yılda 8,8 saat, ayda 43,2 dakika, günde 1,4 dakika kesintidir; bir dokuz eklemek payı 10’a böler ve 0,09 puanlık fark aylık 38,9 dakika demektir.
  • Hedefin dönemi hedef kadar belirleyicidir: aylık 43,2 dakika tek bir uzun kesintiye izin verir, günlük 1,4 dakika vermez.
  • Bütçenin yüzde 34,7’si planlı işlere gidiyor (20 dağıtım ve 10 dakika bakım); arızaya kalan 28,2 dakika on dakikalık kurtarma süresiyle ayda 2,82 arızadır.
  • Hedef yüzde 99,99’a çıkarıldığında planlı işler bütçenin yüzde 347’sini tutar ve hedef hiçbir arıza olmadan bile karşılanamaz; hedefi yükseltmek dağıtım biçimini değiştirmeyi gerektirir.
  • Seri zincirde erişilebilirlikler çarpılır: dört tane yüzde 99,9’luk bileşen yüzde 99,6006 ve aylık 172,5 dakika verir. Koşut kopyalarda kesinti payı üs alır, ama hesap kopyaların bağımsız düştüğünü varsaydığı için bir üst sınırdır.

Sonraki Adım

Bu ders hizmet erişilebilirliğini bir bütçeye çevirdi ve bütçenin nasıl harcandığını saydı: dağıtım, bakım, arıza. Açıkta kalan soru bütçenin neden harcandığıdır. Kesintinin bir kısmı arızadan gelir — bir bileşen düşer, kurtarılana kadar bütçeden dakika gider. Bir kısmı ise bilinçli bir karardan gelir ve bu kısım aritmetikte görünmez. Kopya eklemenin faturası son tabloda yarım kalmıştı: kopyalar birbirinden habersiz kaldığında sistem iki şeyden birini seçmek zorundadır. Yanıt vermeyi mi seçer, doğru yanıt vermeyi mi? Yanıt vermeyi seçmek bütçeyi korur ve yanlış bir değer döndürür; doğru yanıt vermek için beklemek ya da reddetmek bütçeden harcar. Sonraki ders bu seçimi adlandırır, iki politikayı aynı arıza senaryosunda ölçer ve kesinti bütçesinden kaç dakikanın hangi politika yüzünden gittiğini sayar.

İ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