Gần đây tôi đã bắt đầu đi sâu vào CQRS / ES vì tôi có thể cần phải áp dụng nó trong công việc. Nó có vẻ rất hứa hẹn trong trường hợp của chúng tôi, vì nó sẽ giải quyết rất nhiều vấn đề.
Tôi đã phác thảo sự hiểu biết sơ bộ của mình về cách ứng dụng ES / CQRS trông giống như được bối cảnh hóa trong trường hợp sử dụng ngân hàng đơn giản hóa (rút tiền).
Chỉ cần tổng hợp, nếu người A rút một số tiền:
- một lệnh được ban hành
- lệnh được bàn giao để xác nhận / xác minh
- một sự kiện được đẩy đến một cửa hàng sự kiện nếu việc xác thực thành công
- một trình tổng hợp loại bỏ sự kiện để áp dụng các sửa đổi trên tổng hợp
Từ những gì tôi hiểu, nhật ký sự kiện là nguồn gốc của sự thật, vì nó là nhật ký của FACTS, sau đó chúng ta có thể rút ra bất kỳ phép chiếu nào từ nó.
Bây giờ, những gì tôi không hiểu, trong sơ đồ lớn này, là những gì xảy ra trong trường hợp này:
- quy tắc: số dư không thể âm
- người A có số dư 100e
- người A phát hành Rút tiền cộng đồng 100e
- xác thực vượt qua và sự kiện MoneyWithdrewEvent of 100e được phát ra
- trong khi đó, người A phát hành một khoản rút tiền khác là 100e
- MoneyWithdrewEvent đầu tiên chưa được tổng hợp do đó xác thực vượt qua, vì kiểm tra xác thực đối với tổng hợp (chưa được cập nhật)
- MoneyWithdrewEvent của 100e được phát ra vào lúc khác
==> Chúng tôi đang ở trạng thái không nhất quán của số dư ở mức -100e và nhật ký chứa 2 MoneyWithdrewEvent
Theo tôi hiểu, có một số chiến lược để đối phó với vấn đề này:
- a) đặt id phiên bản tổng hợp cùng với sự kiện trong cửa hàng sự kiện để nếu có phiên bản không khớp khi sửa đổi, không có gì xảy ra
- b) sử dụng một số chiến lược khóa, ngụ ý rằng lớp xác minh phải bằng cách nào đó tạo ra một
Các câu hỏi liên quan đến các chiến lược:
- a) Trong trường hợp này, nhật ký sự kiện không còn là nguồn gốc của sự thật nữa, làm thế nào để đối phó với nó? Ngoài ra, chúng tôi đã trả lại cho khách hàng OK trong khi việc cho phép rút tiền là hoàn toàn sai, trong trường hợp này sử dụng khóa có tốt hơn không?
- b) Khóa == bế tắc, bạn có hiểu biết gì về các thực tiễn tốt nhất không?
Nhìn chung, sự hiểu biết của tôi có đúng về cách xử lý đồng thời không?
Lưu ý: Tôi hiểu rằng cùng một người rút tiền hai lần trong một cửa sổ thời gian ngắn như vậy là không thể, nhưng tôi lấy một ví dụ đơn giản, để không bị lạc vào chi tiết