Là tìm nguồn cung ứng sự kiện chỉ khi viết là hiếm?


9

Tôi đang đọc về nguồn cung cấp sự kiện và không thể ngừng tự hỏi liệu điều đó chỉ có ý nghĩa trong các tình huống kỳ lạ khi việc viết rất hiếm hoặc kiểm toán cấp quân sự là bắt buộc.

Một hệ thống không đặc biệt với bất kỳ việc sử dụng đáng kể nào có thể tạo ra từ hàng trăm đến hàng nghìn lần viết mỗi ngày, có nghĩa là, một triệu hoặc 2 lần viết (như các sự kiện) mỗi năm hoạt động. Hợp nhất hàng triệu đối tượng (sự kiện) chỉ để có được trạng thái hiện tại nghe có vẻ như là một đề xuất lố bịch, khi so sánh với việc đọc thẳng từ một bộ lưu trữ truyền thống. Tuy nhiên, tìm nguồn cung ứng sự kiện đứng sau một số hệ thống hoạt động hiệu quả nhất (nghĩ là LMAX).

Vì vậy, tôi đang thiếu gì? 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? Hoặc là ý tưởng hiếm khi phải làm điều này và thay vào đó sử dụng một bộ lưu trữ khác nhau cho các hoạt động bình thường (nghĩa là sử dụng bộ lưu trữ Truy vấn từ CQRS) và chỉ khôi phục từ các sự kiện trong các trường hợp đặc biệt (như sao chép, kiểm toán, v.v.)?

Câu trả lời:


6

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.

  1. Có thể có một bộ đệm phía sau giao diện kho lưu trữ
  2. Vô hiệu bộ nhớ cache là một trong hai vấn đề khó khăn.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.