Tizim dizayni kursi · 1-mavzu · DEEP / SENIOR
TuzdiDinMuhammad

Microservices — Senior chuqurlik

Bu — 1-mavzuning 2-qatlami. Core darslikni o‘qib bo‘lgan deb hisoblanadi. Bu yerda eng chuqur narsalar: dekompozitsiya strategiyalari, gRPC va shartnomalar, service discovery, ma‘lumot boshqaruvi (CDC), service mesh, contract testing va anti-pattern‘lar — junior’dan seniorgacha.

Daraja: SeniorMavzular: bounded context · gRPC · mesh · PactOld shart: 1-mavzu (Core)

Bu qatlamda nima bor

Core darslik asoslarni berdi. Bu Deep qatlam senior darajadagi chuqur mexanikani ochadi: servislarni to‘g‘ri ajratish (bounded context, Conway), gRPC va backward-compatible shartnomalar, service discovery, database-per-service va ma‘lumot tarqatish (CDC/outbox), service mesh (sidecar/mTLS), mustaqil deploy va contract testing, hamda anti-pattern‘lar. Oxirida — qachon mikroservis kerak va senior cheklist.

01
Deep · Decompose

Dekompozitsiya strategiyalari

bounded context · Conway
🧭

Core’da "nega mikroservis" ni ko‘rdik. Senior’ning birinchi va eng qiyin savoli — qanday bo‘lish kerak? Noto‘g‘ri chegara "distributed monolith"ga olib keladi (eng yomon holat).

To‘g‘ri o‘q — biznes qobiliyati (business capability)

Servislarni texnik qatlam bo‘yicha emas (UserDB-service, EmailService), balki biznes qobiliyati / subdomen bo‘yicha ajrat: Buyurtma, To‘lov, Inventar, Yetkazish. Bu — DDD bounded context (15-mavzu) bilan bir xil chegara.

❌ Texnik bo‘yichaDB-svc, Auth-svc, Util-svc ✓ Biznes qobiliyati bo‘yichaBuyurtma · To‘lov · Inventar · Yetkazish
Servis chegarasi = biznes chegarasi (bounded context)

To‘g‘ri o‘lcham va Conway qonuni

  • Juda mayda emas: "nano-service"lar tarmoq shovqini va murakkablikni oshiradi. Servis — bitta jamoa egalik qila oladigan, mustaqil deploy bo‘ladigan biznes birligi.
  • Conway qonuni: tizim tuzilishi jamoa tuzilishini aks ettiradi. Servis chegaralarini jamoa chegaralariga moslashtir — aks holda kommunikatsiya to‘qnashadi.
  • Yuqori koh'eziya, past bog‘lanish: birga o‘zgaradigan narsa bitta servisda; kam bog‘langan narsalar alohida.
Oltin qoida

Agar bitta biznes o‘zgarishi bir necha servisni birga o‘zgartirishni talab qilsa — chegaralar noto‘g‘ri. To‘g‘ri chegarada har o‘zgarish bitta servisda qoladi.

02
Deep · Comms

Servislararo aloqa chuqur

gRPC · contract · versioning
🔌

Core’da sync/async farqini ko‘rdik. Senior aniq texnologiya va shartnoma (contract) darajasida qaror qiladi.

Sinxron: REST vs gRPC

REST/JSONgRPC
TransportHTTP/1.1, matn (JSON)HTTP/2, binary (protobuf)
Tezlik/hajmSekinroq, kattaTez, ixcham
ShartnomaOpenAPI (ixtiyoriy).proto (majburiy, tipli)
StreamingYo‘q (asosan)Bor (bi-directional)
QachonTashqi/public APIIchki, yuqori yuk (east-west)
// gRPC — servislararo SINXRON aloqa uchun (HTTP/2 + protobuf, tez, tipli)
// order.proto
syntax = "proto3";
service OrderService {
  rpc GetOrder (GetOrderRequest) returns (Order);           // request-response
  rpc StreamOrders (StreamRequest) returns (stream Order);  // server streaming
}
// NestJS gRPC klient — boshqa servisni chaqirish
@Injectable()
export class OrderClient implements OnModuleInit {
  private svc: OrderServiceGrpc;
  constructor(@Inject("ORDER_PKG") private client: ClientGrpc) {}
  onModuleInit() { this.svc = this.client.getService("OrderService"); }

  getOrder(id: string) {
    return firstValueFrom(this.svc.getOrder({ id }));   // tipli, Observable
  }
}

Shartnoma va versiyalash

Backward compatibility

Servislar mustaqil deploy bo‘lgani uchun — shartnoma o‘zgarishi ehtiyotkorlik talab qiladi. Qoida: faqat qo‘shimcha (yangi ixtiyoriy maydon), hech qachon buzuvchi o‘zgarish (maydonni o‘chirish/qayta nomlash). protobuf’da maydon raqamlari hech qachon qayta ishlatilmaydi. Katta o‘zgarishda — yangi versiya endpoint (v2).

