CQRS - Command Query Responsibility Segregation
CQRS là kiến trúc tách hẳn phần ghi (Command) và phần đọc (Query) thành hai đường đi riêng biệt. Đây là hệ quả tự nhiên khi ta đẩy việc tách Read Model/View Model khỏi write model đi tới cùng.
🔀 Hai phía
- Command (ghi): yêu cầu thay đổi trạng thái, có side effect. Đi qua Command Object và DTO → Application Service (command handler) → Domain Model - Mô hình miền nghiệp vụ → Repository Pattern.
- Query (đọc): yêu cầu đọc dữ liệu, không side effect. Đi qua read repository → Read Model / View Model trả thẳng cho UI.
Command dùng entity/aggregate thiết kế cho nghiệp vụ và đảm bảo invariant. Query dùng mô hình đơn giản, bất biến, tối ưu cho truy vấn. Không dùng đối tượng mutable với logic phức tạp cho mục đích chỉ đọc.
🎯 Lợi ích
- Tối ưu độc lập: phía đọc và phía ghi có thể dùng mô hình dữ liệu khác nhau, thậm chí database khác nhau (write dùng SQL chuẩn hóa, read dùng bảng/view tổng hợp hoặc index tìm kiếm).
- Dễ mở rộng & bảo trì: hai concern tách bạch, thay đổi bên này ít ảnh hưởng bên kia.
- Đồng bộ giữa hai mô hình có thể thực hiện qua Domain Event (khi write đổi → phát event → cập nhật read model).
⚖️ Đánh đổi
CQRS phức tạp hơn vì phải duy trì tính nhất quán giữa hai mô hình. Sách khuyến nghị: với ứng dụng thường, bắt đầu bằng cách nhẹ nhàng (dùng chung DB, chỉ tách lớp repository đọc riêng), chỉ đi tới CQRS đầy đủ khi thực sự cần.
Liên quan
- Read Model · View Model - phía Query
- Command Object và DTO · Application Service - phía Command
- Domain Event - cơ chế đồng bộ read/write
- Separation of Concerns