2010-05-26 30 views
23

Tôi có một mô hình miền khá đơn giản liên quan đến danh sách các gốc tổng hợp Facility. Cho rằng tôi đang sử dụng CQRS và một event-bus để xử lý các sự kiện được nâng lên từ miền, làm cách nào bạn có thể xử lý xác nhận trên các bộ? Ví dụ: giả sử tôi có yêu cầu sau:Làm cách nào để xử lý xác thực tính nhất quán dựa trên thiết lập trong CQRS?

  1. Facility phải có tên duy nhất.

Vì tôi đang sử dụng cơ sở dữ liệu cuối cùng nhất quán ở phía truy vấn, dữ liệu trong đó không được đảm bảo chính xác tại thời điểm trình xử lý sự kiện xử lý sự kiện.

Ví dụ: FacilityCreatedEvent nằm trong hàng đợi xử lý sự kiện cơ sở dữ liệu truy vấn đang chờ xử lý và được ghi vào cơ sở dữ liệu. Một CreateFacilityCommand mới được gửi đến miền để được xử lý. Các dịch vụ miền truy vấn cơ sở dữ liệu đã đọc để xem có bất kỳ đăng ký nào khác có tên là Facility, nhưng trả về false vì CreateNewFacilityEvent chưa được xử lý và ghi vào cửa hàng. CreateFacilityCommand mới bây giờ sẽ thành công và ném lên một FacilityCreatedEvent mà sẽ nổ tung khi bộ xử lý sự kiện cố gắng ghi nó vào cơ sở dữ liệu và thấy rằng Facility khác đã tồn tại với tên đó.

+0

Bạn đang sử dụng loại cửa hàng nào ở phía bên của giải pháp? ORM cổ điển hoặc Sourcing sự kiện? –

+0

Tôi đang sử dụng Sourcing Event. –

Trả lời

14

Giải pháp mà tôi đã sử dụng là thêm một gốc tổng hợp System có thể duy trì danh sách các tên Facility hiện tại. Khi tạo mới Facility, tôi sử dụng tổng hợp System (chỉ một System làm đối tượng toàn cầu/singleton) làm nhà máy cho nó. Nếu tên cơ sở đã cho đã tồn tại, thì nó sẽ ném một lỗi xác thực.

Điều này sẽ giữ các ràng buộc xác thực trong miền và không dựa vào cửa hàng truy vấn cuối cùng nhất quán.

+0

Tôi biết đây là một câu hỏi cũ, nhưng cách tiếp cận của bạn ngụ ý rằng trình xử lý lệnh CreateFacility thực sự sửa đổi hai tập hợp, hệ thống tổng thể "tổng hợp" Nd tổng hợp Cơ sở mới được tạo ra. Hay tôi đã hiểu lầm? – magnus

+0

@ user1420752 Bạn không thể "sửa đổi" thứ gì đó vừa được tạo;) Không có tranh chấp tiềm năng nào đối với các sáng tạo. – plalx

+0

OK, ít được nói. Ông đã sửa đổi tổng hợp "Hệ thống" chung và đồng thời tạo ra một tổng hợp "Cơ sở" mới. Nếu hai tập hợp được sửa đổi trong một giao dịch đơn lẻ (ví dụ: nếu bạn đang sử dụng DDD "truyền thống" trên cơ sở dữ liệu tuân thủ ACID), thì không có vấn đề gì, nhưng CQRS "purists" sẽ nói "Tổng hợp đại diện cho các ranh giới nhất quán về giao dịch! đang hạn chế khả năng mở rộng! ". Nhưng nếu bạn không cần khả năng mở rộng cao (và tôi tin rằng hầu hết mọi người không) thì giải pháp trên là tốt. – magnus

1

Trong trường hợp này, bạn có thể triển khai dịch vụ kiểu CRUD đơn giản về cơ bản có chèn vào bảng Sql với ràng buộc khóa chính.

Chèn sẽ chỉ xảy ra một lần. Khi các lệnh trùng lặp có cùng giá trị chỉ tồn tại một lần nhấn tổng hợp, tổng hợp gọi dịch vụ, dịch vụ không thực hiện thao tác Chèn do vi phạm ràng buộc khóa chính, ném lỗi, toàn bộ quá trình không thành công và không có sự kiện được tạo ra, không có báo cáo ở phía truy vấn, có thể báo cáo về sự thất bại trong một bảng để kiểm tra sự nhất quán cuối cùng khi người dùng có thể truy vấn để biết trạng thái xử lý lệnh. Để kiểm tra điều đó, chỉ cần truy vấn một lần nữa và một lần nữa Command Status View Model với Command Guid.

Rõ ràng, khi lệnh giữ một giá trị không tồn tại trong bảng để kiểm tra khóa chính, hoạt động là thành công.

Bảng của ràng buộc khóa chính chỉ nên được sử dụng làm dịch vụ, nhưng vì bạn đã triển khai nguồn sự kiện, bạn có thể phát lại các sự kiện để xây dựng lại bảng ràng buộc khóa chính.

2

Ba phương pháp được nêu trong Eventual Consistency and Set Validation:

  1. Nếu vấn đề là hiếm hoặc không quan trọng, đối phó với nó hành chính, có thể bằng cách gửi một thông báo đến một admin.
  2. Gửi một DuplicateFacilityNameDetected event, có thể khởi động quá trình giải quyết tự động.
  3. Duy trì Dịch vụ biết về tên Cơ sở đã sử dụng, có thể bằng cách nghe các sự kiện tên miền và duy trì danh sách tên liên tục. Trước khi tạo bất kỳ Cơ sở mới nào, trước hết hãy kiểm tra với dịch vụ này.

Cũng xem câu hỏi có liên quan này: Uniqueness validation when using CQRS and Event sourcing

1

Bởi vì kiểm tra tính độc đáo sẽ được thực hiện trước khi ghi dữ liệu, vì vậy phương pháp tốt hơn là xây dựng một dịch vụ sự kiện theo dõi, trong đó sẽ gửi một thông báo khi quá trình này hoàn thành hoặc chấm dứt.

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