Tizim dizayni kursi · 14-mavzu
TuzdiDinMuhammad

Resilience Engineering — nosozliklarga chidamli tizim

Taqsimlangan tizimda nosozlik — istisno emas, norma. Resilience Engineering tizimni buzilganda ham ishlashda davom etadigan qilib loyihalaydi. Noldan boshlab kaskadli nosozlik, timeout/retry/fallback, circuit breaker, bulkhead, load shedding va graceful degradation’ni NestJS bilan o‘rganamiz.

Stack: NestJS · RxJS · opossumMavzular: timeout · retry · circuit breaker · bulkheadBog‘liq: 1-mavzu (Mikroservis), 5 (LB), 12 (Observability)

Bu darsda nima bor

1–4-qismlar resilience’ni noldan quradi: nega kerak (kaskadli nosozlik), fail‘ni cheklash falsafasi, uch asosiy naqsh (timeout/retry/fallback) va NestJS implementatsiya. 5–6-qismlar — circuit breaker (uch holat) va izolyatsiya naqshlari (bulkhead, load shedding, graceful degradation). 7-qism amaliy qoidalar va chaos engineering. Bu dars kurs davomida ko‘p eslatilgan retry/circuit breaker/idempotency’ni to‘liq ochadi.

01
Resilience · qism 1

Nega kerak — kaskadli nosozlik

🌊

Oddiy o‘xshatish: kemada bitta bo‘lim teshilsa, suv butun kemani cho‘ktirmasligi uchun suvo‘tkazmas bo‘limlar (bulkhead) bo‘ladi. Bitta teshik — butun kemani emas, faqat bitta bo‘limni cho‘ktiradi.

Taqsimlangan tizimda nosozlik — istisno emas, norma. Tarmoq uziladi, xizmatlar sekinlashadi, bog‘liqliklar o‘ladi (partial failure — asosiy tushuncha). Savol "buziladimi?" emas, "buzilganda nima bo‘ladi?".

Muammo — kaskadli nosozlik

To‘lov xizmati sekinlashdi. Buyurtma xizmatining barcha oqimlari (thread) To‘lovdan javob kutib osilib qoldi. Yangi so‘rovlar uchun oqim qolmadi → Buyurtma xizmati ham o‘ldi. Endi u ham javob bermaydi → uni chaqirganlar ham osiladi → butun tizim ketma-ket qulaydi (cascading failure). Bitta sekin bog‘liqlik butun tizimni cho‘ktirdi.

Yechim — Resilience Engineering

Nosozliklarni oldindan kutib, tizimni ularga chidamli qilib loyihalash. Maqsad — barcha nosozlikni oldini olish (imkonsiz) emas, balki ularni cheklash: tez fail bo‘lish, izolyatsiya qilish, silliq degradatsiya va avtomatik tiklanish. Bu — timeout, retry, circuit breaker, bulkhead kabi naqshlar to‘plami.

02
Resilience · qism 2

Asosiy g‘oya — fail‘ni cheklash

Resilience’ning falsafasi — "buzilmaydigan tizim" emas (bunday tizim yo‘q), balki buzilganda ham ishlashda davom etadigan tizim.

Naive: bitta fail → hammasi qulaydi kaskad 🔥 Resilient: fail izolyatsiya qilinadi qolgani ishlaydi ✓
Maqsad: nosozlikni cheklash — butun tizimga tarqatmaslik

To‘rt tamoyil:

  • Tez fail bo‘l (fail fast): abadiy kutma; muammoni tez aniqlab, tezda xato qaytar.
  • Izolyatsiya qil: bitta bog‘liqlikning nosozligi boshqalarga tarqamasin.
  • Silliq degradatsiya: to‘liq o‘lish o‘rniga — cheklangan, lekin ishlaydigan holat.
  • Avtomatik tiklan: bog‘liqlik tuzalganda — o‘zi qayta ulanadi.
03
Resilience · qism 3

Timeout, retry, fallback

backoff · jitter

Uch asosiy, birinchi navbatdagi naqsh:

1 · Timeout — hech qachon abadiy kutma

Eng muhim va eng ko‘p unutiladigan naqsh: har bir masofaviy chaqiruvga vaqt chegarasi qo‘y. Timeout bo‘lmasa, bitta sekin chaqiruv butun tizimni osiltiradi (1-bo‘limdagi kaskad aynan shundan boshlanadi).

2 · Retry — o‘tkinchi nosozlikni qayta urinish

Ba’zi nosozliklar o‘tkinchi (vaqtincha tarmoq, qisqa yuk). Ularni qayta urinib hal qilish mumkin. Lekin uch shart: faqat idempotent amallar (2 marta bajarilsa zarar bo‘lmasin), backoff + jitter bilan (bir zumda emas), va cheklangan (3-5 marta, cheksiz emas).