03
Deep · Discovery

Service discovery va registry

client/server-side
📖

Servislar dinamik: instance’lar ko‘payadi, o‘ladi, IP o‘zgaradi. "Buyurtma servisi qayerda?" — buni service discovery hal qiladi.

Ikki yondashuv

Client-side discovery klient registry so‘ra servis Server-side (LB/mesh) klient LB servis
Client-side: klient registry’dan so‘raydi · Server-side: LB/mesh yashiradi
  • Client-side: klient registrydan (Consul, Eureka, etcd) manzilni so‘rab, o‘zi tanlaydi. Ko‘proq nazorat, klientga yuk.
  • Server-side: klient LB/meshga yuboradi, u topadi. Klient sodda. Kubernetes buni tabiiy beradi (Service + kube-dns).
Health check bilan (5-mavzu)

Registry health check bilan ishlaydi: o‘lik instance ro‘yxatdan avtomatik chiqariladi, sog‘lomi qoladi. Bu — 5-mavzu (Load Balancing) va self-healing (14-mavzu) bilan bir tizim.

04
Deep · Data

Ma‘lumot boshqaruvi

db-per-service · CDC
🗄️

Mikroservisning eng qiyin qismi — ma’lumot. "Database-per-service" ajoyib izolyatsiya beradi, lekin yangi muammolar keltiradi.

Database-per-service oqibatlari

  • Cross-service query yo‘q: "buyurtma + mijoz ismi"ni bitta JOIN bilan ololmaysan (boshqa DB). Yechim: API composition (bir necha servisdan yig‘ish) yoki CQRS read model (9-mavzu — event’lardan tayyor ko‘rinish).
  • Taqsimlangan tranzaksiya: bir amal ko‘p servisga tegsa — Saga (13-mavzu), 2PC emas.
  • Ma’lumot dublikatsiyasi: har servis o‘ziga kerakli ma’lumotning nusxasini saqlaydi (mijoz ismi Buyurtma servisda ham) — event orqali yangilanadi.
CDC — ma’lumotni tarqatish

Servislar orasida ma’lumotni izchil tarqatish uchun Change Data Capture (Debezium — 7-mavzu Deep): bir servis DB’sidagi o‘zgarish eventga aylanib, boshqalar o‘z nusxasini yangilaydi. Outbox (3-mavzu) bilan birga — ishonchli, atomik tarqatish.

Shared database — anti-pattern

Bir necha servis bitta DBni bo‘lishsa — bu izolyatsiyani buzadi: bittasi sxemani o‘zgartirsa, boshqalari buziladi. Bu — "distributed monolith"ning asosiy belgisi. Har servis o‘z ma’lumotiga egalik qilishi shart.

05
Deep · Mesh

Service mesh va cross-cutting

sidecar · mTLS · Istio
🕸️

Retry, timeout, mTLS, tracing — bularni har servis kodida yozish takror va xatoga moyil. Service mesh bu cross-cutting concern’larni infratuzilmaga ko‘chiradi.

Sidecar naqshi

Har servis yonida sidecar proxy (Envoy) turadi. Barcha kiruvchi/chiquvchi trafik u orqali o‘tadi — va u ilova bilmagan holda retry, timeout, circuit breaking, mTLS, tracing, load balancing qiladi:

Servis Asidecar mTLS sidecarServis B
Sidecar: ilova biznesga, mesh esa tarmoq concern’lariga javob beradi
# Service mesh (Istio) — cross-cutting concern'larni ILOVADAN chiqaradi (sidecar)
apiVersion: networking.istio.io/v1
kind: VirtualService
spec:
  http:
    - route:
        - destination: { host: order-service, subset: v1 }
          weight: 90                      # canary: 90% v1
        - destination: { host: order-service, subset: v2 }
          weight: 10                      # 10% v2
      retries: { attempts: 3, perTryTimeout: 2s }   # retry ILOVASIZ (mesh qiladi)
      timeout: 5s
Nima beradi

Traffic: canary/blue-green routing (8-mavzu), retry/timeout (14-mavzu). Xavfsizlik: avtomatik mTLS (servislar aro shifrlash). Kuzatuvchanlik: avtomatik metrika/trace (12-mavzu). Kamchilik: qo‘shimcha murakkablik va kechikish — kichik tizimga ortiqcha bo‘lishi mumkin.

06
Deep · Deploy

Deploy, versiyalash, contract test

Pact · canary
🚀

Mikroservisning va’dasi — mustaqil deploy. Lekin mustaqillik integratsiya buzilishi xavfini keltiradi. Senior buni contract testing bilan hal qiladi.

