Arxitektura uslublari (Architecture Styles)

30.06.2026 | Muallif: Jaxongir a.k.a | Kategoriya: Architecture | 25 daqiqa o'qish

Arxitektor darajasida endi savol "kod qanday yoziladi?" emas, balki:

"Butun sistema qanday quriladi, qanday o‘sadi, qanday buzilmaydi va 2-5 yildan keyin ham qanday yashaydi?"

Bu mavzu quyidagilarni o‘z ichiga oladi: Monolith vs modular monolith vs microservices, Hexagonal Architecture, Clean/Onion Architecture, Event Sourcing & CQRS, DDD, Cell-based architecture.


1. Architecture style nima?

Architecture style - bu sistemani katta darajada qanday tashkil qilish usuli.

Masalan:

Frontend
   |
Backend
   |
Database

Bu oddiy ko‘rinadi. Lekin backend ichida savollar ko‘p:

  • Hammasi bitta app bo‘ladimi?

  • Har bir modul alohida servis bo‘ladimi?

  • Biznes logika controller ichidami yoki domain ichidami?

  • Database bitta bo‘ladimi yoki har servisniki alohidami?

  • Event bilan ishlaymizmi yoki oddiy REST API bilanmi?

  • System buzilsa, qaysi qismi ishlashda davom etadi?

Arxitektor shu savollarga javob beradigan odam.


2. Monolith Architecture

Monolith nima?

Monolith - butun backend bitta katta application ichida bo‘ladi.

Masalan:

E-commerce App
 ├── User module
 ├── Product module
 ├── Order module
 ├── Payment module
 ├── Delivery module
 └── Admin module

Hammasi bitta Spring Boot project ichida.

Frontend → Spring Boot Monolith → PostgreSQL

Real misol

Online do‘kon qilaylik:

  • user ro‘yxatdan o‘tadi

  • product ko‘radi

  • savatga qo‘shadi

  • order qiladi

  • payment qiladi

Bularning hammasi bitta backend ichida bo‘lsa - bu monolith.


Afzalliklari

Monolith yomon emas. Ayniqsa boshida juda foydali.

Afzallik

Tushuntirish

Oddiy development

Bitta project, bitta codebase

Debug qilish oson

Lokal kompyuterda hammasini ishga tushirasiz

Deployment oson

Bitta jar/docker image

Transaction oson

Bitta database, bitta transaction

Kichik team uchun qulay

2-10 kishilik team uchun juda yaxshi


Kamchiliklari

Loyiha kattalashganda muammo chiqadi.

Muammo

Sabab

Codebase kattalashadi

Hamma modul bir joyda

Deploy xavfli bo‘ladi

Kichik o‘zgarish uchun ham butun app deploy qilinadi

Scaling noaniq bo‘ladi

Faqat payment ko‘p ishlasa ham butun app scale qilinadi

Teamlar bir-biriga xalal beradi

Bitta codebase’da konflikt ko‘payadi

Modul chegaralari buziladi

Order module Product repository’ni to‘g‘ridan-to‘g‘ri chaqirib yuboradi


Qachon monolith tanlanadi?

Monolith tanlash kerak, agar:

  • loyiha yangi bo‘lsa;

  • biznes hali to‘liq aniq bo‘lmasa;

  • team kichik bo‘lsa;

  • traffic hali katta bo‘lmasa;

  • tez MVP chiqarish kerak bo‘lsa.

Arxitektor xulosasi:

Ko‘p hollarda loyiha microservices bilan emas, yaxshi yozilgan monolith bilan boshlanishi kerak.


3. Modular Monolith

Modular monolith nima?

Modular monolith - bitta application, lekin ichida modullar aniq chegaralangan.

Spring Boot App
 ├── user
 │    ├── api
 │    ├── domain
 │    ├── application
 │    └── infrastructure
 │
 ├── order
 │    ├── api
 │    ├── domain
 │    ├── application
 │    └── infrastructure
 │
 └── payment
      ├── api
      ├── domain
      ├── application
      └── infrastructure

Bu hali ham bitta deploy qilinadi:

Frontend → Modular Monolith → Database

Lekin ichki tartib kuchliroq.


Oddiy monolithdan farqi

Oddiy monolithda:

orderService.createOrder();
productRepository.updateStock();
paymentRepository.save();

Har kim har kimni chaqirib ketadi.

Modular monolithda esa:

Order module → Product module bilan faqat public interface orqali gaplashadi
Order module → Product ichki repositorysiga kira olmaydi

Java/Spring Boot’da modular monolith misoli