3 · Fallback — muvaffaqiyatsizlikda oqilona javob

Biror narsa fail bo‘lganda — xato qaytarish o‘rniga, oqilona zaxira javob: keshlangan eski ma’lumot, default qiymat yoki cheklangan funksiya. "Tavsiyalar yuklanmadi" o‘rniga "eng mashhur mahsulotlar"ni ko‘rsat.

Retry’ning xavfi — retry bo‘roni

Diqqat: xizmat sekinlashdi → hamma retry qildi → yuk 2-3 barobar oshdi → xizmat butunlay yiqildi. Bu — retry storm (5-mavzu). Shuning uchun retry doim backoff + jitter + limit bilan bo‘lishi shart.

04
Resilience · qism 4

NestJS implementatsiya

RxJS · opossum

NestJS’da bu naqshlarni RxJS va opossum (circuit breaker kutubxonasi) bilan amalga oshiramiz.

1 · Timeout + retry + fallback

// TIMEOUT + RETRY + FALLBACK — RxJS bilan (masofaviy chaqiruv himoyasi)
this.http.get(url).pipe(
  timeout(3000),                                   // 3s da javob yo'q -> xato
  retry({ count: 3, delay: (err, i) => timer(backoff(i)) }),  // 3 marta, backoff bilan
  catchError(() => of(FALLBACK_VALUE)),            // fallback: xato o'rniga default/cache
);

2 · Backoff + jitter

// EXPONENTIAL BACKOFF + JITTER: har urinishda ko'proq kut + tasodifiy qo'shimcha
function backoff(attempt: number): number {
  const base = Math.min(1000 * 2 ** attempt, 30_000);   // 1s, 2s, 4s, 8s ... max 30s
  const jitter = Math.random() * base;                  // "retry bo'roni"ni yoyadi
  return base / 2 + jitter;
}

3 · Circuit breaker (opossum)

// CIRCUIT BREAKER (opossum) — tinmay fail bo'lsa chaqirishni to'xtat
import CircuitBreaker from "opossum";

const breaker = new CircuitBreaker(() => this.payment.charge(orderId), {
  timeout: 3000,                  // 3s da javob yo'q -> fail
  errorThresholdPercentage: 50,   // 50% xato -> circuit OCHILADI (fail fast)
  resetTimeout: 10_000,           // 10s dan keyin HALF-OPEN (sinash uchun)
});
breaker.fallback(() => ({ status: "queued" }));   // ochiq holatda fallback

const result = await breaker.fire();              // ochiq bo'lsa darhol fallback qaytadi
Amaliy maslahat

Har masofaviy chaqiruvni (boshqa xizmat, tashqi API, hatto DB) shu himoya bilan o‘rab qo‘y. NestJS’da buni interceptor yoki umumiy "resilient HTTP client" servisiga jamlab, har joyda takrorlamaslik mumkin.

05
Chuqurlashtirilgan mavzu

Circuit Breaker

closed · open · half-open
🔌

Circuit breaker (elektr avtomatidek) — resilience’ning eng muhim naqshi. Bog‘liqlik tinmay fail bo‘lsa, uni "uzib qo‘yib" (chaqirishni to‘xtatib), o‘layotgan xizmatga tinch olishga imkon beradi.

Nega kerak

Xizmat o‘lgan/sekinlashgan bo‘lsa, unga tinmay so‘rov yuborish ikki tomonga zarar: sen har safar timeout kutasan (sekin), va o‘layotgan xizmatni yanada bosasan (tuzalishga imkon bermaysan). Circuit breaker buni sezib, so‘rovni darhol rad etadi (fail fast).

Uch holat

CLOSEDnormal, o‘tkazadi ko‘p xato OPENdarhol rad (fail fast) resetTimeout HALF-OPENbittasini sinaydi sinov muvaffaqiyatli → CLOSED
Closed (normal) → Open (fail fast) → Half-Open (sinash) → Closed
  • Closed: normal holat, so‘rovlar o‘tadi. Lekin xatolar sanaladi.
  • Open: xato darajasi chegaradan oshdi → circuit "ochiladi", so‘rovlar darhol rad etiladi (yoki fallback) — o‘layotgan xizmat bosilmaydi.
  • Half-Open: ma’lum vaqtdan keyin — bitta sinov so‘rovi yuboriladi. Muvaffaqiyatli bo‘lsa → Closed (tuzaldi); yana fail bo‘lsa → Open.
Nega bu kaskadni to‘xtatadi

1-bo‘limdagi kaskad — sekin bog‘liqlikka tinmay kutishdan boshlanadi. Circuit breaker o‘sha kutishni kesadi (fail fast + fallback), demak oqimlar band bo‘lmaydi, kaskad boshlanmaydi. Shu bois u eng muhim resilience naqshi.

