Ders 07 / 20
Sunucusuzun Uygun Olmadığı Durumlar
Beş iş türü süre, durum ve maliyet ekseninde kıyaslanır: her tür için eşiği aşan kalem adıyla yazılır ve sığmayan işi parçalayarak sığdırmanın bedeli adım, ara durum ve hata noktası olarak sayılır. Konu, hangi işin sunucusuza uyduğunu ve hangisinin neden uymadığını gösteren bir tabloyla kapanır.
İçindekiler
Bu konu boyunca ölçülen her şey aynı varsayımı paylaşıyordu: iş, işleve uyuyor. Bir istek geliyor, sınırların içinde bitiyor, durumunu dışarıda tutuyor. Eşikler sayıldı, paket küçültüldü, yayın kapıya bağlandı — hepsi o varsayımın içinde. Şimdi varsayımın kendisi ölçülüyor: hangi iş bu sınırların içine sığar, hangisi sığmaz, ve sığmayanı zorla sığdırmanın faturası nedir?
Soru “sunucusuz iyi mi kötü mü” değildir; kiralamanın karşılığında gelen kısıtların hangi iş türünde ödenebilir, hangisinde ödenemez olduğudur. Cevabı bir görüş değil, üç eksende okunan bir sayıdır: süre, durum, maliyet.
- IH37. Kurgusal bölgesel ölçüm ağının beş iş türü ölçülür. İş yükü sayıları da sınırlar da kurgudur ve tek bir çalıştırma ortamını temsil eder.
- IH38. Sınırlar sabittir: tek koşum dokuz yüz saniye, bellek üç bin yetmiş iki megabayt. Bağlantı istekten uzun yaşayamaz, yani aynı dokuz yüz saniye bağlantı ömrüdür.
- IH39. Maliyet kurgu birimlerle yazılır; gerçek para birimi kullanılmaz ve yalnız oranlar anlamlıdır. Sunucusuz çağrı başına ve gigabayt-saniye başına, kiralık makine saat başına ücretlenir.
- IH40. Bir kiralık makine kırk eş zamanlı iş ya da iki bin kalıcı bağlantı taşır. Yedeklilik, yük dengeleme ve işletim emeği maliyete katılmıyor — yani kiralık makine tarafı eksik sayılıyor.
- IH41. Parçalamada her sınırda ara durum yazılır ve okunur: on sekiz artı on iki saniye ve iki yüz kırk megabayt. Sınırın tamamı kullanılamaz; kullanılabilir pay taranan bir ayardır.
- IH42. Hata noktası, başarısız olup yeniden denenebilecek yer sayısıdır: adım sayısı artı adımlar arası geçiş sayısı. Kısmi başarıdan sonra telafi yolu modellenmiyor.
Beş İş Türü, Üç Eksen
// isler.mjs — bes is turunu sure, durum ve maliyet ekseninde kiyaslayan model; olcum degil, modeldir export const SURE_SINIRI = 900; // kurgu ust sinir, saniye export const BELLEK_TAVAN = 3072; // kurgu bellek tavani, MB export const BAGLANTI_OMRU = 900; // baglanti istekten uzun yasayamaz: ayni sinir export const AY_SN = 2592000; // otuz gunluk ay, saniye // Kurgu birimler — gercek para birimi degildir, yalnizca oranlar anlamlidir. export const CAGRI = 0.0000002; // cagri basina birim export const GBSN = 0.000017; // GB-saniye basina birim export const MAKINE_SAAT = 0.096; // surekli calisan kiralik makine, saat basina birim export const MAKINE_ESZAMAN = 40; // bir makinenin tasidigi es zamanli is export const MAKINE_BAGLANTI = 2000; // Bes is turu. `ay` aylik cagri sayisidir; surekli servislerde AY_SN / sn x es zamanli sayisi. export const ISLER = { 'kisa ve seyrek istek': { sn: 0.12, ay: 40000, mb: 256, eszaman: 1, baglanti: 0, durum: 'yok' }, 'gece toplu is': { sn: 2700, ay: 30, mb: 1024, eszaman: 1, baglanti: 0, durum: 'ara dosya' }, 'uzun suren donusturme': { sn: 4200, ay: 60, mb: 3072, eszaman: 1, baglanti: 0, durum: 'bellekte ara sonuc' }, 'kalici baglanti tutan servis': { sn: 1500, ay: 1382400, mb: 512, eszaman: 20, baglanti: 800, durum: 'oturum' }, 'yuksek ve surekli yuk': { sn: 0.09, ay: 1036800000, mb: 512, eszaman: 36, baglanti: 0, durum: 'yok' }, }; export const sunucusuzAy = (i) => i.ay * CAGRI + (i.ay * i.sn * i.mb) / 1024 * GBSN; export const makineAy = (i) => Math.max(1, Math.ceil(i.eszaman / MAKINE_ESZAMAN), Math.ceil(i.baglanti / MAKINE_BAGLANTI)) * 730 * MAKINE_SAAT; // Esigi asan kalem: hangi sinir once carpiyor. Sirasi onemlidir, ilk carpan yazilir. export function asan(i) { const k = []; if (i.baglanti > 0 && i.sn > BAGLANTI_OMRU) k.push('baglanti omru'); else if (i.sn > SURE_SINIRI) k.push('sure siniri'); if (i.mb > BELLEK_TAVAN) k.push('bellek tavani'); if (i.durum === 'bellekte ara sonuc' || i.durum === 'oturum') k.push('durum'); if (sunucusuzAy(i) > makineAy(i)) k.push('birim maliyet'); return k; } export const satir = (g, ...x) => x.map((v, i) => String(v).padEnd(g[i])).join(''); export const bir = (x) => (x >= 100 ? x.toFixed(0) : x >= 1 ? x.toFixed(2) : x.toFixed(4)); // Parcalayarak sigdirmanin kalemleri (kurgu): her sinirda ara durum yazilir ve sonra okunur. export const ARA_YAZ = 18, ARA_OKU = 12, ARA_MB = 240; export function parcala(sn, pay) { const kullanilabilir = SURE_SINIRI * pay - ARA_YAZ - ARA_OKU; if (kullanilabilir <= 0) return null; const adim = Math.ceil(sn / kullanilabilir); const ek = (adim - 1) * (ARA_YAZ + ARA_OKU); return { adim, ek, toplam: sn + ek, araMb: (adim - 1) * ARA_MB, hata: 2 * adim - 1, parcaSn: sn / adim + ARA_YAZ + ARA_OKU }; }
// kosum1.mjs — bes is turu sure, durum ve maliyet ekseninde yan yana konur import { ISLER, SURE_SINIRI, BELLEK_TAVAN, BAGLANTI_OMRU, MAKINE_ESZAMAN, sunucusuzAy, makineAy, asan, satir, bir } from './isler.mjs'; console.log(`sinirlar: sure ${SURE_SINIRI} sn | bellek ${BELLEK_TAVAN} MB | baglanti omru ${BAGLANTI_OMRU} sn`); console.log(`kurgu birimler: makine ${MAKINE_ESZAMAN} es zamanli is tasir; asagidaki sayilar birimdir, para degil\n`); const A = [30, 11, 13, 16, 10, 21]; console.log(satir(A, 'is turu', 'tek kosum', 'sinirin kati', 'aylik cagri', 'bellek', 'durum') + 'es zamanli'); for (const [ad, i] of Object.entries(ISLER)) { console.log(satir(A, ad, `${i.sn} sn`, `${(i.sn / SURE_SINIRI).toFixed(2)}x`, i.ay.toLocaleString('tr-TR'), `${i.mb} MB`, i.durum) + i.eszaman); } const B = [30, 14, 16, 9, 26]; console.log('\naylik maliyet ve esigi asan kalem'); console.log(satir(B, 'is turu', 'sunucusuz', 'kiralik makine', 'oran') + 'esigi asan kalem'); for (const [ad, i] of Object.entries(ISLER)) { const s = sunucusuzAy(i), m = makineAy(i), k = asan(i); console.log(satir(B, ad, bir(s), bir(m), `${(s / m).toFixed(2)}x`) + (k.length ? k.join(' + ') : 'yok')); }
sinirlar: sure 900 sn | bellek 3072 MB | baglanti omru 900 sn kurgu birimler: makine 40 es zamanli is tasir; asagidaki sayilar birimdir, para degil is turu tek kosum sinirin kati aylik cagri bellek durum es zamanli kisa ve seyrek istek 0.12 sn 0.00x 40.000 256 MB yok 1 gece toplu is 2700 sn 3.00x 30 1024 MB ara dosya 1 uzun suren donusturme 4200 sn 4.67x 60 3072 MB bellekte ara sonuc 1 kalici baglanti tutan servis 1500 sn 1.67x 1.382.400 512 MB oturum 20 yuksek ve surekli yuk 0.09 sn 0.00x 1.036.800.000 512 MB yok 36 aylik maliyet ve esigi asan kalem is turu sunucusuz kiralik makine oran esigi asan kalem kisa ve seyrek istek 0.0284 70.08 0.00x yok gece toplu is 1.38 70.08 0.02x sure siniri uzun suren donusturme 12.85 70.08 0.18x sure siniri + durum kalici baglanti tutan servis 17626 70.08 251.51x baglanti omru + durum + birim maliyet yuksek ve surekli yuk 1001 70.08 14.28x birim maliyet
İkinci tablo asıl ayrımı yapıyor. Kısa ve seyrek istek sunucusuzun tam ortasındadır: aylık maliyet sıfır virgül sıfır iki sekiz birim, kiralık makinenin iki bin dört yüzde biri. İş ayda kırk bin kez ve yüz yirmi milisaniye çalışıyor; sürekli açık duran bir makine bu işin neredeyse tamamında boş bekler. Devredilen kapasite kararının en açık kazandığı yer burasıdır.
Gece toplu iş ile uzun süren dönüştürme maliyet ekseninde de kazanır — biri kiralık makinenin yüzde ikisi, öteki yüzde on sekizi — ama ikisi de süre sınırını aşar. Bu iki iş için soru “pahalı mı” değil, “hiç çalışır mı”dır. Uzun süren dönüştürme ayrıca durumu bellekte tutar: dört bin iki yüz saniyelik iş boyunca biriken ara sonuç, koşum bittiğinde yok olan bir yerde durur.
Son iki satır tersine dönüyor. Kalıcı bağlantı tutan servis üç kalemi birden aşıyor: bağlantı ömrü, durum ve birim maliyet. Sunucusuz karşılığı kiralık makinenin iki yüz elli bir katıdır, çünkü sekiz yüz bağlantının her biri boyunca çalışan bir çağrı gibi ücretlendirilir — beklerken de. Yüksek ve sürekli yük ise yalnız maliyet ekseninde düşer: on dört kat pahalı.
Parçalayarak Sığdırmanın Bedeli
// kosum2.mjs — sigmayan isi parcalamanin bedeli ve surekli yukte basabas noktasi import { ISLER, SURE_SINIRI, AY_SN, ARA_YAZ, ARA_OKU, ARA_MB, GBSN, CAGRI, MAKINE_SAAT, MAKINE_ESZAMAN, parcala, sunucusuzAy, makineAy, satir, bir } from './isler.mjs'; const d = ISLER['uzun suren donusturme']; console.log(`"uzun suren donusturme" ${d.sn} sn, sinir ${SURE_SINIRI} sn, ara durum ${ARA_MB} MB, ` + `sinir basina yazma ${ARA_YAZ} sn + okuma ${ARA_OKU} sn`); const P = [12, 14, 8, 11, 13, 14, 14]; console.log(satir(P, 'sinir payi', 'parca suresi', 'adim', 'ek sure', 'toplam sure', 'ara durum', 'hata noktasi') + 'aylik birim'); for (const pay of [0.4, 0.6, 0.8, 0.95]) { const r = parcala(d.sn, pay); const maliyet = d.ay * r.adim * CAGRI + (d.ay * r.toplam * d.mb) / 1024 * GBSN; console.log(satir(P, `%${pay * 100}`, `${Math.round(r.parcaSn)} sn`, r.adim, `${r.ek} sn`, `${Math.round(r.toplam)} sn`, `${r.araMb} MB`, r.hata) + bir(maliyet)); } console.log(` parcalanmadan: 1 adim, 0 sn ek sure, 0 MB ara durum, 1 hata noktasi — ama tek kosum ` + `sinirin ${(d.sn / SURE_SINIRI).toFixed(2)} kati oldugu icin calismaz`); const g = ISLER['gece toplu is'], rg = parcala(g.sn, 0.8); console.log(` ayni %80 payla "gece toplu is" (${g.sn} sn): ${rg.adim} adim, ${rg.ek} sn ek sure, ` + `${rg.araMb} MB ara durum, ${rg.hata} hata noktasi`); // Kalici baglanti: is parcalanamaz, baglanti kopar. Bedeli yeniden baglanma sayisiyla olculur. const b = ISLER['kalici baglanti tutan servis']; const kopma = Math.ceil(AY_SN / SURE_SINIRI) * b.baglanti; console.log(`\n"kalici baglanti tutan servis": ${b.baglanti} baglanti, ortalama omur ${b.sn} sn`); console.log(` sinir ${SURE_SINIRI} sn oldugundan her baglanti ayda ${Math.ceil(AY_SN / SURE_SINIRI)} kez kopar: ` + `${kopma.toLocaleString('tr-TR')} yeniden baglanma; oturum durumu her seferinde disaridan okunur`); // Surekli yukte basabas: hangi istek/sn'de kiralik makine ucuzlar. const y = ISLER['yuksek ve surekli yuk']; const Y = [12, 14, 14, 14, 10]; console.log('\nsurekli yukte basabas — istek/sn taranir'); console.log(satir(Y, 'istek/sn', 'es zamanli is', 'sunucusuz/ay', 'makine/ay', 'makine') + 'hangisi ucuz'); for (const r of [1, 10, 28, 100, 400]) { const i = { ...y, ay: Math.round(r * AY_SN), eszaman: Math.ceil(r * y.sn) }; const s = sunucusuzAy(i), m = makineAy(i); console.log(satir(Y, r, i.eszaman, bir(s), bir(m), Math.max(1, Math.ceil(i.eszaman / MAKINE_ESZAMAN))) + (s < m ? 'sunucusuz' : 'kiralik makine')); }
"uzun suren donusturme" 4200 sn, sinir 900 sn, ara durum 240 MB, sinir basina yazma 18 sn + okuma 12 sn sinir payi parca suresi adim ek sure toplam sure ara durum hata noktasi aylik birim %40 353 sn 13 360 sn 4560 sn 2880 MB 25 13.95 %60 497 sn 9 240 sn 4440 sn 1920 MB 17 13.59 %80 630 sn 7 180 sn 4380 sn 1440 MB 13 13.40 %95 730 sn 6 150 sn 4350 sn 1200 MB 11 13.31 parcalanmadan: 1 adim, 0 sn ek sure, 0 MB ara durum, 1 hata noktasi — ama tek kosum sinirin 4.67 kati oldugu icin calismaz ayni %80 payla "gece toplu is" (2700 sn): 4 adim, 90 sn ek sure, 720 MB ara durum, 7 hata noktasi "kalici baglanti tutan servis": 800 baglanti, ortalama omur 1500 sn sinir 900 sn oldugundan her baglanti ayda 2880 kez kopar: 2.304.000 yeniden baglanma; oturum durumu her seferinde disaridan okunur surekli yukte basabas — istek/sn taranir istek/sn es zamanli is sunucusuz/ay makine/ay makine hangisi ucuz 1 1 2.50 70.08 1 sunucusuz 10 1 25.01 70.08 1 sunucusuz 28 3 70.04 70.08 1 sunucusuz 100 9 250 70.08 1 kiralik makine 400 36 1001 70.08 1 kiralik makine
Parçalama taraması şunu söylüyor: parçalamanın bedeli işi yavaşlatmak değildir. En kötü ayarda bile toplam süre dört bin iki yüzden dört bin beş yüz altmış saniyeye çıkıyor, yüzde sekiz virgül altı. Asıl fatura öteki üç sütunda. Sınır payı yüzde kırka çekildiğinde adım sayısı on üçe, ara durum iki bin sekiz yüz seksen megabayta, hata noktası yirmi beşe çıkıyor; yüzde doksan beşte bunlar altı adıma, bin iki yüz megabayta ve on bir hata noktasına iner — ama sınıra yaklaşmak, süresi biraz uzayan bir parçanın sınırı aşması demektir.
Yani parçalama, tek hata noktalı bir işi on bir ile yirmi beş hata noktalı bir işe çevirir ve aradaki her noktada bir ara durumun yazılıp okunmasına, dolayısıyla kalıcı bir depoya bağımlı hale getirir. Aynı yüzde seksen ayarında gece toplu iş dört adım, doksan saniye ek süre, yedi yüz yirmi megabayt ara durum ve yedi hata noktası ödüyor. Bunlar sunucusuzun kısıtından doğan, işin kendisinde bulunmayan kalemlerdir.
Kalıcı bağlantı satırı parçalamanın sınırını gösteriyor. Bu iş parçalanamaz: sınıra gelindiğinde kesilen şey hesaplama değil bağlantıdır. Sekiz yüz bağlantı ayda iki milyon üç yüz dört bin kez kopar ve her koptuğunda oturum durumu dışarıdan yeniden okunur. Buradaki bedel bir yavaşlama değil, bir tasarım değişikliğidir.
Başabaş taraması son ekseni bir sayıya bağlıyor. Saniyede yirmi sekiz isteğe kadar sunucusuz ucuzdur; sonrasında kiralık makine ucuzlar ve dört yüz istekte fark on dört kata çıkar. Bu sayı yedekliliği ve işletim emeğini saymıyor, yani gerçek başabaş noktası yirmi sekizin üstündedir. Ölçünün söylediği şudur: sunucusuzun maliyet avantajı doluluk oranıyla ters orantılıdır.
Hangi İş Uyar, Hangisi Uymaz
| İş türü | Uyar mı | Eşiği aşan kalem | Dolaşmanın bedeli |
|---|---|---|---|
| Kısa ve seyrek istek | Uyar | yok | yok — aylık 0,03 birim, makinenin 2.400’de biri |
| Gece toplu iş | Parçalanırsa uyar | süre sınırı: 2.700 sn, sınırın 3 katı | 4 adım, 90 sn, 720 MB ara durum, 7 hata noktası |
| Uzun süren dönüştürme | Zorlanır | süre sınırı: 4.200 sn, sınırın 4,67 katı + bellekte durum | 7 adım, 180 sn, 1.440 MB ara durum, 13 hata noktası |
| Kalıcı bağlantı tutan servis | Uymaz | bağlantı ömrü 900 sn < 1.500 sn + oturum durumu + maliyet 251 kat | parçalanamaz; ayda 2.304.000 yeniden bağlanma |
| Yüksek ve sürekli yük | Uymaz | birim maliyet: 28 istek/sn üstünde makine ucuzlar, 400’de 14 kat | yok — kısıt maliyettir, tasarımla dolaşılamaz |
Özet
- Kısa ve seyrek istek sunucusuzda aylık sıfır virgül sıfır iki sekiz birim tutar, kiralık makinenin iki bin dört yüzde biri; sürekli açık makine bu işin neredeyse tamamında boş bekler.
- Gece toplu iş ve uzun süren dönüştürme maliyette kazanır ama süre sınırını üç ve dört virgül altmış yedi kat aşar; dönüştürme ayrıca durumu bellekte tutar.
- Kalıcı bağlantı tutan servis üç kalemi birden aşar ve sunucusuz karşılığı kiralık makinenin iki yüz elli bir katıdır; bağlantı beklerken de ücretlendirilir.
- Parçalamanın bedeli süre değildir: toplam süre en fazla yüzde sekiz virgül altı uzar. Bedel adım sayısı, ara durum ve hata noktasıdır — dönüştürmede altı ile on üç adım, bin iki yüz ile iki bin sekiz yüz seksen megabayt ve on bir ile yirmi beş hata noktası.
- Kalıcı bağlantı parçalanamaz: sınırda kesilen hesaplama değil bağlantıdır, ayda iki milyon üç yüz dört bin yeniden bağlanma demektir.
- Sürekli yükte başabaş noktası saniyede yirmi sekiz istektir; üstünde kiralık makine ucuzlar, dört yüz istekte fark on dört kat. Sunucusuzun maliyet avantajı doluluk oranıyla ters orantılıdır.
Sonraki Adım
İşlevin sınırları sayıldı: süresi, belleği, eşzamanlılığı, paketi, yayını, geri alması ve nerede kullanılamayacağı. Bu konu boyunca ölçülen her şey tek bir işleve aitti — bir istek girdi, bir yanıt çıktı, arada bir sınır vardı. Oysa ölçüm ağının hiçbir işi tek işlevle bitmiyor: okuma gelince doğrulama tetikleniyor, doğrulama bitince fatura üretiliyor, fatura üretilince bildirim gidiyor. Bu zincirin kendisi hiç ölçülmedi. İşlevler birbirine nasıl bağlanacak — biri ötekini doğrudan mı çağıracak, yoksa aralarına bir şey mi girecek? Sonraki konu bağlantının kendisini ölçer.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.