Tôi đang thiết kế một hệ thống sử dụng Nguồn sự kiện, CQRS và microservice. Tôi sẽ hiểu rằng đây không phải là một mô hình không phổ biến. Một tính năng chính của dịch vụ cần là khả năng bù nước / khôi phục từ hệ thống hồ sơ. Microservice sẽ tạo ra các lệnh và truy vấn trên MQ (Kafka). Các dịch vụ siêu nhỏ khác sẽ đáp ứng (sự kiện). Các lệnh và truy vấn sẽ được duy trì trên S3 cho mục đích kiểm toán và khôi phục.
Quá trình suy nghĩ hiện tại là, với mục đích khôi phục hệ thống, chúng tôi có thể trích xuất nhật ký sự kiện từ S3 và chỉ cần đưa nó trở lại vào Kafka.
Tuy nhiên, điều này không thừa nhận những thay đổi ở cả người sản xuất và người tiêu dùng theo thời gian. Phiên bản ở cấp lệnh / truy vấn dường như có cách nào đó để giải quyết vấn đề nhưng tôi không thể quấn lấy người tiêu dùng phiên bản để tôi có thể thực thi rằng khi một lệnh, trong quá trình khôi phục, được nhận và xử lý, thì chính xác là như vậy [phiên bản của mã] đang thực hiện xử lý vì đây là lần đầu tiên nhận được lệnh.
Có bất kỳ mô hình nào tôi có thể sử dụng để giải quyết điều này? Có ai biết các hệ thống khác quảng cáo tính năng này không?
EDIT: Thêm một ví dụ.
Một 'người mua' gửi 'câu hỏi' cho 'người bán' trên trang web đấu giá của tôi. Dòng chảy trông như sau:
UI -> Web App: POST /question {:text text :to seller-id :from user-id}
Web App -> MQ: SEND {:command send-question :args [text seller-id user-id]}
MQ -< Audit: <command + args appended to log in S3>
MQ -< Questions service: - Record question in DB
- Email seller 'You have a question'
Bây giờ, do yêu cầu kinh doanh mới, tôi điều chỉnh người tiêu dùng 'Dịch vụ câu hỏi', để duy trì số lượng tất cả các câu hỏi chưa đọc. Lược đồ DB được thay đổi. Chúng tôi đã không có khái niệm về việc liệu người bán có đọc câu hỏi hay không, cho đến bây giờ. Dòng cuối cùng trở thành:
MQ -< Questions service: - Record question in DB
- Email seller 'You have a question'
- Increment 'unread questions count'
Hai lệnh là các vấn đề, một trước khi thay đổi, một sau khi thay đổi. 'Số câu hỏi chưa đọc' bằng 1.
Hệ thống gặp sự cố. Chúng tôi đã khôi phục bằng cách phát lại các lệnh thông qua mã mới . Vào cuối quá trình khôi phục, 'số câu hỏi chưa đọc' của chúng tôi bằng 2. Mặc dù, trong ví dụ giả định này, kết quả không phải là một thảm họa, trạng thái đã được khôi phục không giống như trước đây.