Ders 18 / 18
Biçem Seçimi ve Ödünleşim Çözümlemesi
Biçem kararının ölçülebilir bir savunmaya çevrilmesi: aynı üç kuralın iki sınır yerleşiminde ortak temelde ölçülmesi, üç nitelik senaryosunun eşiğine karşı geçme durumunun hesaplanması, hiçbir düzenin üç eşiği birden geçmemesinin gösterilmesi ve kararı çeviren eşiğin bulunması.
İçindekiler
Beş dağıtım düzeni beş ayrı sayı kümesi bıraktı: birlikte yayınlanan dosya sayısı, sınır geçişi, sınırdan geçen bayt, bir birim durduğunda ayakta kalan birim sayısı, yeni bir yetenek için düzenlenen dosya sayısı. Hiçbir düzen bu ölçülerin hepsinde önde değildi; her kazanç bir başka sayıyı büyüttü. Bu ders o durumda seçimin nasıl yapıldığını ve bir seçimin savunmasının neye dayandığını ele alır.
Kalite niteliği ve nitelik senaryosu Kalite ve Test Temelleri kursunun Kalite Nitelikleri dersinde kuruldu. Burada tanımlanmazlar, karar aracı olarak kullanılırlar.
Kararı Taşıyan Üç Parça
Bir biçem savunması üç parçadan oluşur. Birincisi senaryo: hangi nitelik, hangi uyaran altında, hangi ortamda sorulmaktadır. İkincisi eşik: o niteliğin yanıt ölçütünde kabul edilen değer. Üçüncüsü ölçülen değer: düzenin o ölçütte gerçekten aldığı sayı. Üçünden biri eksikse savunma yoktur, yalnız tercih vardır. “Mikroservis daha esnektir” cümlesinde üçü de eksiktir: hangi değişikliğin, hangi eşiğin ve hangi ölçünün konuşulduğu belirsizdir.
Ödünleşim de aynı biçimden çıkar. Bir düzen bir eşiği geçmek için başka bir ölçütün değerini büyütür; ödünleşim, bu iki sayının aynı karar içinde yan yana durmasıdır. İki düzeni karşılaştıran bir ölçüm bu yüzden tek bir sayı üretmez, bir vektör üretir.
Ortak Temel
Karşılaştırmanın önkoşulu ortak temeldir: aynı kurallar, aynı girdi, aynı sayma yordamı. Aksi hâlde ölçülen fark biçemden değil, iki gerçekleştirimin ayrıntı farkından gelir. Bu yüzden üç kural tek bir dosyada durur ve iki düzen de aynı dosyayı kullanır. Değişen tek şey sınırların yeridir.
// karar/kural.mjs — uc kural: iki duzen de ayni kurallari kullanir, degisen yalniz sinirlarin yeri const TARIFE = { kademe: [[1, 3000], [5, 4800], [20, 9600]], bolge: { "34": 100, "06": 115, "35": 125 }, asgari: 2500 }; const AGAC = { "34": ["34"], "06": ["34", "06"], "35": ["34", "41", "35"] }; export const KURAL = { fiyat(g) { const kademe = TARIFE.kademe.find(([k]) => g.agirlik <= k) ?? [0, 9600]; const taban = Math.max(TARIFE.asgari, Math.round((kademe[1] * TARIFE.bolge[g.bolge]) / 100)); return { net: taban - Math.round(taban * Math.min(g.oran, 0.4)) }; }, plan(g) { const rota = AGAC[g.bolge] ?? ["34"]; return { gun: rota.length, tasiyici: rota.length > 2 ? "MT" : "AN" }; }, hacim(g, durum) { durum.set(g.sozlesmeNo, (durum.get(g.sozlesmeNo) ?? 0) + g.agirlik); return { hacim: [...durum.values()].reduce((t, a) => t + a, 0) }; }, };
Düzen bir listedir: hangi kuralın hangi dağıtım biriminde durduğunu söyler. Tek birimli düzende üç kural aynı birimdedir ve aralarında sınır yoktur; üç birimli düzende her kural kendi birimindedir ve gövde her sınırda serileşir. Koşturucu ikisini aynı sayaçlarla ölçer ve bir birimi durdurma seçeneği taşır.
// karar/duzen.mjs — ayni uc kurali iki duzende kosturur: tek dagitim birimi ve uc ayri birim import { KURAL } from "./kural.mjs"; export const DUZEN = { "tek birim": [["fiyat", "plan", "hacim"]], "uc birim": [["fiyat"], ["plan"], ["hacim"]], }; export function kostur(birimler, gonderiler, duran = null) { const olcu = { gecis: 0, donusum: 0, bayt: 0, yanit: 0, ayakta: 0, son: {} }; const durum = new Map(); for (const g of gonderiler) { const sonuc = {}; for (const birim of birimler) { if (birim.includes(duran)) continue; const metin = birimler.length === 1 ? null : JSON.stringify(g); // sinir varsa govde serilesir if (metin !== null) olcu.donusum += 2, olcu.bayt += metin.length; olcu.gecis += 1; for (const ad of birim) Object.assign(sonuc, KURAL[ad](metin === null ? g : JSON.parse(metin), durum)); } if ("net" in sonuc) olcu.yanit += 1; // ucret olmadan istek yanitsizdir olcu.son = sonuc; } olcu.ayakta = birimler.filter((b) => b.includes(duran) === false).length; return olcu; }
Üç Senaryo ve Bir Eşik
Üç senaryo üç ayrı nitelik ailesinden gelir ve her biri tek bir yanıt ölçütüne indirilmiştir. Sürdürülebilirlik senaryosu tarife kuralı değiştiğinde onunla birlikte yayınlanması gereken kural sayısını sorar ve en çok 1 kabul eder. Başarım verimliliği senaryosu üç gönderi için sınırdan geçen baytı sorar ve en çok 100 kabul eder. Güvenilirlik senaryosu hacim biriminin durduğu ortamda yanıtlanan istek sayısını sorar ve en az 3 ister. Betik üç eşiği iki düzene uygular, sonra her eşiği düzenin ölçülen değerine taşıyarak kararın hangi eşikte döndüğünü arar.
// karar/olc.mjs — iki duzeni uc nitelik senaryosunun esigine karsi olcer ve karari ceviren esigi arar import { DUZEN, kostur } from "./duzen.mjs"; const GONDERI = [ { id: "G1", agirlik: 4, bolge: "35", sozlesmeNo: "S7", oran: 0.15 }, { id: "G2", agirlik: 1, bolge: "34", sozlesmeNo: "S7", oran: 0 }, { id: "G3", agirlik: 12, bolge: "06", sozlesmeNo: "S9", oran: 0.25 }, ]; const SENARYO = [ { ad: "S1 surdurulebilirlik", olcut: "birlikte yayinlanan kural", esik: 1, enCok: true }, { ad: "S2 basarim verimliligi", olcut: "sinirdan gecen bayt", esik: 100, enCok: true }, { ad: "S3 guvenilirlik", olcut: "yanitlanan istek", esik: 3, enCok: false }, ]; const ALAN = ["dagitim birimi", "birlikte yayinlanan kural", "sinir gecisi", "donusum noktasi", "sinirdan gecen bayt", "yanitlanan istek", "ayakta kalan birim"]; const olcum = Object.entries(DUZEN).map(([ad, birimler]) => { const tam = kostur(birimler, GONDERI); const arizali = kostur(birimler, GONDERI, "hacim"); return { ad, son: tam.son, "dagitim birimi": birimler.length, "birlikte yayinlanan kural": birimler.find((b) => b.includes("fiyat")).length, "sinir gecisi": tam.gecis, "donusum noktasi": tam.donusum, "sinirdan gecen bayt": tam.bayt, "yanitlanan istek": arizali.yanit, "ayakta kalan birim": `${arizali.ayakta}/${birimler.length}`, }; }); console.log(`${"olcu".padEnd(26)}${olcum.map((o) => o.ad.padStart(11)).join("")}`); for (const a of ALAN) console.log(`${a.padEnd(26)}${olcum.map((o) => String(o[a]).padStart(11)).join("")}`); for (const o of olcum) console.log(`${o.ad.padEnd(10)} son gonderinin sonucu = ${JSON.stringify(o.son)}`); const gecti = (o, s) => (s.enCok ? o[s.olcut] <= s.esik : o[s.olcut] >= s.esik); for (const s of SENARYO) { const okuma = olcum.map((o) => `${o.ad} = ${o[s.olcut]} ${gecti(o, s) ? "gecti" : "kaldi"}`); console.log(`${s.ad}: ${s.olcut} ${s.enCok ? "<=" : ">="} ${s.esik} -> ${okuma.join(", ")}`); } for (const o of olcum) console.log(`${o.ad.padEnd(10)} gectigi senaryo = ${SENARYO.filter((s) => gecti(o, s)).length}/3`); console.log(`ucunu birden gecen duzen sayisi = ${olcum.filter((o) => SENARYO.every((s) => gecti(o, s))).length}`); for (const s of SENARYO) { for (const o of olcum.filter((x) => gecti(x, s) === false)) { console.log(`${s.ad} esigi ${s.esik} yerine ${o[s.olcut]} olmadikca "${o.ad}" gecmez`); } } for (const s of SENARYO) { const kalan = SENARYO.filter((x) => x !== s); const gecen = olcum.filter((o) => kalan.every((x) => gecti(o, x))).map((o) => o.ad); console.log(`${s.ad} birakilirsa kalan ikisini gecen duzen = ${gecen.join(", ") || "yok"}`); }
node karar/olc.mjs
olcu tek birim uc birim
dagitim birimi 1 3
birlikte yayinlanan kural 3 1
sinir gecisi 3 9
donusum noktasi 0 18
sinirdan gecen bayt 0 588
yanitlanan istek 0 3
ayakta kalan birim 0/1 2/3
tek birim son gonderinin sonucu = {"net":8280,"gun":2,"tasiyici":"AN","hacim":17}
uc birim son gonderinin sonucu = {"net":8280,"gun":2,"tasiyici":"AN","hacim":17}
S1 surdurulebilirlik: birlikte yayinlanan kural <= 1 -> tek birim = 3 kaldi, uc birim = 1 gecti
S2 basarim verimliligi: sinirdan gecen bayt <= 100 -> tek birim = 0 gecti, uc birim = 588 kaldi
S3 guvenilirlik: yanitlanan istek >= 3 -> tek birim = 0 kaldi, uc birim = 3 gecti
tek birim gectigi senaryo = 1/3
uc birim gectigi senaryo = 2/3
ucunu birden gecen duzen sayisi = 0
S1 surdurulebilirlik esigi 1 yerine 3 olmadikca "tek birim" gecmez
S2 basarim verimliligi esigi 100 yerine 588 olmadikca "uc birim" gecmez
S3 guvenilirlik esigi 3 yerine 0 olmadikca "tek birim" gecmez
S1 surdurulebilirlik birakilirsa kalan ikisini gecen duzen = yok
S2 basarim verimliligi birakilirsa kalan ikisini gecen duzen = uc birim
S3 guvenilirlik birakilirsa kalan ikisini gecen duzen = yok
Sayıların Okunması
İki düzenin son gönderi için ürettiği sonuç birebir aynı: {"net":8280,"gun":2,"tasiyici":"AN","hacim":17}.
Bu satır kararın ne hakkında olmadığını söylüyor. Doğruluk iki düzende de aynıdır; biçem seçimi
işlevsel beklenti üzerine değil, onun etrafındaki sayılar üzerine verilir.
Vektörün geri kalanı iki düzeni ters yönde ayırıyor. Tek birimli düzende sınır geçişi 3, dönüştürme noktası 0, sınırdan geçen bayt 0 — üç kural aynı bellek alanında çağrıldığı için sınır maliyeti yoktur. Karşılığında tarife kuralı değiştiğinde onunla birlikte yayınlanan kural sayısı 3’tür ve hacim kuralı durduğunda yanıtlanan istek 0/3’e, ayakta kalan birim 0/1’e iner: aynı birimde oldukları için biri durunca hepsi durur. Üç birimli düzende ilk üç sayı büyüyor — geçiş 9, dönüşüm 18, bayt 588, yani gönderi başına yaklaşık 65 baytın dokuz kez taşınması — ama birlikte yayınlanan kural 1’e, yanıtlanan istek 3/3’e çıkıyor.
Bu iki satırın ilk ve üçüncü derste ölçülenlerle akrabalığı vardır; yeni olan altlarındaki üç satırdır. Üç eşiğe karşı tek birimli düzen 1/3, üç birimli düzen 2/3 geçiyor ve üçünü birden geçen düzen sayısı 0. Bu bir ölçüm eksiği değil, yanıtın biçimidir: eşik kümesi çelişkiliyse hiçbir düzen onu karşılamaz ve karar eşikleri sıralamaya döner.
Sıralamanın hangi eşikte döndüğü de hesaplandı. Kararı çeviren eşik S2’dir: yalnız o bırakıldığında kalan iki senaryoyu geçen bir düzen çıkıyor, üç birimli düzen. S1 ya da S3 bırakıldığında geçen düzen yok, çünkü ikisi de tek birimli düzenin kaldığı ölçütlerdir. Aynı hesap eşiklerin ne kadar oynaması gerektiğini de veriyor: S2 eşiği 100’den 588’e çıkarılmadıkça üç birimli düzen geçmez, S1 eşiği 1’den 3’e ve S3 eşiği 3’ten 0’a inmedikçe tek birimli düzen geçmez. Bir savunma bu biçimde yazılır: “üç birimli düzen seçilmiştir, çünkü S1 ve S3 eşikleri korunmuş ve S2 eşiği 588 bayta gevşetilmiştir.”
Son olarak ölçülmemiş eksen. Betik yalnız üç ölçüt biliyor; bir düzeni dördüncü bir nitelikte değerlendirmesi istenseydi karşılığında bir sayı bulamazdı. Ölçülmemiş bir eksen karar taşımaz — tartışmada ağırlığı olmaz, çünkü hangi düzenin geçtiği hesaplanamaz. Kursun her dersinde bir ölçü tanımlanmasının nedeni budur.
Özet
- Bir biçem savunması üç parçadan oluşur: nitelik senaryosu, eşik ve ölçülen değer; biri eksikse ortada savunma değil tercih vardır.
- Karşılaştırma ortak temel ister: iki düzen aynı üç kuralı, aynı üç gönderiyi ve aynı sayaçları kullandı ve son gönderi için birebir aynı sonucu üretti.
- Tek birimli düzen sınır maliyetini sıfırda tuttu (geçiş 3, dönüşüm 0, bayt 0) ama birlikte yayınlanan kuralı 3’e, hacim durduğunda yanıtlanan isteği 0/3’e bıraktı.
- Üç birimli düzen aynı işi 9 geçiş, 18 dönüşüm ve 588 baytla yaptı; karşılığında birlikte yayınlanan kural 1, yanıtlanan istek 3/3, ayakta kalan birim 2/3 oldu.
- Üç eşiği birden geçen düzen sayısı 0 çıktı; bu bir ölçüm eksiği değil, çelişkili eşik kümesinin sonucudur ve kararı eşikleri sıralamaya çevirir.
- Kararı çeviren eşik hesaplandı: yalnız S2 bırakıldığında üç birimli düzen kalan iki senaryoyu geçiyor; S2 eşiği 100’den 588’e çıkmadıkça geçmiyor.
Kurs Kapanışı
Kurs, üç konuya yayılmış biçemleri tek bir soruyla ele aldı: aynı gönderi ücretlendirme ve yönlendirme kitaplığı o düzende kurulduğunda hangi sayı küçülür, hangisi büyür. Derslerin bıraktığı ölçüler aşağıdaki karar tablosunda toplanıyor.
| Ders | İyileşen nitelik | Ölçülen kazanç | Ödenen sayı |
|---|---|---|---|
| Katmanlı Mimari | sürdürülebilirlik | açık ilan okuma isteğini 4 katmandan 2’ye, 4 sınırdan 1’e indirdi | aynı istek iki ayrı yerden karşılanabilir hâle geldi |
| Altıgen ve Soğan Mimari | sürdürülebilirlik | onarımdan sonra halka kenarı 5’ten 3’e, iki kuralın ihlali 0’a indi | her kural ötekinin gördüğü kusura kör: altıgen 4, soğan 6 kenar yasaklıyor |
| Temiz Mimari | sürdürülebilirlik | çıktı modeli geçirildiğinde erişilebilir ad 10’dan 4’e, JSON 174’ten 81 karaktere indi | sınırda ayrı bir model türü ve bir dönüştürme noktası |
| Bileşen Tabanlı Mimari | sürdürülebilirlik | yeteneğe göre bölünmede dışa açılan ad 8’den 6’ya, birlikte yayın oranı 0.39’dan 0.27’ye indi | yüzeyleri atlayan tek tüketici dışa açılan adı 6’dan 10’a çıkardı |
| Mikroçekirdek ve Eklenti Mimarisi | sürdürülebilirlik | çekirdek 4 eklenti adı yerine 0 taşıyor, ithal kapanışı 5 dosyadan 1’e indi | adlar kapanışı 6 dosya olan bileşim köküne taşındı; sözleşme koşum anında denetlenir |
| Kara Tahta Mimarisi | genişletilebilirlik | dokuz dosyanın yedisinde başka birim adı 0; beşinci çözümleyici 1 dosya ekletti | aynı sonuç 3 tur, 5 yoklama ve 7 okuma harcadı; ilk yazan kazanır kuralı 24 sıralamada 3 ayrı tutar üretti |
| İstemci–Sunucu | sürdürülebilirlik | teslimat tarafının bildiği modül 3’ten 1’e, ad 4’ten 1’e indi | hata ithal anından koşum anına kaydı; üç değişimi öğrenmek 12 soru, 9’u boş |
| Eşler Arası | güvenilirlik | kritik birim yıldızda 1, halkada ve tam ağda 0 | bilinen komşu 10’dan 30’a; halkada 18 ileti ve 3 tur |
| Model–Görünüm Aileleri | sürdürülebilirlik | görünümün tanıdığı model adı 5’ten 0’a, ithal kapanışı 2’den 1’e indi | sınırdan geçen 62 bayt 115’e, değişen dosya 1’den 2’ye çıktı |
| Borular ve Süzgeçler | sınanabilirlik | altı adımın altısı tek başına koşturuldu, yeni adımı ekleyen dosya 0 alan adı tanıyor | süzgeç girişlerinden geçen 28 alanın 17’si okunmadan taşındı |
| Yayımla–Abone Ol | sürdürülebilirlik | yayımcının bildiği modül 3’ten 1’e, ithal kapanışı 4’ten 2 dosyaya indi | “bu olayı kim işliyor” sorusu 1 dosya yerine 7 modül tarattı |
| Mesaj Kuyrukları ve Akışlar | başarım verimliliği | yayımcı 60 iş biriminin 0’ını kendi zamanından harcadı | ikinci tüketiciyle bitiş sırası 3 yerde bozuldu, 8 ileti 9 kez teslim edildi |
| Tek Parça Mimari | başarım verimliliği | sınır geçişi 4, dönüşüm noktası 0, sınırdan geçen bayt 0 | 1 dosyalık değişiklik 4 dosya yayınlattı; kusurda ayakta kalan birim 0/2 |
| Servis Yönelimli Mimari | uyumluluk | öğrenilecek gövde biçimi 1’e indi | kanonik alan 10, istek gövdesi 427 bayt; bolge değişince 3 dosya |
| Mikroservis Mimarisi | güvenilirlik | yeniden yayınlanan dosya 1, ücret durduğunda 3 uçtan 2’si 200 döndürdü | 18 satır sunucu tekrarı, sonuç durumu 4, öğrenilecek sözleşme 3 |
| Olay Güdümlü Mimari | sürdürülebilirlik | üçüncü tüketici yayıncıda 0 satır düzenletti, tüketici düştüğünde 3/3 | dönüşüm noktası 0’dan 9’a, bayt 0’dan 476’ya; biriktirende sapma 12 |
| Sunucusuz Mimari | sürdürülebilirlik | koşum satırı 0, yeni bileşim için düzenlenen işlev dosyası 0 | soğukta kurulum 2’den 6’ya; modül durumunda sapma 5, depo 13 erişim |
Tablonun tek bir okuması var: sağ kolon hiçbir satırda boş değil. Her biçem bir niteliği ölçülebilir biçimde iyileştirdi ve karşılığında başka bir sayıyı büyüttü. Sağ kolonun boş göründüğü bir karar, ölçülmemiş bir karardır.
Bu kurs, Yazılım Tasarımı ve Mimari İlkeler müfredatının altı kursunun son basamağıdır ve basamakların tamamı ölçeğin büyümesiyle sıralanır. Temiz Kod satırı ve adı ölçtü; Programlama Paradigmaları aynı işin farklı hesaplama biçimlerinde nasıl yazıldığını; Tasarım İlkeleri modülün ve sınıfın sorumluluk sınırını; Tasarım Kalıpları birlikte çalışan nesne kümelerinin yinelenen düzenlerini; Alan Odaklı Tasarım bir uygulamanın alan modelini ve bağlam sınırlarını; bu kurs ise uygulamanın kendisinin dağıtım birimlerine bölünüşünü. Her basamakta ölçünün birimi değişti: satır sayısından ad sayısına, ad sayısından ithal kapanışına, ithal kapanışından sınır geçişine, sınır geçişinden birlikte yayınlanan dosya ve ayakta kalan birim sayısına.
Bir basamak daha vardır ve orada soru bu kursun sorusundan ayrılır. Bu kurs biçemleri bir tasarım kararı olarak karşılaştırdı: aynı kitaplığın düzenlenişleri, tek makinede modellenmiş sınırlarla. Sonraki müfredat Sistem Tasarımı ve Dağıtık Sistemler aynı birimleri gerçek bir sistemin kısıtları altında ele alır: ölçek, gecikme, tutarlılık ve arıza davranışı. Bu dersteki 588 bayt orada bir ağ bütçesine, 3/3 yanıt oranı bir erişilebilirlik hedefine, hacim kuralının tuttuğu durum bir tutarlılık modeline dönüşür. Biçem seçimi orada da aynı üç parçayla savunulur; değişen, eşiklerin nereden geldiğidir.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.