Giả sử rằng chúng tôi muốn triển khai một hệ thống con bảo mật nhỏ cho một ứng dụng tài chính cảnh báo người dùng qua email nếu phát hiện một mẫu lạ. Trong ví dụ này, mẫu sẽ bao gồm ba giao dịch như được mô tả. Hệ thống con bảo mật có thể đọc các sự kiện từ hệ thống chính từ hàng đợi.
Những gì tôi muốn nhận được là một cảnh báo là hậu quả trực tiếp của các sự kiện xảy ra trong hệ thống, không có biểu diễn trung gian mô hình trạng thái hiện tại của mẫu.
- Giám sát kích hoạt
- Xử lý giao dịch
- Xử lý giao dịch
- Xử lý giao dịch
- Thông báo được kích hoạt (id: 123)
- Email để gửi thông báo (cho id: 123)
- Xử lý giao dịch
Có điều này trong tâm trí, tôi nghĩ nguồn cung cấp sự kiện có thể áp dụng ở đây rất tốt, mặc dù tôi có một câu hỏi mà không có câu trả lời rõ ràng. Cảnh báo được kích hoạt trong ví dụ có tác dụng phụ rõ ràng, một email cần được gửi, một tình huống chỉ nên xảy ra một lần. Do đó, điều đó không nên xảy ra khi phát lại tất cả các sự kiện của tổng hợp.
Ở một mức độ nào đó, tôi thấy email cần được gửi tương tự như các vật liệu được tạo bởi phía truy vấn mà tôi đã thấy rất nhiều lần trong tài liệu tìm nguồn cung ứng CQRS / Sự kiện, với sự khác biệt không quá tinh tế.
Trong tài liệu này, phía truy vấn được xây dựng từ các trình xử lý sự kiện có thể tạo ra sự cụ thể hóa của trạng thái tại một điểm nhất định đọc lại tất cả các sự kiện. Tuy nhiên, trong trường hợp này, điều đó không thể được thực hiện chính xác như thế vì những lý do đã giải thích trước đó. Ý tưởng rằng mọi trạng thái là nhất thời không áp dụng tốt ở đây . Chúng ta cần ghi lại thực tế là một cảnh báo đã được gửi đi đâu đó.
Một giải pháp dễ dàng cho tôi sẽ là có một bảng hoặc cấu trúc khác trong đó bạn lưu giữ các bản ghi thông báo đã được kích hoạt trước đó. Khi chúng tôi có ID, chúng tôi sẽ có thể kiểm tra xem một cảnh báo có cùng ID được đưa ra trước đó hay không. Có thông tin này sẽ làm cho SendAlertCommand trở nên bình thường. Một số lệnh có thể được ban hành, nhưng tác dụng phụ sẽ chỉ xảy ra một lần.
Ngay cả khi có giải pháp đó trong đầu, tôi cũng không biết liệu đây có phải là một gợi ý rằng có điều gì đó không ổn với kiến trúc này cho vấn đề này không.
- Cách tiếp cận của tôi có đúng không?
- Có nơi nào tôi có thể tìm thêm thông tin về điều này?
Thật kỳ lạ khi tôi không thể tìm thấy thêm thông tin về điều này. Có lẽ tôi đã sử dụng từ ngữ sai.
Cảm ơn bạn rất nhiều!