WisarWisar
Dasturlash kitobi/9-QISM — Arxitektura27 daqiqa

9.5-bob: Monolith vs Microservices — qachon qaysi biri

9-QISM — Arxitektura va ilg'or backend · 5-mavzu


1. Kirish va motivatsiya

8.16'da NestJS mikroservislarini texnik jihatdan ko'rdik (transport, message pattern, Gateway). Endi shu mavzuni arxitektura qarori sifatida — chuqur, balansli, real tajriba asosida — o'rganamiz. Bu — senior dasturchi va junior'ni eng aniq ajratadigan mavzulardan biri: qaysi arxitekturani qachon tanlash. Junior "mikroservis zamonaviy, demak yaxshi" deb o'ylaydi; senior "qaysi muammoni hal qilyapmiz, qaysi narx?" deb so'raydi. Bu bob — moda emas, muhandislik mulohazasi haqida.

Avval eng muhim haqiqat (2026 holati): ko'pchilik mikroservisga shoshildi va pushaymon bo'ldi. Sanoatda katta tendensiya — mikroservisdan modular monolithga qaytish (Amazon Prime Video, Segment kabi kompaniyalar ham birlashtirdi). Sabab: mikroservis bepul emas — u biznes muammosini tarmoq, taqsimlangan tranzaksiya, monitoring, deploy murakkabligiga almashtiradi. Kichik jamoa uchun bu — yutuq emas, zarar. Shuning uchun bu bobda "qaysi yaxshi" emas, "qachon qaysi" ni ko'ramiz — bu senior bilim.

Bu bob: monolit vs mikroservis (chuqur taqqoslash), modular monolith (2026'ning g'olibi — "uchinchi yo'l"), Conway qonuni (tashkilot arxitekturani belgilaydi), qachon ajratish (jamoa hajmi, yuk, real signal), distributed monolith (eng yomon kombinatsiya — qochish kerak), Strangler Fig (migratsiya naqshi), mikroservis narxi (haqiqiy), va qaror doirasi (decision framework). Bu bob 8.16 (texnik), 9.3 (arxitektura), 9.4 (bounded context), 10 (DevOps) bilan bog'liq. Bu — arxitektor darajasidagi qaror qabul qilish bilimi.

