İçeriğe geç
academia.sh

Ders 15 / 15

Eşzamansız İstek–Yanıt

Uzun süren bir işlemde yanıtın nasıl döndürüleceği: 3,60 saniyelik dönem raporunun 200 milisaniyelik eşiğe sığmaması, isteğin bir iş kimliğiyle hemen karşılanması, durum ve sonuç adreslerinin ayrılması, yoklama aralığının yoklama sayısı ile sonucu görme süresi arasındaki ödünleşiminin ölçülmesi ve üstel geri çekilmeli yoklamanın on beş yoklamayı dörde indirmesi.

İçindekiler

Bu kursun bütün derslerinde iş, isteği yapan taraftan koparılmış olarak yürüdü: durum olayı kuyruğa yazıldı, iş akışı arkada koştu, gün sonu partisi bir lider tarafından başlatıldı. Bir soru hep dışarıda kaldı — isteyen tarafın sonucu nasıl öğrendiği. Bir satıcı otuz günlük ücretlendirme raporunu istediğinde iş kuyruğa alınır ve saniyeler sonra biter; ama satıcının istemcisi bir yanıt beklemektedir.

Eşzamansız istek–yanıt (asynchronous request–reply), isteği hemen bir iş kimliğiyle karşılayan ve sonucu ayrı bir adresten sunan yerleşimdir. Bu ders o yerleşimin bedelini ölçer: istemci sonucu görene kadar kaç kez sorar, ne kadar geç görür ve bu sorular uçtaki tepe istek hızına ne ekler.

Eşzamanlı Yol Neden Yetmiyor

Servis Tasarımı konusunun son dersi uçtan uca eşiği bir bütçe olarak ele almıştı: takip okumasının sıkı eşiği 200 milisaniyedir ve zincirdeki her adım bu bütçenin bir payını alır. Dönem raporunun süresi de bu kursun ikinci dersinde K01’den türetilmişti: satıcı başına 3000 kayıt, tarama hızı 833,33 kayıt/s, yani 3,60 saniye.

İki sayı yan yana konduğunda karar aritmetiktir: rapor işi eşiğin 18 katıdır. Bütçeyi bölüştürmek de işe yaramaz, çünkü bölüştürme her adımı daraltır; adımın kendisi bütçenin tamamından büyükse bölünecek bir şey yoktur. Zaman aşımı ile deneme sayısının çarpımı burada üçüncü bir seçenek üretmez. Üçüncü seçenek çağıranın beklememesidir.

Üç Adres

Yerleşim, tek bir çağrının yaptığı işi üç adrese böler ve her adres tek bir soruya yanıt verir. İstek adresi raporu ister ve hemen döner; yanıt sonucu değil, işin kabul edildiğini ve bir iş kimliğini taşır. Durum adresi o kimliğin işinin bitip bitmediğini söyler. Sonuç adresi biten işin çıktısını verir.

Bölmenin üç sonucu vardır. Birincisi, istek adresi artık kısa bir yazma olduğu için 200 milisaniyelik eşiğe girer; durum adresi de tek kayıt okumasıdır ve aynı eşiğe girer. İkincisi, iş kimliği yazıldıktan sonra istemci bağlantıyı kapatabilir ve sonucu daha sonra alabilir; istemcinin çökmesi işi düşürmez. Üçüncüsü, aynı isteğin ikinci kez gönderilmesi ikinci bir iş başlatmamalıdır — istek adresi etkisiz olmalı ve aynı tekillik anahtarı aynı iş kimliğini döndürmelidir. Bu üç sonuç yerleşimin kendisidir; ölçülecek olan, istemcinin durum adresini kaç kez sorduğudur.

// eszamansiz/yoklama.mjs — uzun suren rapor isteginde yoklama sayisi ve gorulme suresi.
// Sureler K01'den turetilmis hesaplardir; kosum aritmetiktir, ortama bagli bir olcum degildir.
export const IS_SURESI = 3.6;      // K01: 3000 kayit / 833,33 kayit/s (Gorev Kuyruklari dersi)
export const ESIK = 0.2;           // K01: takip okumasinin siki esigi 200 ms