Mustaqil deploy tamoyillari

  • Bitta servis — bitta konteyner/pipeline: har servis o‘z CI/CD’siga ega, alohida deploy bo‘ladi.
  • Backward-compatible o‘zgarish: yangi versiya eski klientlar bilan ishlashda davom etsin (2-bo‘lim).
  • Canary/blue-green (5, 8-mavzu) — yangi versiyani asta chiqarish.

Contract testing — integratsiya buzilishini oldini olish

Servislar mustaqil deploy bo‘lsa — biri o‘zgarib, ikkinchisini bilmasdan buzishi mumkin. To‘liq integratsiya testi sekin va mo‘rt. Contract test (Pact) yechadi: iste’molchi o‘z kutilmasini yozadi, ta’minlovchi CI’da unga mosligini tekshiradi:

// CONTRACT TEST (Pact) — integratsiyani BUZMASDAN mustaqil deploy qilish
// Consumer (Buyurtma) o'z kutilmasini yozadi:
pact.given("order 42 mavjud")
   .uponReceiving("GetOrder so'rovi")
   .withRequest({ method: "GET", path: "/orders/42" })
   .willRespondWith({ status: 200, body: { id: "42", status: "confirmed" } });
// -> Provider (To'lov) shu shartnomaga MOS ekanini CI'da tekshiradi
//    endi biri o'zgarsa, deploy'dan OLDIN buzilish aniqlanadi
Nega muhim

Contract test — mikroservisni haqiqatan mustaqil qiladi: har jamoa o‘z servisini alohida deploy qila oladi, chunki shartnoma buzilsa, deploy’dan oldin (CI’da) bilinadi, productionda emas.

07
Deep · Pitfalls

Anti-pattern‘lar va fallacies

distributed monolith
⚠️

Mikroservisda ko‘p loyiha bir xil tuzoqlarga tushadi. Senior ularni nomi bilan taniydi va oldini oladi.

Anti-patternBelgisi va zarari
Distributed monolithServislar shunchalik bog‘langanki, birga deploy bo‘ladi — mikroservis murakkabligi, monolit qat’iyligi (eng yomoni)
Shared databaseBir necha servis bitta DB’ni bo‘lishadi — izolyatsiya buziladi
Chatty communicationBitta amal uchun o‘nlab tarmoq chaqiruvi (N+1 tarmoqda) — sekin, mo‘rt
Nano-servicesHaddan mayda — shovqin, overhead, boshqarib bo‘lmaydi
Premature decompositionDomenni tushunmasdan erta bo‘lish — noto‘g‘ri chegaralar
Taqsimlangan tizim yolg‘onlari (fallacies)

Klassik xato taxminlar: "tarmoq ishonchli", "kechikish nol", "band kengligi cheksiz", "tarmoq xavfsiz", "topologiya o‘zgarmas". Har biri — mikroservisda haqiqiy muammo manbai. Senior har tarmoq chaqiruvini fail bo‘lishi mumkin, sekin va xavfli deb hisoblab loyihalaydi (14-mavzu resilience).

08
Deep · Reference

Qachon mikroservis va senior cheklist

Qachon mikroservis (va qachon YO‘Q)

Monolitdan boshla

Aksariyat loyiha uchun modular monolith (2-mavzu) to‘g‘ri boshlanish: sodda, tez, bitta tranzaksiya. Mikroservisga haqiqiy ehtiyoj (mustaqil masshtab, jamoa mustaqilligi, alohida deploy tezligi) paydo bo‘lganda — modul chegarasi bo‘yicha ajratasan (strangler fig, 2-mavzu). Mikroservis — yechim emas, ayirboshlash (trade-off).

Senior tayyorlik cheklisti

Savol / amaliyotBo‘lim
Servislarni biznes qobiliyati (bounded context) bo‘yicha ajrataman; Conway qonunini hisobga olaman1
REST vs gRPC va sync vs async ni to‘g‘ri tanlayman; shartnomani backward-compatible tutaman2
Service discovery (client/server-side) va health check bilan ishlayman3
Database-per-service, CDC/outbox, API composition/CQRS read model qo‘llayman4
Cross-cutting concern’larni service mesh (sidecar/mTLS)ga ko‘chiraman5
Mustaqil deploy + contract testing (Pact) bilan integratsiyani himoyalayman6
Anti-pattern’larni (distributed monolith, shared DB) taniyman va qochaman7

Bu 1-mavzuning Deep/Senior qatlami edi — Core bilan birga, Microservices endi to‘liq.

Bog‘liq mavzular: 2-mavzu (Modular Monolith — qayerdan boshlash), 13 (Saga), 12 (Observability), 5/8 (LB, Gateway), 15 (Clean Architecture — har servis ichi).