O'xshatish: monolit vs mikroservis — bir uy vs ko'p uylik mahalla qurish. Bir oila (kichik jamoa) uchun — bitta yaxshi rejalashtirilgan uy (modular monolith — ichida alohida xonalar: oshxona, yotoqxona — chegaralar bor, lekin bir tom ostida). Bu — oson qurish, oson boshqarish, oson isitish. Mahalla (mikroservis — ko'p alohida uy) faqat katta jamiyat (katta jamoa) uchun kerak: har oila o'z uyida mustaqil yashaydi, lekin yo'l, suv, elektr (tarmoq, monitoring, deploy) — murakkab infratuzilma kerak. Kichik oilaga mahalla qurish — keraksiz xarajat, bo'sh uylar, boshqarib bo'lmaydigan murakkablik. Avval bir yaxshi uy quring (toza xonalar bilan) — oila o'sganda mahallaga aylantirasiz.

Nega muhim?

  • Senior qaror — qaysi arxitektura (moda emas, muhandislik).
  • 2026 tendensiya — modular monolith (mikroservisdan qaytish).
  • Xato qimmat — noto'g'ri tanlov (erta mikroservis = falokat).
  • Conway qonuni — tashkilot = arxitektura (chuqur tushuncha).

2. Nazariya — chuqur tushuntirish

2.1. Monolit nima (va u "yomon" emas)

text
  MONOLIT — bitta ilova, bitta kodbaza, bitta deploy:
  - Barcha modul (user, order, payment) bir jarayonda
  - Bir DB; modul'lar funksiya chaqiruvi orqali gaplashadi (tarmoq emas)
  - Bir marta deploy (hamma birga)

   MONOLIT "ESKI/YOMON" EMAS — eng keng, eng amaliy:
   Oddiy (bir kod, bir deploy, bir DB)
   Tez (funksiya chaqiruvi — tarmoq latency yo'q)
   Oson debug/test (bir jarayon — stack trace to'liq)
   Tranzaksiya oddiy (bir DB — ACID — 6.9)
   Juda katta bo'lsa — og'ir (build, deploy sekin); butun masshtab

Monolit — bitta ilova/kodbaza/deploy (modullar bir jarayonda, funksiya chaqiruvi orqali — tarmoq emas). Monolit "eski/yomon" emas (keng tarqalgan noto'g'ri tushuncha) — aksincha, eng amaliy: oddiy, tez (tarmoq latency yo'q), oson debug/test, tranzaksiya oddiy (bir DB — ACID — 6.9). Kamchilik faqat juda katta bo'lganda (build/deploy sekin, butun masshtab). Ko'p loyiha umrbod monolit qoladi (va to'g'ri qiladi). GitHub, Shopify, Stack Overflow — monolit.

2.2. Mikroservis nima (va uning haqiqiy narxi)

text
  MIKROSERVIS — ko'p mustaqil xizmat 8.16-bob:
  - Har xizmat: o'z kodbaza, o'z DB, alohida deploy
  - Xizmatlar tarmoq orqali gaplashadi (HTTP/gRPC/queue)

  AFZALLIK:
   Mustaqil masshtab (faqat og'ir qism)
   Mustaqil deploy (jamoa parallel ishlaydi)
   Texnologiya erkinligi; xato izolyatsiyasi

   HAQIQIY NARX (ko'pincha yashiriladi):
   Tarmoq (latency, ishonchsizlik — xizmat o'rtasida)
   Taqsimlangan tranzaksiya (Saga — 8.16: 2.10 — murakkab)
   Monitoring/tracing (qaysi xizmatda muammo?)
   Deploy/infra (Kubernetes, service mesh — 10)
   Ma'lumot izchilligi (eventual consistency)
   Lokal ishlab chiqish qiyin (10 xizmat lokal?)

Mikroservis — ko'p mustaqil xizmat 8.16-bob. Afzallik: mustaqil masshtab/deploy, texnologiya erkinligi, xato izolyatsiyasi. Lekin haqiqiy narx ko'pincha yashiriladi: tarmoq (latency + ishonchsizlik — funksiya chaqiruvi endi tarmoq so'rovi), taqsimlangan tranzaksiya (Saga — murakkab — 8.16: 2.10), monitoring/tracing, deploy/infra murakkabligi (Kubernetes — 10), eventual consistency, lokal ishlab chiqish qiyinligi. Mikroservis muammoni yo'qotmaydi — uni boshqa joyga ko'chiradi (kod infratuzilma). Narxni bilish — senior belgisi.

2.3. Asosiy taqqoslash (jadval)

text
  ┌──────────────────┬─────────────────────┬─────────────────────┐
  │                  │ MONOLIT             │ MIKROSERVIS         │
  ├──────────────────┼─────────────────────┼─────────────────────┤
  │ Murakkablik      │ Kod (bitta katta)   │ Tizim (ko'p+tarmoq) │
  │ Deploy           │ Bir marta (hammasi) │ Mustaqil (har xizmat)│
  │ Masshtab         │ Butun (gorizontal)  │ Tanlab (faqat og'ir) │
  │ Tranzaksiya      │ Oddiy (ACID)        │ Murakkab (Saga)     │
  │ Tarmoq           │ Yo'q (funksiya)     │ Bor (latency)       │
  │ Debug            │ Oson (bir joy)      │ Qiyin (tracing)     │
  │ Jamoa            │ Kichik-o'rta        │ Katta (parallel)    │
  │ Lokal dev        │ Oson                │ Qiyin (ko'p xizmat) │
  │ Boshlang'ich tez │ Tez                 │ Sekin (infra)       │
  └──────────────────┴─────────────────────┴─────────────────────┘
   Monolit: murakkablik KODDA; Mikroservis: murakkablik TIZIMDA

Taqqoslash: monolit murakkabligi — kodda (bitta katta kodbaza); mikroservis murakkabligi — tizimda (ko'p xizmat + tarmoq + infra). Monolit: oson deploy/debug/tranzaksiya, kichik jamoa; mikroservis: mustaqil masshtab/deploy, katta jamoa, lekin tarmoq/tracing/infra murakkabligi. Tanlov — qaysi murakkablikni boshqarishga tayyorsiz: kod (monolit) yoki tizim (mikroservis). Ko'p jamoa uchun kod murakkabligi yengilroq.

2.4. Modular Monolith (2026'ning g'olibi — "uchinchi yo'l")

text
  MODULAR MONOLITH — monolit + mikroservis afzalligi (eng yaxshi balans):
  - Bitta deploy (monolit — oddiy)
  - Lekin ICHIDA qat'iy modullar (mikroservis — chegaralar)
  - Har modul: o'z chegarasi, interfeysi (9.4 bounded context)
  - Modullar interfeys orqali gaplashadi (to'g'ridan ichkariga emas)

  ┌─────────────────────────────────────┐
  │         MODULAR MONOLITH            │
  │  ┌────────┐ ┌────────┐ ┌────────┐  │
  │  │ Users  │ │ Orders │ │Payment │  │  qat'iy modullar
  │  │ (modul)│ │ (modul)│ │ (modul)│  │   (interfeys orqali)
  │  └────────┘ └────────┘ └────────┘  │
  │         BITTA DEPLOY                 │
  └─────────────────────────────────────┘

   Oddiy deploy + toza chegaralar (kerak bo'lsa — oson ajratish)

Modular Monolith (2026'ning g'olibi — "uchinchi yo'l"): monolit oddiyligi + mikroservis chegaralari. Bitta deploy (monolit), lekin ichida qat'iy modullar (har biri o'z chegarasi, interfeysi — bounded context 9.4). Modullar interfeys orqali gaplashadi (to'g'ridan ichkariga tegmaydi — SOLID 9.1). Bu — eng yaxshi boshlang'ich tanlov: monolit qulayligi + kerak bo'lganda oson ajratish (toza modul mikroservis). NestJS modul 8.1-bob — modular monolith uchun ideal. "Microservices too expensive: modular monoliths win 2026."

2.5. Conway qonuni (tashkilot = arxitektura)

text
  CONWAY QONUNI (1967):
  "Tizim dizayni tashkilot aloqa tuzilmasini aks ettiradi"

   Kodning arxitekturasi JAMOA tuzilmasini takrorlaydi:
  - 1 jamoa  monolit (tabiiy)
  - 5 mustaqil jamoa  5 xizmat (tabiiy)
  - 3 jamoa, lekin 10 xizmat  kaos (jamoaxizmat mos emas)

   TESKARI manyovr (Inverse Conway):
  Avval JAMOANI tuz (qanday arxitektura xohlasang),
  keyin arxitektura tabiiy shakllanadi

   Arxitektura = jamoa tuzilmasi (alohida emas)

Conway qonuni (chuqur, ko'p e'tibordan chetda): "tizim dizayni tashkilot aloqasini aks ettiradi" (1967). Ya'ni kod arxitekturasi jamoa tuzilmasini takrorlaydi (1 jamoa monolit; 5 mustaqil jamoa 5 xizmat tabiiy). Mikroservis muvaffaqiyati — texnologiyadan ko'ra jamoaga bog'liq: "poorly defined team boundaries poorly defined service boundaries". Agar jamoa chegaralari noaniq bo'lsa — xizmatlar doim bir-biriga bog'liq (mustaqillik illyuziya). Inverse Conway: avval jamoani tuz, arxitektura ergashadi. Arxitektura — tashkilot masalasi.

2.6. Qachon monolit (default tanlov)

text
  MONOLIT (modular) — DEFAULT, agar:
   Jamoa kichik-o'rta (< 15-30 dasturchi)
   Yangi loyiha / startup (domen hali aniq emas)
   MVP, tez bozorga chiqish kerak
   Yuk o'rtacha (< 1M so'rov/kun)
   Tranzaksiya muhim (moliyaviy — ACID)
   Kichik DevOps jamoasi (infra murakkabligini ko'tara olmaydi)

   Shubha bo'lsa — MODULAR MONOLITH (xato bo'lsa, arzon tuzatish)

Monolit (modular) — default: kichik-o'rta jamoa (<15-30 dasturchi), yangi loyiha/startup (domen aniq emas — 9.4), MVP (tez chiqish), o'rtacha yuk (<1M so'rov/kun), tranzaksiya muhim (moliyaviy — ACID), kichik DevOps. "Below 30 engineers — default to modular monolith". Shubha bo'lsa — modular monolith (xato bo'lsa arzon tuzatish — keyin ajratish; mikroservisdan qaytish qimmat). Ko'p loyiha (sizning loyihalaringiz ham) — monolit yetadi.

2.7. Qachon mikroservis (haqiqiy signallar)

text
  MIKROSERVIS — faqat HAQIQIY signal bo'lsa:
   Katta jamoa (> 30-50 dasturchi — parallel ishlash kerak)
   Mustaqil masshtab ISBOTLANGAN (bir qism 10x yuklangan)
   Mustaqil deploy zarur (jamoalar bir-birini kutmasligi)
   Turli texnologiya zarur (ML — Python, real-time — Go)
   Domen ANIQ (bounded context aniqlangan — 9.4)
   Kuchli DevOps (Kubernetes, monitoring, CI/CD — 10)

   NOTO'G'RI sabablar (mikroservisga emas):
  - "Zamonaviy/moda" (texnik sabab emas)
  - "Google shunday qiladi" (siz Google emassiz — masshtab boshqa)
  - "Kelajakda kerak bo'lar" (YAGNI — 9.1: 2.12)

Mikroservis — faqat haqiqiy signal: katta jamoa (>30-50 — parallel ishlash), masshtab isbotlangan (bir qism 10x yuklangan — taxmin emas), mustaqil deploy zarur, turli texnologiya, domen aniq (bounded context — 9.4), kuchli DevOps (10). Noto'g'ri sabablar: "zamonaviy/moda", "Google shunday" (siz Google emassiz — masshtab boshqa), "kelajakda kerak" (YAGNI — 9.1: 2.12). Mikroservis — muammoga javob (jamoa/masshtab), texnologiya tanloviga emas. Signal bo'lmasa — monolit.

2.8. Distributed Monolith (eng yomon — qochish kerak)

text
   DISTRIBUTED MONOLITH — eng yomon kombinatsiya:
  Mikroservis ko'rinishi (ko'p xizmat) + monolit bog'liqligi (qattiq)

  Belgilari:
  - Xizmatlar bir-birisiz ishlay olmaydi (qattiq bog'liq)
  - Bir o'zgarish  ko'p xizmatni birga deploy
  - Bir xizmat yiqilsa  hammasi yiqiladi
  - Umumiy DB (xizmatlar bir DB'ga tegadi)

   Mikroservis NARXI + monolit CHEKLOVI (ikkisining yomoni!)
   Sabab: noto'g'ri ajratish (chegara yo'q — 9.4, Conway 2.5)

Distributed Monolith (eng yomon — mutlaqo qochish kerak): mikroservis ko'rinishi (ko'p xizmat) + monolit bog'liqligi (qattiq). Belgilar: xizmatlar bir-birisiz ishlamaydi, bir o'zgarish ko'p xizmat deploy, bir yiqilsa hammasi, umumiy DB. Bu — mikroservis narxi + monolit cheklovi (ikki dunyoning yomoni!). Sabab: noto'g'ri ajratish (chegara yo'q — 9.4, Conway buzilishi — 2.5). Mikroservisga erta/noto'g'ri o'tish distributed monolith. Monolit bundan yaxshiroq.

Boshqa mikroservis anti-naqshlari (nomi bilan bilish kerak): (1) Distributed monolith — yuqoridagi (qattiq bog'liq xizmatlar). (2) Nano-service — xizmatlar haddan tashqari mayda (har bitta funksiya alohida xizmat) xizmatlar soni portlaydi, tarmoq chaqiruvlari ko'payadi, boshqarish imkonsiz (ajratish foydasidan ko'p zarar). (3) Chatty services ("gapdon" xizmatlar) — bir amal uchun xizmatlar o'nlab marta bir-birini chaqiradi (tarmoq zanjiri) latency portlaydi, ishonchlilik tushadi (bitta yaxlit chaqiruv o'rniga ko'p mayda so'rov). Uchalasining ildizi bir xil: noto'g'ri chegara (juda qattiq yoki juda mayda). To'g'ri chegara — bounded context 9.4-bob: xizmat biznes qobiliyati atrofida, mustaqil ishlay oladigan bo'lishi kerak, funksiya atrofida emas.

2.9. Qachon ajratish (monolit mikroservis signallar)

text
  MONOLIT'DAN AJRATISH SIGNALLARI (haqiqiy ehtiyoj):
  1. Build/deploy juda sekin (har kichik o'zgarish — 30 daqiqa build)
  2. Jamoalar bir-birini bloklaydi (deploy navbati)
  3. Bir modul boshqalardan butunlay boshqa masshtab (10x yuk)
  4. Bir modul boshqa texnologiya talab qiladi (ML, real-time)
  5. Bir modul tez-tez yiqiladi (boshqalarni ham yiqitadi)

   Bu signallar PAYDO BO'LGANDA ajrat (oldindan emas)
   Eng og'ir/mustaqil modulni BIRINCHI ajrat (eng ko'p foyda)

Qachon ajratish (haqiqiy signal — taxmin emas): build/deploy juda sekin, jamoalar bir-birini bloklaydi, bir modul butunlay boshqa masshtab (10x), boshqa texnologiya, tez-tez yiqiladi. Bu signallar paydo bo'lganda ajratiladi (oldindan emas — YAGNI). Eng og'ir/mustaqil modul birinchi ajratiladi (eng ko'p foyda — masalan: bildirishnoma, video qayta ishlash, hisobot). Asta-sekin (Strangler Fig — 2.10). "Monolith first" (Martin Fowler — 8.16: 2.1).

2.10. Strangler Fig (migratsiya naqshi)

text
  STRANGLER FIG — monolit'ni asta-sekin ajratish (xavfsiz):
  (nomi: anjir daraxti daraxtni asta-sekin o'rab, o'rnini egallaydi)

  1. Yangi imkoniyatni alohida xizmat sifatida qur (monolit'ga emas)
  2. Mavjud modulni asta-sekin chiqar (bittadan)
  3. Proxy/Gateway eski va yangini yo'naltiradi (8.16: API Gateway)
  4. Modul ko'chgach — monolit'dan o'chir
  5. 12-18 oy davomida (big bang emas!)

   "Big bang rewrite" (hammasini birdan qayta yozish) — FALOKAT
   Strangler Fig: biznes ishlashda davom etadi (xavf kam)

Strangler Fig (migratsiya naqshi — xavfsiz ajratish): anjir daraxti daraxtni asta-sekin o'rab o'rnini egallashi kabi. Yangi imkoniyat — alohida xizmat; mavjud modul — bittadan chiqariladi; Gateway 8.16-bob eski/yangini yo'naltiradi; modul ko'chgach monolit'dan o'chiriladi; 12-18 oy davomida (bittadan). "Big bang rewrite" (hammasini birdan qayta yozish) — falokat (biznes to'xtaydi, xato ko'p). Strangler Fig — biznes ishlashda davom etadi (xavf kam, bosqichma-bosqich). Migratsiyaning yagona to'g'ri usuli.

2.11. Xizmatlararo aloqa (sync vs async)

text
  MIKROSERVISDA XIZMATLAR QANDAY GAPLASHADI:

  SINXRON (so'rov-javob — kutadi):
  - REST/gRPC (8.16: 2.5) — xizmat A  B  javob kutadi
   Oddiy, darrov javob;  bog'liqlik (B yiqilsa A ham), latency zanjiri

  ASINXRON (event/message — kutmaydi):
  - Message queue (RabbitMQ/Kafka — 8.16: 2.6) — A event chiqaradi
   Bo'shashgan bog'lanish, chidamli (B yiqilsa, event navbatda)
   Eventual consistency, murakkab kuzatuv

   Iloji bo'lsa ASINXRON (bog'liqlik kam — 9.7 event-driven)

Xizmatlararo aloqa: sinxron (REST/gRPC — so'rov-javob, kutadi — oddiy, lekin bog'liqlik: B yiqilsa A ham, latency zanjiri — 8.16: 2.5); asinxron (event/message queue — kutmaydi — bo'shashgan, chidamli: B yiqilsa event navbatda — lekin eventual consistency — 8.16: 2.6). Iloji bo'lsa asinxron (bog'liqlik kam — event-driven — 9.7). Sinxron zanjir (ABCD) — xavfli (bittasi sekinlasa/yiqilsa, hammasi). Aloqa turi — mikroservis ishonchliligini belgilaydi.

2.12. Ma'lumot va tranzaksiya (eng qiyin qism)

text
  MONOLIT: bir DB  ACID tranzaksiya (oddiy — 6.9)
  BEGIN  order yarat + zaxira kamaytir + to'lov  COMMIT (atomik)

  MIKROSERVIS: har xizmat o'z DB  tranzaksiya TAQSIMLANGAN (qiyin)
  - ACID ishlamaydi (DB'lar alohida)
  - SAGA (8.16: 2.10): qadamlar + kompensatsiya (orqaga)
  - Eventual consistency (darrov emas — biroz keyin izchil)

   Bu — mikroservisning ENG QIYIN qismi (monolitda yo'q muammo)
   Tranzaksiya muhim (moliyaviy)  monolit afzal

Ma'lumot/tranzaksiya (mikroservisning eng qiyin qismi): monolit — bir DB ACID (oddiy, atomik — 6.9); mikroservis — har xizmat o'z DB tranzaksiya taqsimlangan (ACID ishlamaydi Saga — qadamlar + kompensatsiya — 8.16: 2.10; eventual consistency — darrov emas). Bu — monolitda yo'q muammo (mikroservis qo'shadi). Tranzaksiya muhim bo'lsa (moliyaviy — buyurtma+to'lov+zaxira atomik) monolit afzal. Bu — qaror omillaridan eng muhimi.

2.12.1. Database-per-service (har xizmat o'z DB'si)

text
   MIKROSERVIS QOIDASI: har xizmat — O'Z DB'si (database-per-service)
  - Order xizmat  order_db;  Payment xizmat  payment_db
  - Boshqa xizmat DB'siga TO'G'RIDAN so'rov YO'Q (faqat xizmat API orqali)

   SHARED DATABASE (bir DB'ni ko'p xizmat bo'lishadi) — ANTI-PATTERN:
  - Bir jadval sxemasi o'zgarsa  ko'p xizmat sinadi (yashirin bog'liqlik)
  - Xizmatlar mustaqil deploy qila olmaydi (DB — umumiy tugun)
  - Bu — distributed monolith'ga to'g'ri yo'l 2.8-bob

   To'g'ri: har xizmat o'z DB'si (mustaqillik — chegara aniq)
   Narx: ma'lumot bo'linadi  JOIN yo'q  API composition / eventual

Database-per-service — mikroservisning asosiy qoidasi: har xizmat o'z DB'siga egalik qiladi; boshqa xizmat unga to'g'ridan tegmaydi (faqat egasining API'si orqali). Bu — mustaqillikning poydevori (DB umumiy bo'lsa, xizmatlar hech qachon mustaqil emas). Shared database (bir DB — ko'p xizmat) — anti-pattern: sxema o'zgarishi ko'p xizmatni buzadi, mustaqil deploy yo'qoladi distributed monolith 2.8-bob. Narxi: xizmatlar orasida JOIN mumkin emas ma'lumot API composition (bir xizmat boshqasidan so'raydi) yoki eventual consistency (event bilan nusxa) orqali yig'iladi. Modular monolith bu muammoni yashirin yechadi: bitta DB, lekin har modul faqat o'z jadvallariga tegadi (chegara — 2.4) — kerak bo'lganda DB ham oson bo'linadi.

2.12.2. Saga: choreography vs orchestration (va nega 2PC yomon)

text
  SAGA — taqsimlangan tranzaksiya (ketma-ket qadamlar + kompensatsiya):

  1) CHOREOGRAPHY (xoreografiya — markazsiz, event bilan):
     Order  "order.created" event  Payment tinglaydi  "payment.done"
      Inventory tinglaydi  ... (har xizmat keyingisini bilmaydi)
      Bo'shashgan, markazsiz;   oqimni kuzatish qiyin (kim keyingi?)

  2) ORCHESTRATION (orkestratsiya — markaziy koordinator):
     Saga Orchestrator  Order chaqir  Payment chaqir  Inventory chaqir
     Xato bo'lsa  teskari tartibda kompensatsiya (bekor qil)
      Oqim aniq, bir joyda;   koordinator — markaziy nuqta

   2PC (Two-Phase Commit — klassik taqsimlangan tranzaksiya) NEGA YOMON:
  - Barcha xizmat "prepare"  keyin "commit" (ikki bosqich)
  - Koordinator kutganda — hamma LOCK ushlaydi (bloklanish)
  - Bir xizmat yiqilsa  hamma osilib qoladi (kam mavjudlik)
  - Masshtablanmaydi, sekin  mikroservisda ISHLATILMAYDI
   Shuning uchun Saga (eventual) tanlanadi, 2PC emas

Saga naqshining ikki uslubi: choreography (markazsiz — har xizmat event chiqaradi, keyingisi tinglaydi — bo'shashgan, lekin butun oqimni bir joyda ko'rish qiyin) va orchestration (markaziy koordinator qadamlarni tartib bilan chaqiradi, xatoda teskari kompensatsiya — oqim aniq, lekin koordinator markaziy nuqta). Kichik oqim choreography; murakkab ko'p qadamli oqim orchestration. Nega 2PC (Two-Phase Commit) ishlatilmaydi: u barcha xizmatni "preparecommit" davomida lockda ushlaydi — koordinator yoki bitta xizmat sekinlashsa/yiqilsa, hammasi bloklanadi (kam mavjudlik, masshtablanmaydi). Shuning uchun mikroservis eventual consistency + Sagani tanlaydi, qat'iy taqsimlangan ACID (2PC)ni emas. Bu — CAP nazariyasining amaliy oqibati (izchillik vs mavjudlik).

2.13. Masshtablash (scaling — har ikkisi)

text
  MONOLIT masshtab (gorizontal):
  - Butun ilovani ko'paytirish (load balancer ortida N nusxa — 10)
  -  Oddiy;  butun (kichik qism og'ir bo'lsa ham hammasi ko'payadi)

  MIKROSERVIS masshtab (tanlab):
  - Faqat og'ir xizmatni ko'paytirish (boshqalari kam)
  -  Samarali (resurs);  murakkab (orkestratsiya — Kubernetes 10)

   Monolit ham yaxshi masshtablanadi (ko'p loyiha uchun yetadi)
   "Mikroservis kerak, chunki masshtab" — ko'pincha noto'g'ri
  (monolit + load balancer + cache + DB optimizatsiya yetadi)

Masshtablash: monolit — gorizontal (butun ilova N nusxa, load balancer ortida — 10 — oddiy, lekin butun); mikroservis — tanlab (faqat og'ir xizmat — samarali, lekin murakkab orkestratsiya — Kubernetes). Monolit ham yaxshi masshtablanadi (load balancer + cache 8.15 + DB optimizatsiya 6.10 — ko'p loyiha uchun yetadi). "Mikroservis kerak, chunki masshtab" — ko'pincha noto'g'ri (monolit masshtabini sinab ko'rmasdan). Masshtab — kamdan-kam haqiqiy sabab (aksincha o'ylanadi).

2.13.1. Kuzatuvchanlik (observability — distributed tracing, correlation ID)

text
  MONOLIT: bir jarayon  bitta stack trace (xato qayerda — darrov ko'rinadi)

  MIKROSERVIS: bir so'rov 5 xizmatdan o'tadi  xato QAYSI xizmatda?
  ┌──────────────────────────────────────────────────────────┐
  │ Gateway  Order  Payment  Inventory  Notification     │
  │  (har biri alohida log — bir-biriga bog'lanmagan)         │
  └──────────────────────────────────────────────────────────┘

  YECHIM 1 — CORRELATION ID (so'rov identifikatori):
  - Gateway bir X-Request-Id yaratadi (masalan: abc-123)
  - Bu ID har xizmatga UZATILADI (header'da) va har log'ga yoziladi
  - Muammo bo'lsa  abc-123 bo'yicha BARCHA xizmat logini yig'ish

  YECHIM 2 — DISTRIBUTED TRACING (OpenTelemetry / Jaeger — 10):
  - Har qadam "span" (kim, qancha vaqt)  bir "trace"ga birlashadi
  - Butun yo'lni vizual ko'rish: qaysi xizmat sekin, qaysi xato

   Mikroservisda kuzatuvchanlik OPSIYA emas — MAJBURIY (aks holda ko'r)

Kuzatuvchanlik (observability) — mikroservisning yashirin narxi: monolitda bir xato — bitta to'liq stack trace; mikroservisda bir so'rov ko'p xizmatdan o'tadi va har biri alohida log yozadi — muammo qayerda ekani ko'rinmaydi. Correlation ID (so'rov identifikatori — masalan X-Request-Id): Gateway bir noyob ID yaratadi, u har xizmatga header orqali uzatiladi va har log'ga yoziladi — muammo bo'lsa, shu ID bo'yicha barcha xizmat logi yig'iladi. Distributed tracing (OpenTelemetry/Jaeger — 10): har qadam bir span, ular bir tracega birlashadi — butun yo'l vizual ko'rinadi (qaysi xizmat sekin/xato). Mikroservisda bu — opsiya emas, majburiy (bo'lmasa — tizim "qora quti"). Monolitda bunga hojat yo'q — bu ham monolit foydasiga bir omil.

2.14. Qaror doirasi (decision framework)

text
  QAROR DARAXTI (qaysi arxitektura):

  Jamoa < 15-30 dasturchi?
  └─ HA  MODULAR MONOLITH (deyarli har doim)

  Jamoa katta + domen aniq + masshtab isbotlangan + kuchli DevOps?
  ├─ HAMMASI HA  Mikroservis (yoki qisman)
  └─ Biror YO'Q  Modular monolith (kerakli qismni keyin ajrat)

   DEFAULT: Modular Monolith
   Mikroservis: kuchli, ISBOTLANGAN sabab bo'lganda
   Hybrid: monolit + bir-ikki ajratilgan xizmat (eng amaliy katta tizim)

Qaror doirasi: jamoa <15-30 modular monolith (deyarli har doim); jamoa katta + domen aniq + masshtab isbotlangan + kuchli DevOps (hammasi) mikroservis; biror yo'q modular monolith. Default — modular monolith; mikroservis — isbotlangan sabab bo'lganda; hybrid (monolit + bir-ikki ajratilgan og'ir xizmat) — eng amaliy katta tizim. "Start simple, evolve thoughtfully". Qaror — jamoa/yuk/domen/DevOps asosida (moda emas). Bu — senior arxitektura mulohazasi.

2.15. Real misollar (sanoat tajribasi)

text
  REAL TAJRIBA (2026):
  - Amazon Prime Video: mikroservis  monolit (90% xarajat tejash)
  - Segment: mikroservis  monolit (murakkablik boshqarib bo'lmadi)
  - Shopify: ulkan modular monolith (muvaffaqiyatli)
  - GitHub, Stack Overflow: monolit (ulkan masshtab)
  - Netflix, Uber: mikroservis (haqiqatan katta — minglab dasturchi)

   Xulosa: mikroservis FAQAT haqiqatan katta tashkilotga (Netflix)
   Ko'pchilik uchun modular monolith (Shopify) to'g'ri tanlov

Real tajriba (2026): Amazon Prime Video, Segment — mikroservisdan monolitga qaytdi (xarajat/murakkablik); Shopify — ulkan modular monolith (muvaffaqiyatli); GitHub/Stack Overflow — monolit (ulkan masshtab); Netflix/Uber — mikroservis (haqiqatan katta — minglab dasturchi). Xulosa: mikroservis faqat Netflix darajasidagi tashkilotga; ko'pchilik (siz ham) uchun modular monolith to'g'ri. Sanoat moda (mikroservis hype)dan pragmatizmga (kerakli tanlov) qaytmoqda. Tajribadan o'rganish.

2.16. Best practices (arxitektura qarori)

text
   DEFAULT — modular monolith (toza modul/chegara — 2.4, 9.4)
   "Monolith first" (kerak bo'lganda ajrat — 2.6, 2.9)
   Conway: jamoa = arxitektura 2.5-bob
   Mikroservis — isbotlangan signal (jamoa/masshtab — 2.7)
   Distributed monolith'dan QOCH (chegara — 2.8, 9.4)
   Strangler Fig (asta-sekin — big bang emas — 2.10)
   Asinxron aloqa (bog'liqlik kam — 2.11, 9.7)
   Tranzaksiya muhim  monolit 2.12-bob
   Database-per-service (shared DB — anti-pattern — 2.12.1)
   Saga (2PC emas); eventual consistency (2.12.2)
   Avval monolit masshtabini sina 2.13-bob
   Kuzatuvchanlik majburiy — correlation ID, tracing (2.13.1)
   Nano/chatty anti-naqshlaridan qoch 2.8-bob
   Hybrid (monolit + og'ir xizmat — amaliy — 2.14)

3. Sintaksis — tez ma'lumotnoma

text
QAROR 2.14-bob:
Jamoa < 30  Modular Monolith (default)
Katta + domen aniq + masshtab isbotlangan + DevOps  Mikroservis
Aks holda  Modular Monolith (keyin ajrat)

NAQSHLAR:
Modular Monolith — bir deploy + qat'iy modul (NestJS modul — 8.1)
Strangler Fig — asta-sekin ajratish (12-18 oy — 2.10)
Hybrid — monolit + og'ir xizmat 2.14-bob

QOCH: Distributed Monolith 2.8-bob, Big Bang rewrite 2.10-bob, erta mikroservis

4. Batafsil kod namunalari

Misol 1 — Modular Monolith tuzilishi (NestJS — 2.4)

text
  Modular monolith — NestJS modul'lari 8.1-bob qat'iy chegara bilan:
  src/
  ├── modules/
  │   ├── users/               USER moduli (chegara)
  │   │   ├── users.module.ts
  │   │   ├── users.service.ts
  │   │   └── users.public-api.ts    FAQAT shu interfeys tashqariga
  │   ├── orders/              ORDER moduli
  │   │   ├── orders.service.ts
  │   │   └── orders.public-api.ts
  │   └── payments/            PAYMENT moduli
  ├── shared/                  umumiy (DTO, util)
  └── app.module.ts            bir deploy

   Modul faqat boshqa modulning PUBLIC-API'sini ishlatadi
   Modul ichki service'ga to'g'ridan tegmaydi (chegara — 9.4)

Misol 2 — Modul chegarasi (public API — 2.4, 9.4)

typescript
// users/users.public-api.ts — FAQAT shu tashqariga ochiq (chegara)
@Injectable()
export class UsersPublicApi {
  constructor(private usersService: UsersService) {}   // ichki service (yashirin)

  // Boshqa modullar FAQAT shu metodlarni ko'radi (interfeys — SOLID 9.1)
  async userBor(id: string): Promise<boolean> {
    return this.usersService.mavjudmi(id);
  }
  async userMa'lumot(id: string): Promise<UserPublicDto> {
    const u = await this.usersService.bitta(id);
    return { id: u.id, ism: u.ism };                   // faqat public maydonlar
  }
}

// orders/orders.service.ts — users modulini FAQAT public-api orqali
@Injectable()
export class OrdersService {
  constructor(private usersApi: UsersPublicApi) {}     // public API (ichki emas!)
  async yarat(userId: string, dto: any) {
    if (!(await this.usersApi.userBor(userId))) {       // chegara orqali
      throw new BadRequestException("User topilmadi");
    }
    // ...
  }
}
//  OrdersService UsersService'ga TO'G'RIDAN tegmaydi (chegara — kerak bo'lsa oson ajratish)

Misol 3 — Chegarani majburlash (lint qoidasi — 2.4)

json
// .eslintrc — modul chegarasini buzishni bloklash (import cheklash)
{
  "rules": {
    "no-restricted-imports": ["error", {
      "patterns": [
        {
          "group": ["**/users/!(users.public-api)*"],   // users ichki — taqiq
          "message": "Boshqa modul users.public-api orqali ishlatilsin (chegara)"
        }
      ]
    }]
  }
}
//  Dasturchi chegarani buzsa — lint xato (avtomatik himoya — distributed monolith oldini olish)

Misol 4 — Domain event (modullararo — bo'shashgan — 2.11)

typescript
// Modullar event orqali gaplashadi (to'g'ridan emas — bo'shashgan — 9.7)
// Buyurtma yaratilganda — payment, notification modullari reaksiya (bir-birini bilmaydi)
@Injectable()
export class OrdersService {
  constructor(private eventEmitter: EventEmitter2) {}   // NestJS event (8.16)

  async yarat(dto: any) {
    const order = await this.repo.save(dto);
    this.eventEmitter.emit("order.created", { orderId: order.id });   // event (bo'shashgan)
    return order;
  }
}

// notification moduli tinglaydi (orders'ni bilmaydi)
@OnEvent("order.created")
async buyurtmaBildirishnoma(payload: { orderId: string }) {
  await this.notify.yubor(payload.orderId);
}
//  Event bilan — modullar mustaqil (kerak bo'lsa, modul  mikroservis OSON: event  message queue)

Misol 5 — Strangler Fig (ajratish — 2.10)

typescript
// Bosqich 1: notification modulini ajratish (eng mustaqil)
// Monolit ichida event'ni endi message queue'ga uzatish (8.16)
@OnEvent("order.created")
async forwardToQueue(payload: any) {
  // Eski: monolit ichida ishladi
  // Yangi: message queue'ga (alohida notification xizmati oladi — 8.16: 2.6)
  await this.queue.emit("order.created", payload);     // mikroservisga ko'prik
}

// Bosqich 2: alohida notification mikroservisi (8.16)
@EventPattern("order.created")
async buyurtmaBildirishnoma(@Payload() payload: any) {
  await this.notify.yubor(payload.orderId);            // endi alohida xizmatda
}
//  Modul EVENT bilan ishlagani uchun — ajratish OSON (interfeys o'zgarmadi)
//  Modular monolith (event)  mikroservis (message queue) — silliq o'tish

Misol 6 — Hybrid arxitektura (2.14)

text
  HYBRID — eng amaliy katta tizim (monolit + og'ir xizmatlar):

  ┌──────────────────────────────┐
  │   MODULAR MONOLITH (asosiy)  │   user, order, product, payment
  │   (biznes mantiqning 90%)    │     (tranzaksiya, oddiy — 2.12)
  └──────────┬───────────────────┘
             │ event/message queue 8.16-bob
     ┌───────┼───────┐
     ▼       ▼       ▼
  Video   ML/AI   Notification    FAQAT og'ir/maxsus ajratilgan
  (Go)    (Python)  (masshtab)      (haqiqiy sabab — 2.7)

   Asosiy biznes monolitda (oddiy); faqat maxsus qism ajratilgan
   Netflix emas — pragmatik (real loyihalar shunday)

Misol 7 — Tranzaksiya: monolit vs mikroservis (2.12)

typescript
// MONOLIT — oddiy ACID tranzaksiya (bir DB — 6.9, 8.13)
async buyurtmaYarat(dto: any) {
  return this.dataSource.transaction(async (manager) => {   // ATOMIK
    const order = await manager.save(Order, dto);
    await manager.decrement(Product, { id: dto.productId }, "zaxira", dto.miqdor);
    await manager.save(Payment, { orderId: order.id, summa: dto.summa });
    return order;                                       // hammasi yoki hech narsa (ACID)
  });
}

// MIKROSERVIS — Saga (taqsimlangan — murakkab — 8.16: 2.10)
async buyurtmaYaratSaga(dto: any) {
  const order = await this.orderService.yarat(dto);     // 1-xizmat
  try {
    await this.inventoryService.kamaytir(dto);          // 2-xizmat (tarmoq)
    await this.paymentService.tolov(dto);               // 3-xizmat (tarmoq)
  } catch (e) {
    await this.orderService.bekor(order.id);            // KOMPENSATSIYA (orqaga)
    throw e;
  }
}
//  Monolit: 5 qator, ishonchli (ACID). Mikroservis: murakkab, eventual.

Misol 8 — Masshtab: monolit (2.13)

text
  MONOLIT masshtab — ko'p loyiha uchun yetadi:

  ┌─────────────┐
  │Load Balancer│ (Nginx — 10)
  └──────┬──────┘
    ┌────┼────┐
    ▼    ▼    ▼
  App   App  App     monolit N nusxa (gorizontal — bir xil)
    └────┼────┘
         ▼
   ┌──────────┐  ┌───────┐
   │  DB      │  │ Redis │   shared DB + cache 8.15-bob
   │ (replica)│  │(cache)│
   └──────────┘  └───────┘

  + DB read replica 6.15-bob + Redis cache 8.15-bob + CDN
   Bu odatda 1M+ so'rov/kun ko'taradi (mikroservissiz)

Misol 9 — Distributed monolith belgisi (qochish — 2.8)

typescript
//  DISTRIBUTED MONOLITH (eng yomon — qochish)
// Xizmat A xizmat B'ga SINXRON, zanjir bilan bog'liq:
async buyurtma(dto: any) {
  const user = await this.http.get(`http://user-service/users/${dto.userId}`);   // B kutadi
  const product = await this.http.get(`http://product-service/${dto.productId}`); // C kutadi
  const stock = await this.http.get(`http://inventory/${dto.productId}`);         // D kutadi
  //  B/C/D dan bittasi yiqilsa/sekinlasa  A ishlamaydi (qattiq bog'liq!)
  //  Umumiy DB bo'lsa — yana yomon
}

//  To'g'ri: modular monolith (funksiya chaqiruvi — tarmoq yo'q)
async buyurtmaToori(dto: any) {
  const user = await this.usersApi.userBor(dto.userId);       // funksiya (tez, ishonchli)
  // bir jarayon — tarmoq xatosi yo'q, ACID tranzaksiya mumkin (2.12)
}

Misol 10 — Qaror checklist (amaliy — 2.14)

text
  ARXITEKTURA QARORI — checklist (loyiha uchun):

  □ Jamoa hajmi? (< 15-30  monolit)
  □ Domen aniqmi? (yo'q  monolit, keyin aniqlanadi — 9.4)
  □ Masshtab ISBOTLANGANmi? (taxmin  monolit; real 10x  ajrat)
  □ Tranzaksiya muhimmi? (ha  monolit — ACID)
  □ DevOps kuchimi? (zaif  monolit; Kubernetes bor  mikroservis mumkin)
  □ Mustaqil deploy zarurmi? (jamoalar bloklayaptimi?)
  □ Turli texnologiya kerakmi? (ML/real-time  maxsus xizmat)

  Ko'p "monolit" javob  Modular Monolith
  Ko'p "mikroservis" javob + ISBOTLANGAN  Mikroservis (yoki hybrid)

   Shubhada — MODULAR MONOLITH (xato arzon tuzatiladi)

5. To'g'ri va noto'g'ri holatlar

1) Erta mikroservis (kichik jamoa)

text
 3 dasturchi  10 mikroservis (boshqarib bo'lmaydi — 2.7)
 modular monolith (keyin kerak bo'lsa ajrat)

2) "Moda" uchun mikroservis

text
 "zamonaviy/Google shunday" (texnik sabab emas — 2.7)
 isbotlangan signal (jamoa/masshtab)

3) Distributed monolith

text
 ko'p xizmat + qattiq bog'liq + umumiy DB (2.8)
 modular monolith yoki to'g'ri ajratilgan mikroservis

4) Big bang rewrite

text
 monolitni birdan qayta yozish (falokat — 2.10)
 Strangler Fig (asta-sekin)

5) Monolit = "yomon" deb o'ylash

text
 monolitdan qochish (noto'g'ri tushuncha — 2.1)
 modular monolith — kuchli, amaliy tanlov

6. Keng tarqalgan xatolar va yechimlari

Xato 1 — Mikroservis murakkabligi bosib ketdi

Sababi: erta/keraksiz mikroservis 2.7-bob. Yechimi: modular monolithga konsolidatsiya (Amazon kabi — 2.15).

Xato 2 — Xizmatlar bir-birisiz ishlamaydi

Sababi: distributed monolith 2.8-bob. Yechimi: chegara 9.4-bob; asinxron 2.11-bob.

Xato 3 — Taqsimlangan tranzaksiya muammosi

Sababi: mikroservisda ACID yo'q 2.12-bob. Yechimi: Saga; yoki monolit (tranzaksiya muhim bo'lsa).

Xato 4 — Modul chegarasi buzilgan (monolit)

Sababi: modul ichkariga to'g'ridan 2.4-bob. Yechimi: public API + lint (Misol 2, 3).

Xato 5 — Lokal ishlab chiqish qiyin (mikroservis)

Sababi: ko'p xizmat lokal 2.2-bob. Yechimi: Docker Compose (10); yoki monolit.

Xato 6 — Migratsiya biznesni to'xtatdi

Sababi: big bang 2.10-bob. Yechimi: Strangler Fig (asta-sekin).


7. Integratsiya — bu mavzu stack'ning qayerida uchraydi

  • Mikroservis texnik 8.16-bob: transport, Saga, Gateway.
  • Clean Architecture 9.3-bob: modul chegarasi.
  • DDD 9.4-bob: bounded context = modul/xizmat.
  • Event-driven 9.7-bob: asinxron aloqa.
  • DevOps (10): Kubernetes, deploy, masshtab.
  • NestJS modul 8.1-bob: modular monolith.
  • DB (8.13, 6.15): tranzaksiya, masshtab.
  • Conway: jamoa tuzilmasi.

8. Eng yaxshi amaliyotlar (best practices)

  • Default — modular monolith (toza modul/chegara — 2.4).
  • "Monolith first" (kerak bo'lganda ajrat — 2.6, 2.9).
  • Conway: jamoa = arxitektura 2.5-bob.
  • Mikroservis — isbotlangan signal (jamoa/masshtab — 2.7).
  • Distributed monolith'dan qoch (chegara — 2.8).
  • Strangler Fig (asta-sekin — big bang emas — 2.10).
  • Asinxron aloqa (bog'liqlik kam — 2.11).
  • Tranzaksiya muhim monolit (ACID — 2.12).
  • Avval monolit masshtabini sina 2.13-bob.
  • Hybrid (monolit + og'ir xizmat — amaliy — 2.14).

9. Amaliy loyiha: "Arxitektura Qarori va Modular Monolith"

Arxitektura qarorini amalda mustahkamlash.

Maqsad

E-commerce uchun modular monolith qurish (toza modul chegaralari) va arxitektura qarorini hujjatlash.

Talablar (requirements)

  1. Modular tuzilma: users/orders/products/payments modullar (Misol 1, 2.4).
  2. Modul chegarasi: public API (Misol 2, 9.4).
  3. Lint chegarasi: import cheklash (Misol 3, 2.4).
  4. Domain event: modullararo bo'shashgan (Misol 4, 2.11).
  5. Tranzaksiya: ACID (monolit — Misol 7, 2.12).
  6. Strangler tayyorlik: event queue ko'prik (Misol 5, 2.10).
  7. Masshtab reja: load balancer + cache (Misol 8, 2.13).
  8. Qaror hujjati: checklist asosida (Misol 10, 2.14).
  9. Distributed monolith'dan qochish: chegara (Misol 9, 2.8).
  10. Hybrid reja: qaysi modul kelajakda ajratiladi (Misol 6, 2.14).

Maslahatlar (hint)

  • Modul public API (2.4, 4-xato).
  • Lint chegara (Misol 3).
  • Event bo'shashgan (2.11 — ajratish oson).
  • ACID monolit (2.12, 3-xato).
  • Default modular monolith (2.14, 5-holat).
  • Conway: jamoa 2.5-bob.

"Tayyor" mezonlari (acceptance criteria)

  • Modular tuzilma (modullar).
  • Modul chegarasi (public API).
  • Lint chegarasi.
  • Domain event.
  • Tranzaksiya (ACID).
  • Strangler tayyorlik.
  • Masshtab reja.
  • Qaror hujjati.
  • Distributed monolith'dan qochish.
  • Hybrid reja.

Yechim kodi ataylab berilmagan — bu loyihani o'zingiz yozib ko'ring.


10. Xulosa va keyingi bobga ko'prik

Bu bobda monolit vs mikroservis qarorini chuqur o'rgandik:

  • Monolit (yomon emas — amaliy — 2.1); mikroservis (haqiqiy narx — 2.2); taqqoslash 2.3-bob; modular monolith (2026 g'olibi — 2.4).
  • Conway qonuni (jamoa = arxitektura — 2.5); qachon monolit (default — 2.6); qachon mikroservis (signal — 2.7); distributed monolith (qochish — 2.8).
  • Qachon ajratish (signal — 2.9); Strangler Fig (migratsiya — 2.10); aloqa (sync/async — 2.11); tranzaksiya 2.12-bob, database-per-service (2.12.1), Saga: choreography vs orchestration + nega 2PC yomon (2.12.2); masshtab 2.13-bob va kuzatuvchanlik (distributed tracing, correlation ID — 2.13.1); anti-naqshlar (nano/chatty — 2.8); qaror doirasi 2.14-bob; real misollar 2.15-bob.

Keyingi bob — 9.6: Service communication — REST, gRPC, message queues. Arxitektura qarorini bildik; endi xizmatlar (yoki modullar) qanday gaplashishini chuqur ko'ramiz: REST (sinxron), gRPC (tez, tipli), message queues (RabbitMQ/Kafka — asinxron). Har birining kuchi, qachon ishlatilishi.


Foydalanilgan rasmiy/ishonchli manbalar

  • Martin Fowler — "MonolithFirst" (monolitdan boshlash tamoyili) va "StranglerFigApplication" (bosqichma-bosqich migratsiya naqshi).
  • Sam Newman — Building Microservices (2nd ed.) va Monolith to Microservices — xizmat chegaralari, database-per-service, dekompozitsiya.
  • Melvin Conway — "How Do Committees Invent?" (1968) — Conway qonuni asl maqolasi.
  • Eric Evans — Domain-Driven Design — bounded context (mikroservis chegarasi asosi — 9.4).
  • Chris Richardson — Microservices Patterns — Saga, choreography vs orchestration, API composition.
  • Amazon Prime Video muhandislik blogi — audio/video monitoring xizmatini monolitga birlashtirish tajribasi (xarajat tejash).
  • Shopify muhandislik blogi — modular monolith ("Deconstructing the Monolith") tajribasi.

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
9.5-bob: Monolith vs Microservices — qachon qaysi biri — Wisar