// Istemci istegi birakir, sonra durum adresini yoklar. Ustel geri cekilmede aralik tavana kadar
// ikiye katlanir; algoritma M14/K06'da kurulu, burada yalnizca yoklama sayisina uygulaniyor.
export function yokla({ aralik, ustel = false, tavan = 2, sure = IS_SURESI }) {
  let t = 0, p = aralik, yoklama = 0, bosa = 0;
  for (;;) {
    t += p; yoklama += 1;
    if (t >= sure) break;
    bosa += 1;
    if (ustel) p = Math.min(p * 2, tavan);
  }
  return { yoklama, bosa, gorme: t, fazla: t - sure,
    istek: 1 + yoklama, bosaOran: bosa / yoklama };
}
// eszamansiz/olc.mjs — yoklama araligi taranir, sonra K01'in hacmine ve esigine baglanir
import { yokla, IS_SURESI, ESIK } from "./yoklama.mjs";

const S = [...[0.25, 0.5, 1, 2].map((a) => [`sabit ${a} s`, yokla({ aralik: a })]),
  ["ustel 0.25 s (tavan 2 s)", yokla({ aralik: 0.25, ustel: true })]];

console.log(`is suresi ${IS_SURESI.toFixed(2)} s (K01 hesabi), uctan uca esik ${ESIK * 1000} ms (K01)`);
console.log(`eszamanli tutulsaydi: 1 istek, baglanti ${IS_SURESI.toFixed(2)} s acik, ` +
  `esigin ${(IS_SURESI / ESIK).toFixed(0)} kati`);
console.log();
console.log(`${"strateji".padEnd(26)}${"yoklama".padStart(9)}${"bosa".padStart(7)}` +
  `${"bosa orani".padStart(12)}${"gorme s".padStart(10)}${"fazla s".padStart(10)}${"istek".padStart(7)}`);
for (const [ad, r] of S)
  console.log(`${ad.padEnd(26)}${String(r.yoklama).padStart(9)}${String(r.bosa).padStart(7)}` +
    `${r.bosaOran.toFixed(3).padStart(12)}${r.gorme.toFixed(2).padStart(10)}` +
    `${r.fazla.toFixed(2).padStart(10)}${String(r.istek).padStart(7)}`);

// K01: gunluk fatura satiri 4000 = satici sayisi (hesap); tepe carpani V8 = 3 (varsayim);
// uctaki tepe 513,89 istek/s (hesap).
const SATICI = 4000, V8 = 3, UC_TEPE = 513.89, GUN = 86_400;
console.log(`\n${"KK5".padStart(5)}${"rapor/gun".padStart(11)}${"strateji".padStart(27)}` +
  `${"istek/gun".padStart(11)}${"tepe istek/s".padStart(14)}${"uctaki payi".padStart(13)}`);
for (const KK5 of [0.25, 0.5]) {          // KK5: satici basina gunluk donem raporu istegi
  const rapor = SATICI * KK5;
  for (const [ad, r] of [S[0], S[4]]) {
    const tepe = (rapor * r.istek / GUN) * V8;
    console.log(`${KK5.toFixed(2).padStart(5)}${rapor.toFixed(0).padStart(11)}${ad.padStart(27)}` +
      `${(rapor * r.istek).toFixed(0).padStart(11)}${tepe.toFixed(4).padStart(14)}` +
      `${`%${(100 * tepe / UC_TEPE).toFixed(3)}`.padStart(13)}`);
  }
}
const esz = (rapor) => ((rapor / GUN) * V8 * IS_SURESI);
console.log(`\neszamanli tutulsaydi tepede acik baglanti: KK5 = 0,25 -> ` +
  `${esz(SATICI * 0.25).toFixed(3)}, KK5 = 0,50 -> ${esz(SATICI * 0.5).toFixed(3)}`);
is suresi 3.60 s (K01 hesabi), uctan uca esik 200 ms (K01)
eszamanli tutulsaydi: 1 istek, baglanti 3.60 s acik, esigin 18 kati

