Go for beginners | CQRS (Tiếng Việt)

 




CQRS là viết tắt của Command and Query Responsibility Segregation, là một khuôn mẫu thiết kế được để xuất để chia hai hoạt động đọc dữ liệu và ghi dữ liệu độc lập trong việc lưu trữ dữ liệu. CQRS sẽ giúp cho ứng dụng của chúng ta hiệu xuất hơn, có độ mở cao hơn và cũng an toàn hơn. CQRS khá dễ tiếp cận về mặt lí thuýet, nhưng hiện thực thì khá là nhiêu khê, việc chuyển đổi từ hệ thống cũ đã chạy hàng năm trời, với lượng dữ liệu khổng lồ cũng là một thách thức khá lớn đối với các bạn kĩ sư phần mềm. Trong bài viết này, mình sẽ chia sẻ những thông tin mà mình tìm kiếm được, cũng như những kinh nghiệm mà mình đã được trải qua khi làm việc với CQRS. Nếu có thông tin chưa đúng, rất vui nhận được sự góp ý của các bạn ở phần bình luận bên dưới để mình có thể cập nhật bài viết tốt hơn.


Với những mô hình "cổ xưa", data model được sử dụng để query cũng như cập nhật dữ liệu vào database. Cách làm đơn giản này hoạt động khá trơn tru đối với các ứng dụng CRUD. Tuy nhiên với các ứng dụng phức tạp hơn,  cách tiếp cận này trỏ nên cồng kềnh và khó để tiếp cận cũng như bảo trì về sau này.

Một trong những bài toán thực tế mà bạn có thể tham khảo đó là bài toán quản lí kho hàng với chức năng kiểm tra số lượng tồn kho.

Những vấn đề khó khăn đối với các hệ thống này có thể là:

- Tranh chấp dữ liệu (Data contention) có thể xảy ra khi các luồng đọc ghi, truy xuất cùng lúc trên cùng một tập dữ liệu. Vấn đề này được thấy rõ nhất trong việc quản lí số lượng hàng tồn, ví dụ chúng ta chỉ còn 1 sản phẩm, và khi nhiều người dùng cùng thêm sản phẩm vào giỏ hàng, cùng thanh toán cùng lúc, các trang chấp này sẽ xảy ra khá thường xuyên. Nếu chúng ta không lock các dữ liệu này đúng cách, khách hàng đã thanh toán thành công nhưng có thể sản phẩm đã hết hàng. Một trường trường hợp thực tế khác đó là các ừng dụng đặt phòng, tại các giai đoạn cao điểm. Nhiều khác hàng có thể book cùng một phòng. Huỷ phòng cũng vậy, khi khách huỷ phòng, chúng ta cần phải có một giải pháp để cập nhật lại phòng trống một cách nhanh chóng và hiệu quả.

- Những mô hình truyền thống vẫn có cách để lock những trường hợp trên. Tuy nhiên trên thực tế thì chưa hiệu quả và ảnh hưởng hiệu xuất khá lớn nguyên nhan chủ yếu do những câu query quá phức tạp và dữ liệu thì phải được load từ data store hay lớp Data access. 

- Ngoài ra việc quản lí permisson và bảo mật cũng khác phức tạp với các hệ thống này, nguyên nhân là do mỗi thực thể (entity) đều thuộc luồng đọc hoặc ghi và điều này dẫn đến lộ cấu trúc của các thực thể.


CORS mang đến một giải pháp mới đó chính là tách biệt luồng đọc và ghi thành các model khác nhau, sử dụng command để cập nhật hay truy xuất dữ liệu.

(*) Điểm đặc biệt của mô hình CQRS đó là tất cả các đối tượng sẽ được chia thành 2 loại 1 cho COMMAND REQUEST và 1 cho QUERY REQUEST

COMMAND REQUEST:

- Command tập trung vào HÀNH ĐỘNG không phải là DỮ LIỆU

("Book hotel room", not "set ReservationStatus to Reserved")

- Command thay đổi trạng thái của dữ liệu, nhưng không trả về bất kì giá trị nào

-  Command  nên được xử lí bất đồng bộ thông qua queue hơn là sử dụng các luồng đồng bộ.

- Nếu không có Command nào được gọi, hệ thống sẽ giữ nguyên trạng thái


QUERY REQUEST:

- Query không được quyền thay đổi dữ liệu

- Query đọc trạng thái của dữ liệu và chuyển đổi chúng theo định dạng mong muôn

- Query nên trả ra kết quả







Nguồn tham khảo:

https://docs.microsoft.com/en-us/azure/architecture/patterns/cqrs

https://labs.flinters.vn/technote/tong-quan-ve-kien-truc-cqrs/



Post a Comment

Comment

Previous Post Next Post
WANG !!!!!
https://s.shopee.vn/609U3II1Xf