06
Chuqurlashtirilgan mavzu

Bulkhead, load shedding, degradation

bulkhead · load shedding
🚢

Yana uchta muhim naqsh nosozlikni izolyatsiya qiladi va tizimni to‘liq qulashdan saqlaydi.

1 · Bulkhead — resurslarni ajratish

Kemadagi suvo‘tkazmas bo‘limlardek: har bog‘liqlik uchun alohida resurs havzasi (thread/ulanish pool). Shunda bitta bog‘liqlik barcha oqimlarni yeb qo‘ysa — faqat o‘sha havza tugaydi, boshqalari ishlayveradi:

To‘lov havzasi (to‘lgan 🔥) Katalog havzasi ✓ Auth havzasi ✓
Bulkhead: bitta havza to‘lsa ham, boshqalari ishlayveradi

2 · Load shedding — ortiqcha yukni rad etish

Tizim to‘lsa — ortiqcha so‘rovlarni ataylab rad et (rate limiting). "Hammani sekin xizmat qilib qulash" o‘rniga "ba’zilarni yaxshi xizmat qilib omon qolish" afzal. Barchaga xizmat qilmoqchi bo‘lib hech kimga qila olmaslikdan yaxshiroq.

3 · Graceful degradation — funksiyani kamaytirish

To‘liq o‘lish o‘rniga — ikkilamchi funksiyani o‘chirib, asosiysini saqlash. Tavsiya xizmati o‘lsa — sayt ishlayveradi, faqat tavsiyalar ko‘rinmaydi (yoki keshdan). Foydalanuvchi kichik cheklovni butunlay o‘lishdan afzal ko‘radi.

07
Qaror

Amaliy qoidalar va chaos

Resilience — tizimning bir qismi emas, butun dizayn falsafasi. Birinchi kundan singdiriladi.

Amaliy qoidalar

1. Har masofaviy chaqiruvga timeout — istisnosiz. Bu eng muhim va eng arzon himoya.

2. Retry faqat idempotent amallarga, backoff + jitter + limit bilan — retry bo‘ronidan qoch.

3. Kritik bog‘liqliklarga circuit breaker — kaskadni to‘xtatadi.

4. Muhim resurslarni bulkhead bilan izolyatsiya qil; ortiqcha yukni load shedding bilan rad et.

5. Har fail uchun fallback / graceful degradation o‘yla — "bu o‘lsa, foydalanuvchi nima ko‘radi?"

6. Nosozlikni sinab ko‘r (chaos engineering): ataylab xizmatlarni o‘chirib, tizim chidashini tekshir — incident bo‘lishdan oldin.

Kuzatuvchanlik bilan birga

Resilience naqshlari 12-mavzu (Observability) bilan juft: circuit breaker holati, retry soni, timeout’lar, fallback’lar — hammasi metrika sifatida kuzatilishi kerak. "Circuit ochilib qoldimi?", "retry darajasi oshdimi?" — bularga alert qo‘y.

08
Yakuniy

Eslab qolish kerak bo‘lgan 5 jumla

  • Taqsimlangan tizimda nosozlik — norma. Resilience — buzilganda ham ishlashda davom etadigan tizim quradi. Asosiy xavf — kaskadli nosozlik (bitta sekin bog‘liqlik butun tizimni cho‘ktiradi).
  • Uch asosiy naqsh: Timeout (abadiy kutma — eng muhim), Retry (o‘tkinchi fail — faqat idempotent, backoff+jitter+limit), Fallback (fail’da oqilona zaxira javob).
  • Circuit breaker — eng muhim: Closed → Open (fail fast) → Half-Open (sinash). O‘layotgan xizmatni bosmaydi, kaskadni to‘xtatadi.
  • Bulkhead (resurslarni izolyatsiya), load shedding (ortiqcha yukni rad), graceful degradation (funksiyani kamaytirish — to‘liq o‘lish emas).
  • Har masofaviy chaqiruvga timeout; retry faqat idempotent; kritik bog‘liqlikka circuit breaker; nosozlikni sinab ko‘r (chaos engineering); hammasini kuzat (12-mavzu).

Bu mavzuning Deep/Senior qatlami (circuit breaker sozlash/ichki mexanika, adaptiv timeout, retry budget & hedged requests, bulkhead o‘lchamlash, backpressure, load shedding algoritmlari, deadline propagation, self-healing, chaos engineering amaliyoti, idempotency key chuqur) kerak bo‘lsa — ayting.

Yoki oxirgi mavzu — “15-mavzu: Clean Architecture” — butun kursni toza kod tuzilmasi bilan yakunlaydi.