strateji                    yoklama   bosa  bosa orani   gorme s   fazla s  istek
sabit 0.25 s                     15     14       0.933      3.75      0.15     16
sabit 0.5 s                       8      7       0.875      4.00      0.40      9
sabit 1 s                         4      3       0.750      4.00      0.40      5
sabit 2 s                         2      1       0.500      4.00      0.40      3
ustel 0.25 s (tavan 2 s)          4      3       0.750      3.75      0.15      5

  KK5  rapor/gun                   strateji  istek/gun  tepe istek/s  uctaki payi
 0.25       1000               sabit 0.25 s      16000        0.5556       %0.108
 0.25       1000   ustel 0.25 s (tavan 2 s)       5000        0.1736       %0.034
 0.50       2000               sabit 0.25 s      32000        1.1111       %0.216
 0.50       2000   ustel 0.25 s (tavan 2 s)      10000        0.3472       %0.068

eszamanli tutulsaydi tepede acik baglanti: KK5 = 0,25 -> 0.125, KK5 = 0,50 -> 0.250

Sayıların Okunması

Sabit aralıklı dört satır bir ödünleşimi gösteriyor. Aralık dört kat büyüdüğünde (0,25 → 1 saniye) yoklama sayısı 15’ten 4’e iniyor; karşılığında sonucu görme süresi 3,75’ten 4,00 saniyeye çıkıyor. Fazla bekleme 0,15 saniyeden 0,40 saniyeye, yani 2,67 katına çıkıyor. Ödünleşim asimetriktir: dört kat daha az soru, yalnız 0,25 saniye daha geç sonuç.

Boşa yoklama oranı asıl israfı adlandırıyor. Çeyrek saniyelik aralıkta 15 yoklamanın 14’ü “hâlâ yürüyor” yanıtı alıyor: oran 0,933. İki saniyelik aralıkta oran 0,500’e iniyor. Sabit aralık, işin ne kadar süreceğini bilmediği için işin başında da sonunda da aynı sıklıkla sorar; oysa bir işin biteceğine dair bilgi zamanla artar.

Son satır bunu kullanıyor. Üstel geri çekilmeli yoklama çeyrek saniyeyle başlar, aralığı iki saniyelik tavana kadar iki katına çıkarır ve 4 yoklamayla 3,75 saniyede sonucu görür — yani sabit iki saniyelik aralığın yoklama sayısına yakın, sabit çeyrek saniyelik aralığın görme süresiyle aynı. Fazla bekleme 0,15 saniyede kalıyor. Sabit aralıklı satırların hiçbiri bu iki sayıyı birlikte veremiyor. Geri çekilme algoritması Dayanıklılık ve Güvenilirlik kursunda kurulmuştu; burada yeniden denemeye değil, yoklamaya uygulanıyor ve aynı biçimde davranıyor.

Hesaba Dönüş

Yoklama isteklerinin uçtaki tepe hıza ne eklediğini görmek için rapor hacmi gerekir. K01 günde 4000 fatura satırı hesaplamıştı ve her satır bir satıcının bir günü olduğuna göre satıcı sayısı 4000’dir. Rapor isteği sıklığı K01’de yok.

KK5 — satıcı başına günlük dönem raporu isteği 0,25. Gerekçesi satıcıların dönem raporunu her gün değil, haftada bir–iki kez istemesidir. K01’in tablosuna eklenmez; duyarlılığı 0,50 ile hesaplanır. Tepe çarpanı K01’in V8 varsayımıdır (3).

Sonuç iki yönlü okunmalı. Çeyrek saniyelik sabit yoklamada günde 16.000 istek çıkıyor ve tepede 0,5556 istek/s ediyor — K01’in uçtaki 513,89 istek/s’sinin yüzde 0,108’i. Üstel geri çekilmede 5000 istek, 0,1736 istek/s ve yüzde 0,034. KK5 iki katına çıkarsa oranlar yüzde 0,216 ve 0,068 olur. Yani yoklamanın uçtaki maliyeti her durumda binde birkaçtır.