com.example.shop
 ├── user
 │    ├── UserFacade.java
 │    ├── UserService.java
 │    └── UserRepository.java
 │
 ├── order
 │    ├── OrderFacade.java
 │    ├── OrderService.java
 │    └── OrderRepository.java
 │
 └── payment
      ├── PaymentFacade.java
      ├── PaymentService.java
      └── PaymentRepository.java

Order module payment’ga to‘g‘ridan-to‘g‘ri repository orqali kirmaydi.

Yaxshiroq variant:

public interface PaymentPort {
    PaymentResult pay(PaymentCommand command);
}

Order faqat PaymentPort orqali ishlaydi.


Afzalliklari

Afzallik

Tushuntirish

Monolith kabi oddiy

Bitta app, bitta deploy

Microservicesga tayyorlaydi

Modul chegaralari oldindan toza bo‘ladi

Debug oson

Hammasi lokalda ishlaydi

Transaction osonroq

Hali ham bitta process

Team tartibli ishlaydi

Har modulning egasi bo‘lishi mumkin


Kamchiliklari

Muammo

Tushuntirish

Intizom talab qiladi

Developerlar chegarani buzib qo‘yishi mumkin

Bitta deploy

Har modul alohida deploy qilinmaydi

Katta app bo‘lib qolishi mumkin

Chegaralar nazorat qilinmasa, yana oddiy monolithga aylanadi


Qachon modular monolith tanlanadi?

Eng yaxshi tanlovlardan biri:

  • loyiha o‘sishi kutilsa;

  • microservicesga hali erta bo‘lsa;

  • domain murakkab bo‘lsa;

  • team o‘rtacha bo‘lsa;

  • kelajakda ayrim modullarni alohida servis qilish ehtimoli bo‘lsa.

Arxitektor xulosasi:

Ko‘p real biznes sistemalar uchun eng sog‘lom start - modular monolith.


4. Microservices Architecture

Microservices nima?

Microservices - sistema bir nechta mustaqil servisga bo‘linadi.

Frontend
   |
API Gateway
   |
 ├── User Service       → user_db
 ├── Product Service    → product_db
 ├── Order Service      → order_db
 ├── Payment Service    → payment_db
 └── Notification Service → notification_db

Har servis:

  • alohida deploy qilinadi;

  • o‘z database’iga ega bo‘lishi mumkin;

  • alohida team tomonidan boshqarilishi mumkin;

  • REST, gRPC yoki message broker orqali gaplashadi.


Microservices nimani hal qiladi?

Masalan payment juda ko‘p ishlatiladi.

Monolithda:

Butun app scale qilinadi

Microservicesda:

Faqat Payment Service scale qilinadi

Yoki notification service yiqilsa, order service ishlashda davom etishi mumkin.


Afzalliklari

Afzallik

Tushuntirish

Mustaqil deploy

Har servis alohida chiqariladi

Mustaqil scaling

Faqat kerakli servis scale qilinadi

Team ownership

Har team o‘z servisiga javobgar

Texnologiya tanlash erkinligi

Ba’zi servis Java, ba’zisi Go bo‘lishi mumkin

Fault isolation

Bitta servis yiqilsa, hammasi yiqilmasligi mumkin


Kamchiliklari

Microservices - bu "zamonaviy" ko‘ringani bilan juda qimmat architecture.

Muammo

Tushuntirish

Distributed system complexity

Network, timeout, retry, latency muammolari chiqadi

Transaction qiyinlashadi

Bitta DB transaction yo‘q

Debug qiyin

Request bir nechta servisdan o‘tadi

Monitoring kerak

Logs, metrics, tracing shart

DevOps kuchli bo‘lishi kerak

CI/CD, Docker, Kubernetes, alerting kerak

Data consistency qiyin

Eventual consistency bilan yashash kerak


Eng katta xato

Ko‘p teamlar shunday qiladi:

"Biz professional ko‘rinish uchun boshidan microservices qilamiz."

Bu xavfli.

Agar teamda quyidagilar bo‘lmasa, microservices og‘riq beradi:

  • kuchli DevOps;

  • monitoring;

  • distributed tracing;

  • message broker tajribasi;

  • service ownership;

  • yaxshi test strategy;

  • domain chegaralari aniq bo‘lishi.


Qachon microservices tanlanadi?

Microservices kerak bo‘ladi, agar:

  • sistema katta bo‘lsa;

  • teamlar ko‘p bo‘lsa;

  • modullar mustaqil rivojlansa;

  • har modulning scaling talabi boshqacha bo‘lsa;

  • deployment tez-tez va mustaqil bo‘lishi kerak bo‘lsa;

  • domain chegaralari aniq bo‘lsa.

