9

Tôi được yêu cầu thực hiện một số khám phá trong tìm kiếm sự kiện. mục tiêu của tôi là tạo một lớp API nhỏ đáp ứng tất cả các hoạt động CRUD truyền thống. Bây giờ tôi đang sử dụng một gói có tên 'có nguồn gốc' và cố gắng chơi với nó (Sử dụng Nodejs).Cách quản lý yêu cầu đọc trong ứng dụng có nguồn gốc sự kiện

Tuy nhiên, tôi đã nhận ra rằng sự kiện tìm nguồn cung ứng không hoàn toàn hữu ích khi nó được sử dụng một mình. thông thường, nó được kết hợp với CQRS.

Sự hiểu biết của tôi về CQRS là, khi giao diện người dùng gửi lệnh ghi tới máy chủ. ứng dụng thực hiện một số xác thực đối với dữ liệu. và lưu nó trong cửa hàng sự kiện (tôi đang sử dụng mongoDB), ví dụ: đây là cửa hàng sự kiện của tôi sẽ trông như thế nào:

{method:"createAccount",name:"user1", account:1} 
{method:"deposit",name:"user1",account: 1 , amount:100} 
{method:"deposit",name:"user1",account: 1 , amount:100} 
{method:"deposit",name:"user1",account: 1 , amount:100} 
{method:"withdraw",name:"user1",account1,amount:250} 

Nó chứa tất cả thông tin kiểm tra chứ không phải tình trạng cuối cùng. tuy nhiên, tôi bối rối làm thế nào tôi có thể xử lý các hoạt động đọc. nếu tôi muốn đọc số dư tài khoản. chính xác thì điều gì sẽ xảy ra? đây là câu hỏi của tôi:

  1. Nếu chúng tôi không thể truy vấn sự kiện lưu trữ (cơ sở dữ liệu) trực tiếp cho hoạt động đọc, thì chúng ta nên truy vấn ở đâu? nó nên là một bộ nhớ đệm trong bộ nhớ?
  2. Nếu chúng tôi truy vấn bộ nhớ. là trạng thái cuối cùng đã có hoặc tôi phải thực hiện thao tác phát lại (hoặc gấp trái) để tính kết quả. ví dụ: số dư của tài khoản 1 là 50.
  3. Tôi đã tìm thấy một số blogger đã nói về 'đăng ký' hoặc 'phát'. chúng là gì và phát sóng cho ai?

Tôi sẽ thực sự đánh giá cao bất kỳ đề xuất nào và vui lòng sửa lỗi nếu hiểu biết của tôi sai.

+0

Đối với tôi, một khái niệm bạn không nhận thức được trong câu hỏi là sự kiện thường được duy trì trong luồng, được tách biệt theo Tổng hợp theo nghĩa DDD. Các seqs của các sự kiện được xem xét trong một quá trình quyết định được giới hạn cho những người bạn colocated khi viết. Về phía truy vấn, bạn có thể trong một số trường hợp tải thấp tấn công nó bằng cách đọc + gấp toàn bộ luồng. Nói chung, như các câu trả lời ám chỉ đến, dự đoán là làm thế nào tương đương với truy vấn đạt được. [Tài liệu giới thiệu cho GES] (http://docs.geteventstore.com/introduction/4.0.2/event-sourcing-basics/) là một đọc tốt –

+1

@RubenBartelink có bạn đã đúng! Tôi không có ý tưởng về cách sử dụng các luồng sự kiện. Tôi nên xem xét những thứ bảo trì luồng. Cảm ơn bạn đã đề xuất! – nick

Trả lời

6

Câu hỏi tuyệt vời Nick. Khái niệm bạn đang thiếu là 'Phép chiếu'. Khi một sự kiện được duy trì, bạn sẽ phát sự kiện. Bạn chiếu mã lắng nghe cho các sự kiện cụ thể và sau đó làm những việc như cập nhật và tạo ra một 'mô hình đọc'. Mô hình đọc là một phiên bản của trạng thái kết thúc (thường được duy trì nhưng có thể được thực hiện trong bộ nhớ).

Điều tuyệt vời là bạn có thể tối ưu hóa cao các mô hình đã đọc này để đọc. Nói lời tạm biệt với sự tham gia phức tạp và không hiệu quả, v.v.

Khi mô hình đọc không phải là nguồn gốc của sự thật và nó được thiết kế đặc biệt để đọc, bạn có thể sao chép dữ liệu trong đó. Chỉ cần chắc chắn rằng bạn quản lý nó khi nhận được sự kiện thích hợp.

Để biết thêm thông kiểm tra những bài viết này:

Hy vọng bạn tìm thấy những hữu ích.

** Sơ đồ đề cập đến sự biến đổi hóa học, nơi nó nên nói về các phép chiếu.

+0

Câu trả lời của bạn đã xóa sạch sự nhầm lẫn của tôi! cảm ơn rất nhiều! Tôi hiện đang triển khai một ứng dụng rút tiền/rút tiền ngân hàng nhỏ. sau khi sự kiện đã được cam kết. Tôi phát sóng sự kiện này (ví dụ 'tiền gửi') và phần tương ứng đang lắng nghe 'khoản tiền gửi' sẽ xử lý sự kiện gửi tiền này để cập nhật số dư. Điều này có đúng không? – nick

+0

Và bằng cách này, hãy giả sử tôi có hàng triệu bản ghi trong cơ sở dữ liệu. điều đó có nghĩa là nếu tôi khởi động lại máy chủ. có thể mất một lúc để khởi tạo ReadModel được cập nhật? – nick

+0

Hầu như trên bình luận đầu tiên của bạn. Tạo sự khác biệt trong cách bạn đặt tên cho các lệnh và sự kiện. Các lệnh nằm trong mệnh lệnh và các sự kiện luôn ở trong quá khứ. Về tái khởi tạo. Việc khởi động lại ứng dụng sẽ không còn lâu hơn bất kỳ ứng dụng nào khác. Bạn nên duy trì mô hình đã đọc. Hy vọng rằng có ý nghĩa. – Codescribler

3

Bạn có thể truy vấn cửa hàng sự kiện. Phương pháp truy vấn thực tế cụ thể cho mọi triển khai nhưng nói chung bạn có thể thăm dò ý kiến ​​cho các sự kiện hoặc đăng ký và được thông báo khi một sự kiện mới được duy trì.

Cửa hàng sự kiện chỉ là sự kiên trì đối với mặt viết đảm bảo tính nhất quán mạnh mẽ cho hoạt động ghi và tính nhất quán cuối cùng cho hoạt động đọc. Để "hiểu" một cái gì đó từ các sự kiện bạn cần để chiếu các sự kiện đó vào một mô hình đọc rồi truy vấn mô hình đọc. Ví dụ, bạn có thể có một mô hình đọc có chứa số dư hiện tại cho mỗi tài khoản như một bộ sưu tập MongoDB.

+1

Cảm ơn! câu trả lời của bạn đã giúp tôi hiểu nó! Bây giờ tôi đang thực hiện phát sóng cho người nghe, sau đó người nghe có thể xử lý các phương pháp tương ứng (ví dụ, 'rút tiền') – nick

+0

@nick bạn được chào đón! –

Các vấn đề liên quan