Eşzamanlı alternatifin maliyeti de büyük değil: tepede aynı anda açık kalan bağlantı 0,125 (KK5 = 0,50’de 0,250). İki sayı birlikte okunduğunda kalıbın gerekçesi netleşir: eşzamansız istek–yanıt bir kaynak kararı değil, bir bütçe kararıdır. Kaynak açısından iki yol da ucuzdur; ayrım, 3,60 saniyelik bir işin 200 milisaniyelik eşiğin altına hiçbir zaman inememesidir. Eşiği olan bir sistemde eşiğe sığmayan işin tek çıkışı, isteği yanıtla tamamlamamaktır.

Özet

  • 3,60 saniyelik dönem raporu K01’in 200 milisaniyelik uçtan uca eşiğinin 18 katıdır; bütçeyi bölüştürmek adımı daraltır, büyütmez.
  • Yerleşim üç adres kurar — istek, durum, sonuç; istek adresi kısa bir yazmadır ve eşiğe girer, aynı tekillik anahtarıyla gelen ikinci istek yeni iş başlatmaz.
  • Sabit aralıkta yoklama sayısı ile görme süresi asimetrik takas edilir: aralık 0,25’ten 1 saniyeye çıkınca yoklama 15’ten 4’e, fazla bekleme 0,15’ten 0,40 saniyeye gidiyor.
  • Boşa yoklama oranı sabit çeyrek saniyede 0,933, iki saniyede 0,500; sabit aralık işin bitme olasılığının zamanla arttığını kullanmaz.
  • Üstel geri çekilmeli yoklama iki sayıyı birlikte veriyor: 4 yoklama ve 3,75 saniyede görme, fazla bekleme 0,15 saniye.
  • K01’e dönüş: KK5 = 0,25 ile yoklama tepede 0,5556 istek/s (uçtaki hızın yüzde 0,108’i), üstel geri çekilmede 0,1736 istek/s (yüzde 0,034); eşzamanlı tutulsaydı tepede 0,125 açık bağlantı. Kalıp bir kaynak kararı değil, bir bütçe kararıdır.

Kurs Kapanışı

Kurs, isteğin uygulamaya ulaştıktan sonrasını iki konuda tasarladı ve her derste aynı üç soruyu sordu: bu karar nedir, giriş kurslarının hesabındaki hangi sayıyı oynatıyor, karşılığında hangi sayı büyüyor. Derslerin bıraktığı ölçüler aşağıdaki tabloda toplanıyor.

