loading...

CQRS - là gì

nasterblue profile image Naster Blue Updated on ・3 min read

Con người bắt đầu lưu trữ dữ liệu từ xưa bằng viết lên giấy đóng lại thành sách, sách có thể được viết lại cập nhật thêm và truyền từ đời này sang đời khác cho con cháu. Cùng với sự phát triển của công nghệ về sau thì dữ liệu được lưu trữ thành tệp, rồi bằng cơ sở dữ liệu bằng các hệ quản lý cơ sở dữ liệu như MySql, SqlServer, PostgreSQL, MongoDB, ...

Bốn chức năng cơ bản mà một hệ quản trị cơ sở dữ liệu cần phải đảm đảo là C(Create : tạo mới) - R(Retrieve : đọc) - U(Update : cập nhật) - D(Delete : xoá). Có thể nhóm 4 chức năng cơ bản này lại thành 2 nhóm chức năng chính :

  • Query Model - Nhóm chỉ thao tác đọc dữ liệu, cần có kết quả trả về.
  • Command Model - Nhóm chỉ thao tác làm thay đổi dữ liệu, không cần trả về kết quả.

Đối với các ứng dụng quản lý truyền thống thì 2 nhóm này thuộc cùng một tập hợp các model để thao tác đọc và làm thay đổi dữ liệu.

Ứng dụng quản lý sơ khai ban đầu do có ít người dùng nên dữ liệu lưu và truy cập rất ít nên hệ thống hoạt động không gặp vấn đề gì.
Qua một thời gian sản phẩm được công chúng biết đến, công ty quyết định đưa đưa ứng dụng này ra thế giới khiến lượng truy cập tăng lên đột biến server phải chịu tải cả triệu request đồng đời, cùng với khối lượng dữ liệu người dùng tăng lên chóng mặt cả vài trăm Terabyte data mỗi ngày khiến cho hệ thống hiện tại trở nên quá chậm chạp và không đáp ứng được lượng yêu cầu truy cập.

CQRS là viết tắt của Command Query Responsibility Segregation. Tách biệt hẳn 2 nhóm Query và Command Model về mặt vật lý.

  1. Command

    • Tối ưu hoá cho thao tác thay đổi dữ liệu.
    • Chỉ xài các truy vấn đơn giản.
    • Command model vẫn lưu trong DBMS cùng các khoá quan hệ giữa các bảng.
    • Tính Consistency trong ACID (Atomicity, Consistency, Isolation, Durability) phải được hạ thấp và đánh đổi.
    • Tập trung xử lý business logic trong Bounded Context.
  2. Query

    • Tối ưu hoá cho thao tác đọc dữ liệu.
    • Xài cho các truy vấn cực kỳ phức tạp.
    • Query model có thể lưu trong GraphQL, Cached (Redis), Materialized View (Oracle, PostgreSQL, SQL Server), MongoDB, Elastic, ... hỗ trợ query nhanh, tăng tốc độ đọc nhanh đến chóng mặt.
    • Đồng bộ data cho Query Model sẽ có độ trễ hơn so với Command Model data (Eventual Consistency) thông qua message queue.

Alt Text

Posted on by:

nasterblue profile

Naster Blue

@nasterblue

Thất bại báo hiệu sự cần thiết phải hiểu sâu hơn và thay đổi chiến lược/chiến thuật.

Discussion

pic
Editor guide