Arxitektor xulosasi:

Microservices - kodni bo‘lish emas. Bu ownership, deployment, monitoring, data consistency va organization architecture masalasi.


5. Hexagonal Architecture

Hexagonal Architecture nima?

Hexagonal Architecture yana Ports & Adapters deb ham ataladi.

Asosiy g‘oya:

Biznes logika framework, database, HTTP, Kafka, Redis kabi tashqi narsalarga qaram bo‘lmasligi kerak.

Ya’ni domain markazda turadi.

          REST Controller
                |
             Adapter
                |
Input Port → Application Service → Output Port
                |
             Adapter
                |
          Database / Kafka / External API

Oddiy yomon struktura

@RestController
public class OrderController {

    @Autowired
    private OrderRepository orderRepository;

    @PostMapping("/orders")
    public void create(@RequestBody OrderRequest request) {
        Order order = new Order();
        orderRepository.save(order);
    }
}

Bu yerda controller, business logic va database aralashib ketgan.


Hexagonal usul

Domain

public class Order {
    private OrderId id;
    private Money total;

    public void confirm() {
        // business rule
    }
}

Input port

public interface CreateOrderUseCase {
    OrderId create(CreateOrderCommand command);
}

Application service

public class CreateOrderService implements CreateOrderUseCase {

    private final OrderRepositoryPort orderRepository;

    public CreateOrderService(OrderRepositoryPort orderRepository) {
        this.orderRepository = orderRepository;
    }

    public OrderId create(CreateOrderCommand command) {
        Order order = Order.create(command.items());
        orderRepository.save(order);
        return order.getId();
    }
}

Output port

public interface OrderRepositoryPort {
    void save(Order order);
}

Adapter

@Repository
public class JpaOrderRepositoryAdapter implements OrderRepositoryPort {

    private final SpringDataOrderRepository repository;

    public void save(Order order) {
        repository.save(OrderEntity.from(order));
    }
}

Nima foyda?

Foyda

Tushuntirish

Business logic toza bo‘ladi

Spring/JPA/Kafka ichiga aralashmaydi

Test qilish oson

Database’siz unit test yozish mumkin

Texnologiya almashtirish oson

JPA o‘rniga Mongo yoki API bo‘lishi mumkin

Dependency direction to‘g‘ri

Ichki qatlam tashqi qatlamni bilmaydi


Qachon ishlatiladi?

Hexagonal yaxshi tanlov:

  • domain murakkab bo‘lsa;

  • testability muhim bo‘lsa;

  • external systemlar ko‘p bo‘lsa;

  • business logic uzoq yashashi kerak bo‘lsa;

  • frameworkga qattiq bog‘lanib qolmaslik kerak bo‘lsa.

Arxitektor xulosasi:

Hexagonal Architecture’da Spring Boot asosiy qahramon emas. Asosiy qahramon - business logic.


6. Clean Architecture / Onion Architecture

Clean Architecture nima?

Clean Architecture ham Hexagonalga o‘xshaydi. Asosiy prinsip:

Dependency har doim ichkariga qaraydi.

[ Frameworks & Drivers ]
        ↓
[ Interface Adapters ]
        ↓
[ Use Cases ]
        ↓
[ Entities / Domain ]

Eng ichkarida domain turadi. Eng tashqarida frameworklar turadi.


Onion Architecture

Onion Architecture ham qatlamli:

Infrastructure
   Application
      Domain

Domain markazda.

Tashqi qatlamlar ichki qatlamlarga bog‘liq bo‘ladi, lekin ichki qatlam tashqini bilmaydi.


Layered Architecture’dan farqi

Classic layered architecture:

Controller → Service → Repository → Database

Bu oddiy loyihalarda yaxshi.

Lekin Clean Architecture’da:

Controller → UseCase → Port → Adapter → Database

Repository interface ichkarida bo‘ladi, implementation tashqarida.


Qachon Clean Architecture kerak?

Kerak bo‘ladi:

  • enterprise system;

  • business rules murakkab;

  • uzoq muddat yashaydigan loyiha;

  • testlar muhim;

  • frameworklardan mustaqillik kerak;

  • domain alohida qiymatga ega.

Kerak bo‘lmasligi mumkin:

  • oddiy CRUD admin panel;

  • kichik MVP;

  • 2-3 endpointli servis;

  • vaqt juda qisqa bo‘lsa.

Arxitektor xulosasi:

Clean Architecture hamma joyga majburiy emas. Lekin murakkab domain bo‘lsa, kodni uzoq umrli qiladi.


7. CQRS

CQRS nima?

CQRS - Command Query Responsibility Segregation.

Ya’ni:

  • yozish operatsiyalari alohida;

  • o‘qish operatsiyalari alohida.

Command side → create/update/delete
Query side   → read/search/report

Oddiy CRUD’da bitta model ham yozadi, ham o‘qiydi.

CQRS’da esa:

Write Model: Order, Payment, Invoice
Read Model: OrderView, DashboardView, ReportView

Oddiy misol

Order yaratish:

POST /orders

Bu command.

Order ro‘yxatini ko‘rish:

GET /orders?status=PAID

Bu query.

CQRS’da ularning modeli alohida bo‘lishi mumkin.


Qachon foydali?

CQRS foydali, agar:

  • o‘qish va yozish talablari juda farq qilsa;

  • report/dashboard og‘ir bo‘lsa;

  • read model denormalized bo‘lsa;

  • high traffic read endpointlar bo‘lsa;

  • event-driven system bo‘lsa.


Kamchiligi

Muammo

Tushuntirish

Complexity oshadi

Ikki model yuritiladi

Data sync kerak

Write’dan read modelga data yetib borishi kerak

Eventual consistency

Yozilgan data darhol o‘qishda ko‘rinmasligi mumkin

Debug qiyinroq

Eventlar va projectionlar kuzatiladi

Arxitektor xulosasi:

CQRS’ni oddiy CRUD uchun ishlatish ortiqcha. Lekin katta read/write farqi bo‘lsa, kuchli yechim.


8. Event Sourcing

Event Sourcing nima?

Oddiy sistemada biz hozirgi holatni saqlaymiz:

Order status = PAID

Event Sourcing’da esa holat emas, voqealar saqlanadi:

OrderCreated
PaymentReceived
OrderPaid
OrderShipped

Hozirgi holat shu eventlardan tiklanadi.


Misol

Oddiy database:

order_id

status

1

SHIPPED

Event sourcing:

event_id

order_id

event

1

1

OrderCreated

2

1

PaymentReceived

3

1

OrderShipped

Bu orqali tarix to‘liq saqlanadi.


Afzalliklari

Afzallik

Tushuntirish

To‘liq audit trail

Har o‘zgarish tarixi bor

Debug/replay

Eventlarni qayta o‘ynatib holat tiklanadi

Business history

Nima, qachon, nima sababdan bo‘lganini ko‘rish mumkin

Event-driven systemga mos

Boshqa servislar eventlardan foydalanadi


Kamchiliklari

Muammo

Tushuntirish

Juda murakkab

Oddiy CRUD’dan ancha qiyin

Event versioning kerak

Event schema o‘zgarsa, eski eventlar bilan ishlash kerak

Query qilish qiyin

Projection/read model kerak bo‘ladi

Developer tajribasi talab qiladi

Noto‘g‘ri ishlatilsa, sistemani chalkashtiradi


Qachon ishlatiladi?

Event Sourcing mos:

  • banking;

  • payment;

  • audit muhim systemlar;

  • order lifecycle murakkab bo‘lgan joylar;

  • rollback/replay kerak bo‘lgan systemlar;

  • business eventlar juda muhim bo‘lgan domainlar.

Mos emas:

  • oddiy CRUD;

  • admin panel;

  • kichik loyiha;

  • team event-driven tajribasiz bo‘lsa.

Arxitektor xulosasi:

Event Sourcing - database tanlovi emas, butun fikrlash modelini o‘zgartiradigan architecture style.


9. Domain-Driven Design - DDD

DDD nima?

DDD - Domain-Driven Design.

Asosiy fikr:

Software business domain atrofida qurilishi kerak, database yoki framework atrofida emas.

Masalan banking system’da asosiy tushunchalar:

  • Account

  • Transaction

  • Balance

  • Limit

  • Transfer

  • Fraud Check

E-commerce’da:

  • Product

  • Cart

  • Order

  • Payment

  • Delivery

  • Refund

DDD shu tushunchalarni to‘g‘ri model qilishga yordam beradi.


Bounded Context

Bounded Context - bitta so‘z turli joyda turli ma’noga ega bo‘lishi mumkinligini tan olish.

Masalan Customer:

Sales context:
Customer = lead, potential buyer

Billing context:
Customer = payer with billing details

Support context:
Customer = ticket owner

Bitta Customer class qilib hammasiga ishlatish xato bo‘lishi mumkin.


Aggregate