Ders Kararı Oynadığı sayı Karşılığında büyüyen
Durumsuz Servisler durumun servis dışına taşınması gereken kopya 4 → 3; kopya başına 200,93 → 171,30 istek/s durum deposuna 1027,78 işlem/s, K01’in depo yükünün 7,40 katı
Servis Keşfi adresin çalışma zamanında bulunması arıza başına düşen istek 102.778 → 510,46 liste penceresi 2980 ms; defterin kendi yükü 3,00 atış/s
İletişim Biçimleri iç çağrının biçimi iç bayt 352 / 181 / 206; iç istek 833,34 istek/s çağıranın bildiği ad 6 → 8; iç sınır 1,60 Mbit/s’in 0,38–0,73 katı
Servisler Arası Sözleşme şemanın evrilme sırası kırılan tüketici 4/5 → 0 kayıt 228 → 406 bayt; iç sınır 0,760 → 1,353 Mbit/s
Zaman Aşımı ve Deneme Bütçesi bütçenin zincire bölüşümü en kötü süre bütçenin 6,1 katından 200 ms’ye iç istek 1666,68 → 1895,85 istek/s; yaygın yavaşlamada 3333,36
Mesaj Kuyrukları yükün zamana yayılması işleme kapasitesi 97,22 → 48,61 olay/s birikme tepesi 525.000, en uzun bekleme 3,00 saat
Görev Kuyrukları ve Arka Plan İşleri uzun işin istek yolundan çıkarılması 100 ms üstü bekleyen takip isteği yüzde 29,02 → 0 rapor süresi 3,60 → 4,14 s; 4 yuva ve 4,00 işçi
Rekabet Eden Tüketiciler işin kaç tüketiciye bölüneceği 48,61 olay/s için tüketici başına en az 9,45 olay/s; N = 8’de katkı 0,128 sıra bozulması 102 → 2279 gönderi
Kuyruk Tabanlı Yük Dengeleme öngörülmeyen sıçramanın tamponlanması varış 972 olay/s’ye çıkarken birikme 525.000’de, bekleme 3,00 saatte sabit kuyruk sınırı 525.391; hacim artışında 350.049 düşen olay
Öncelikli Kuyruk işlerin hizmet düzeyine ayrılması en üst sınıfın beklemesi 6,5 dakikadan 0,0’a iniyor en alt sınıfta 300.000 iş kuyrukta kalıyor; pay ayırmada B’nin birikmesi 440.000 → 740.000
Sıralı Konvoy sıra kısıtının şeride sokulması yanlış son durum 1 → 0; kısıtlı tepe yazma 55,55 olay/s tüketici gereksinimi ×1,357, kaba anahtarla ×1,786
Koreografi ve Orkestrasyon iş akışının kurulma modeli telafi sorumluluğu 3 → 1 birim; telafisiz adım 80 → 0/gün ileti 1,3889 → 2,2222 ileti/s, oran 1,600
Zamanlayıcı–Aracı–Denetçi yarım kalan işin bulunması yarım kalan iş 160 → 0/gün, fatura satırlarının yüzde 4’ü 320 yeniden sürme ve 80 boşa yürütme/gün
Lider Seçimi tekil sorumluluğun tek düğüme verilmesi çift ve üretilmeyen fatura satırı 2000 + 2000 → 0/yıl iki turluk gecikme; iki liderli tur 2’de kalıyor
Eşzamansız İstek–Yanıt çağıranın beklememesi 3,60 s’lik iş 200 ms eşiğin dışından çıkıyor yoklama tepede 0,1736 istek/s, uçtaki hızın yüzde 0,034’ü

Tablonun kuralı adıyla anılmalı. Bu kursta ölçü iki tanedir ve seçim çağıranın bekleyip beklememesine göre yapılır. Çağıran bekliyorsa ölçü zincir gecikmesidir: adım sayısı, zaman aşımı ile deneme sayısının çarpımı, uçtan uca en kötü süre ve bütçe aşıldığında düşen istek. Çağıran beklemiyorsa ölçü birikme ve boşalmadır: bekleyen iş tepesi, boşalma süresi, tüketici sayısının katkısı ve tamponun sınırında düşen iş. İki ölçü birbirinin yerine geçmez; bir kuyruk kararı gecikme bütçesiyle, bir zincir kararı birikme tepesiyle savunulamaz. Kursun kendi varsayımları — durum deposunun yükü, kayıt defterinin yaşam süresi, geçit payı, tepe penceresi, uzun iş talebi, taşıyıcı kesintisi, ek akışın süresi, tüketici grubunun kapasitesi, sıra kısıtı oranı, iş akışı hata oranı, asılı kalma oranı, devralma sıklığı ve rapor isteği sıklığı — K01’in tablosuna karışmadı; her biri kendi adı, gerekçesi ve duyarlılığıyla yazıldı.

Kursun bıraktığı soru bir katman daha içeridedir. Servisler durumsuzlaştı, adreslerini buldu, sözleşmelerini kırmadan evirdi ve bütçelerini böldü; iş kuyruğa alındı, öncelik verildi, sırası korundu, akışı koordine edildi ve yarım kalanı bulundu. Ama bütün bu tasarım tek bir veri deposu varsayımı üzerinde duruyor. Durum, servisin dışına çıkarıldığında bir yere kondu ve o yerin nasıl ölçekleneceği hiç sorulmadı: deponun çoğaltılması, verinin parçalanması, bağlamların kendi depolarına federe edilmesi ve önbelleğin hangi katmanda duracağı bu kursta tasarlanmadı. K01’in hesabındaki depoya ulasan istek/s ve saklanan veri GB satırları bu kurs boyunca hiç oynamadı. Sonraki kurs Veri Katmanı Ölçekleme o satırları ele alır.

İ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