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.
Dekompozitsiya strategiyalari
bounded context · ConwayCore’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.
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.
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.
Servislararo aloqa chuqur
gRPC · contract · versioningCore’da sync/async farqini ko‘rdik. Senior aniq texnologiya va shartnoma (contract) darajasida qaror qiladi.
Sinxron: REST vs gRPC
| REST/JSON | gRPC | |
|---|---|---|
| Transport | HTTP/1.1, matn (JSON) | HTTP/2, binary (protobuf) |
| Tezlik/hajm | Sekinroq, katta | Tez, ixcham |
| Shartnoma | OpenAPI (ixtiyoriy) | .proto (majburiy, tipli) |
| Streaming | Yo‘q (asosan) | Bor (bi-directional) |
| Qachon | Tashqi/public API | Ichki, 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
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).
Service discovery va registry
client/server-sideServislar dinamik: instance’lar ko‘payadi, o‘ladi, IP o‘zgaradi. "Buyurtma servisi qayerda?" — buni service discovery hal qiladi.
Ikki yondashuv
- 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).
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.
Ma‘lumot boshqaruvi
db-per-service · CDCMikroservisning 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.
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.
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.
Service mesh va cross-cutting
sidecar · mTLS · IstioRetry, 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:
# 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
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.
Deploy, versiyalash, contract test
Pact · canaryMikroservisning 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
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.
Anti-pattern‘lar va fallacies
distributed monolithMikroservisda ko‘p loyiha bir xil tuzoqlarga tushadi. Senior ularni nomi bilan taniydi va oldini oladi.
| Anti-pattern | Belgisi va zarari |
|---|---|
| Distributed monolith | Servislar shunchalik bog‘langanki, birga deploy bo‘ladi — mikroservis murakkabligi, monolit qat’iyligi (eng yomoni) |
| Shared database | Bir necha servis bitta DB’ni bo‘lishadi — izolyatsiya buziladi |
| Chatty communication | Bitta amal uchun o‘nlab tarmoq chaqiruvi (N+1 tarmoqda) — sekin, mo‘rt |
| Nano-services | Haddan mayda — shovqin, overhead, boshqarib bo‘lmaydi |
| Premature decomposition | Domenni tushunmasdan erta bo‘lish — noto‘g‘ri chegaralar |
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).
Qachon mikroservis va senior cheklist
Qachon mikroservis (va qachon YO‘Q)
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 / amaliyot | Bo‘lim |
|---|---|
| Servislarni biznes qobiliyati (bounded context) bo‘yicha ajrataman; Conway qonunini hisobga olaman | 1 |
| REST vs gRPC va sync vs async ni to‘g‘ri tanlayman; shartnomani backward-compatible tutaman | 2 |
| Service discovery (client/server-side) va health check bilan ishlayman | 3 |
| Database-per-service, CDC/outbox, API composition/CQRS read model qo‘llayman | 4 |
| Cross-cutting concern’larni service mesh (sidecar/mTLS)ga ko‘chiraman | 5 |
| Mustaqil deploy + contract testing (Pact) bilan integratsiyani himoyalayman | 6 |
| Anti-pattern’larni (distributed monolith, shared DB) taniyman va qochaman | 7 |
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).