Aggregate - birgalikda consistency saqlashi kerak bo‘lgan obyektlar guruhi.

Masalan:

Order
 ├── OrderItem
 ├── ShippingAddress
 └── PaymentStatus

Bu yerda Order aggregate root bo‘lishi mumkin.

Tashqaridan OrderItemni to‘g‘ridan-to‘g‘ri o‘zgartirmaysiz. Faqat Order orqali:

order.addItem(productId, quantity);
order.confirm();
order.cancel();

DDD qachon kerak?

DDD kerak:

  • domain murakkab bo‘lsa;

  • business rules ko‘p bo‘lsa;

  • terminlar chalkash bo‘lsa;

  • bir nechta department/tizim bo‘lsa;

  • microservices chegarasini aniqlash kerak bo‘lsa.

DDD shart emas:

  • oddiy CRUD;

  • faqat data entry app;

  • kichik admin panel;

  • biznes logika deyarli yo‘q bo‘lsa.

Arxitektor xulosasi:

DDD class nomlarini chiroyli qilish emas. Bu biznesni to‘g‘ri tushunib, system chegaralarini to‘g‘ri chizish.


10. Cell-Based Architecture

Cell-based architecture nima?

Cell-based architecture - sistemani mustaqil "cell"larga bo‘lish.

Har bir cell o‘z ichida kerakli qismlarga ega bo‘ladi:

Cell A
 ├── API
 ├── Services
 ├── Database
 └── Cache

Cell B
 ├── API
 ├── Services
 ├── Database
 └── Cache

Traffic celllarga bo‘linadi.

Masalan:

Users 1-100000     → Cell A
Users 100001-200000 → Cell B
Users 200001-300000 → Cell C

Nima uchun kerak?

Katta sistemalarda bitta global failure butun sistemani yiqitmasligi kerak.

Agar Cell B’da muammo bo‘lsa:

Cell A ishlayveradi
Cell C ishlayveradi
Faqat Cell B foydalanuvchilari ta’sirlanadi

Bu blast radius’ni kamaytiradi.


Qachon kerak?

Cell-based architecture odatda juda katta scale’da kerak bo‘ladi:

  • millionlab userlar;

  • multi-region architecture;

  • SaaS platformalar;

  • tenant isolation kerak bo‘lsa;

  • failure isolation juda muhim bo‘lsa.

Oddiy loyihalar uchun bu ortiqcha.

Arxitektor xulosasi:

Cell-based architecture - katta scale va reliability uchun. Kichik projectda bu overengineering.


11. Qaysi architecture style’ni qachon tanlash kerak?

Vaziyat

Tavsiya

Yangi loyiha, kichik team

Monolith

Loyiha o‘sishi kutiladi

Modular Monolith

Domain murakkab

DDD + Modular Monolith

Business logic frameworkdan mustaqil bo‘lishi kerak

Hexagonal / Clean Architecture

Teamlar ko‘p, deploy mustaqil kerak

Microservices

Read/write talablari keskin farq qiladi

CQRS

Audit va tarix juda muhim

Event Sourcing

Juda katta scale, failure isolation kerak

Cell-based Architecture


12. Arxitektor uchun eng muhim fikr

Arxitektor hech qachon "eng zo‘r architecture"ni tanlamaydi.

U quyidagini tanlaydi:

Hozirgi biznesga mos
Team ko‘tara oladigan
Kelajakda o‘sishga tayyor
Monitoring va deployment bilan boshqariladigan
Eng kam keraksiz complexity beradigan architecture

13. Amaliy tavsiya - Java/Spring loyihalar uchun

Ko‘p real Spring Boot loyihalar uchun yaxshi start:

Modular Monolith
+ Clean/Hexagonal Architecture elementlari
+ DDD bounded context fikrlashi
+ Keyinchalik kerak bo‘lsa microservicesga ajratish

Masalan:

shop-app
 ├── user
 ├── catalog
 ├── order
 ├── payment
 ├── notification
 └── shared-kernel

Boshida bitta deploy.

Keyin payment juda katta bo‘lib ketsa:

payment module → Payment Service

Shunda microservicesga o‘tish tabiiy bo‘ladi, majburiy emas.


Yakuniy formula

Junior kod yozadi.
Middle production kod yozadi.
Senior subsystem egasi bo‘ladi.
Arxitektor esa butun system qanday yashashini loyihalaydi.

Architecture styles mavzusida eng muhim dars:

Microservices har doim yaxshi emas. Monolith har doim yomon emas. To‘g‘ri architecture - contextga mos architecture.