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.
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?".
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.
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.
Asosiy g‘oya — fail‘ni cheklash
Resilience’ning falsafasi — "buzilmaydigan tizim" emas (bunday tizim yo‘q), balki buzilganda ham ishlashda davom etadigan tizim.
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.
Timeout, retry, fallback
backoff · jitterUch 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.
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.
NestJS implementatsiya
RxJS · opossumNestJS’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
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.
Circuit Breaker
closed · open · half-openCircuit 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
- 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.
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.
Bulkhead, load shedding, degradation
bulkhead · load sheddingYana 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:
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.
Amaliy qoidalar va chaos
Resilience — tizimning bir qismi emas, butun dizayn falsafasi. Birinchi kundan singdiriladi.
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.
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.
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.