← Bütün Patternlər
⚖️

CQRS

Command Query Responsibility Segregation — Yazma (Write) və Oxuma (Read) əməliyyatlarını tamamilə ayrı modellərə/bazalara bölmək.

🎯
Nə üçün lazımdır?

Oxuma ilə yazma tələbləri fərqlidir: Oxuma sürətli olmalıdır (denormalized), Yazma isə tutarlı (normalized). Onları ayırmaq hər ikisini optimallaşdırır.

📐
Arxitektura

Command tərəf: validasiya, biznes qaydaları, master DB-yə yazır. Query tərəf: denormalized replica/view-dan oxuyur — çox sürətli.

🛠️
Populyar alətlər

Axon Framework, Kafka + Elasticsearch, PostgreSQL + MongoDB, MediatR (.NET).

İNTERAKTİV

Vizual İzah

Mərhələ {{ currentStep + 1 }}: {{ steps[currentStep].title }}

✍️
Command (Yazma)
POST /orders → Normalized DB
Validasiya → Biznes Qaydaları → SQL (Master DB)
Sync / Event
👁️
Query (Oxuma)
GET /orders → Denormalized View
Denormalized → MongoDB / Elasticsearch → Sürətli
JAVA

Kod Nümunəsi

OrderCommandService.java (Yazma tərəf)
@Service
public class OrderCommandService {

    private final OrderRepository orderRepo;  // PostgreSQL (Normalized)
    private final EventPublisher eventPublisher;

    public void createOrder(CreateOrderCommand cmd) {
        // 1. Validasiya
        if (cmd.getAmount() <= 0) throw new InvalidOrderException();

        // 2. Master DB-yə yaz (Normalized)
        Order order = orderRepo.save(new Order(cmd));

        // 3. Query tərəfə Event göndər (Sync)
        eventPublisher.publish(new OrderCreatedEvent(order));
    }
}
OrderQueryService.java (Oxuma tərəf)
@Service
public class OrderQueryService {

    private final OrderViewRepository viewRepo;  // MongoDB (Denormalized)

    // Event-i dinlə, View-u yenilə
    @EventHandler
    public void on(OrderCreatedEvent event) {
        OrderView view = new OrderView(event.getId(), event.getTotal(),
            event.getCustomerName());  // Flat, denormalized
        viewRepo.save(view);
    }

    // Oxuma — sürətli, JOIN yoxdur
    public List<OrderView> getOrders() {
        return viewRepo.findAll();  // MongoDB-dən birbaşa
    }
}
✅ Üstünlükləri
  • Oxuma və yazma müstəqil scale oluna bilir
  • Hər tərəf üçün optimal baza seçilə bilər
  • Oxuma performansı dramatik artır
⚠️ Riskləri
  • Data sinxronizasiyası (Eventual Consistency)
  • Əlavə mürəkkəblik — 2 model, 2 baza, sync mexanizm
  • Kiçik layihələr üçün overengineering ola bilər