Vì vậy, tôi đang thiếu gì?
Lấy một dự đoán.
Điều đầu tiên mà bạn có thể thiếu là bạn chỉ cần tải lại các sự kiện cho trạng thái bạn đang xây dựng lại. Nếu bạn có thể mô hình hóa ranh giới giao dịch của mình một cách sạch sẽ, mỗi đối tượng có thể viết ra các sự kiện được gắn thẻ với id riêng của mình và sau đó chỉ đọc lại các sự kiện đó. Sử dụng cơ sở dữ liệu quan hệ để lưu trữ sự kiện, sẽ có một cột id được lập chỉ mục để tăng tốc truy vấn đó. Sử dụng EventStore, mỗi đối tượng sẽ có luồng riêng.
Mô hình của bạn cần phải cẩn thận để thực hiện việc này một cách sạch sẽ, vì bạn muốn chắc chắn rằng bạn chỉ sửa đổi một đối tượng trong mỗi giao dịch, và do đó bạn cần lưu ý rằng bạn đang cách ly chính xác từng bất biến mà bạn đang cố gắng thi hành.
Trong trường hợp điều đó không đủ nhanh, bạn vẫn có khả năng tạo ảnh chụp nhanh về trạng thái của mình (ghi nhớ) và duy trì điều đó trong "lưu trữ truyền thống". Mỗi ảnh chụp nhanh được gắn thẻ với số thứ tự của sự kiện cuối cùng được sử dụng để xây dựng ảnh chụp nhanh; khi tải lại, kho lưu trữ lấy ảnh chụp đó trước, sau đó áp dụng các sự kiện mới hơn cho nó. (Điều này ngụ ý một số cách hợp lý để lấy các ảnh chụp nhanh gần đây hơn - hoặc các sự kiện cũng được gắn thẻ với số thứ tự hoặc bạn có một số cách hiệu quả để đọc ngược dòng sự kiện cho đến khi bạn đến điểm xuất phát của mình.)
Vẫn có một lợi thế so với cách tiếp cận thông thường ở đây, đó là các ảnh chụp nhanh của bạn có thể được xây dựng song song với bài viết của bạn, thay vì được hợp nhất với chúng: bạn chỉ cần đưa một trình lắng nghe sự kiện vào một số chủ đề / quy trình khác và để nó vui vẻ viết ra đến cửa hàng chụp nhanh vào bất cứ lịch trình nào có vẻ hợp lý. Rốt cuộc, ảnh chụp nhanh không cần phải đặc biệt kịp thời - thường chỉ đủ để công việc áp dụng lại các sự kiện mới hơn không thổi bay SLA của bạn.
(Chụp nhanh không làm phức tạp việc di chuyển; mọi thay đổi đối với việc xê-ri hóa mô hình sẽ làm mất hiệu lực bộ đệm của ảnh chụp nhanh. Tất nhiên, bạn có thể xây dựng lại các ảnh chụp nhanh bằng cách sử dụng tuần tự hóa mới như một phần của quá trình di chuyển và sau đó "bắt kịp" khi các thay đổi được thực hiện.)
Là khôi phục trạng thái từ luồng sự kiện thậm chí thường được thực hiện?
Vâng, đúng vậy. Điều thường thấy trong các ví dụ CQRS là lớp Ứng dụng, sau khi đảm bảo rằng lệnh được gửi được hình thành tốt, lớp ứng dụng sẽ tải đối tượng miền từ kho lưu trữ, trong đó tải là hàm tạo mặc định theo sau là phát lại luồng sự kiện (hoặc tương đương, một cuộc gọi đến một nhà máy với một danh sách các sự kiện).
Hai cái khác, suy nghĩ trái ngược nhau.
- Có thể có một bộ đệm phía sau giao diện kho lưu trữ
- Vô hiệu bộ nhớ cache là một trong hai vấn đề khó khăn.