Tôi đang làm việc trên một ứng dụng ví dụ nhỏ để tìm hiểu các khái niệm về CQRS và tìm nguồn cung ứng sự kiện. Tôi có một Basket
tổng hợp và một Product
tổng hợp nên hoạt động độc lập.
Đây là một số mã giả để hiển thị việc thực hiện
Basket { BasketId; OrderLines; Address; }
// basket events
BasketCreated { BasketId; }
ItemAdded { BasketId; ProductId; Quantity }
AddItemSucceeded { BasketId; ProductId; Quantity }
AddItemRevoked { BasketId; ProductId; Quantity }
ItemRemoved { BasketId; ProductId; Quantity }
CheckedOut { BasketId; Address }
Product { ProductId; Name; Price; }
// product events
ProductReserved { ProductId; Quantity }
ProductReservationFailed { ProductId; Quantity }
ProductReservationCancelled { ProductId; Quantity; }
Các lệnh khá giống với các sự kiện, sử dụng tên bắt buộc và không quá khứ.
Ngay bây giờ những công việc này chỉ hoạt động tốt độc lập. Tôi đưa ra một lệnh AddItem
và nó tạo ra một ItemAdded
sự kiện trên Basket
tổng hợp để thực hiện những gì nó cần làm với trạng thái của 'Rổ'. Tương tự, đối với sản phẩm, lệnh và sự kiện chỉ hoạt động tốt.
Bây giờ tôi muốn kết hợp điều này thành một quá trình sẽ diễn ra như thế này (về các lệnh và sự kiện xảy ra):
Người quản lý quy trình sẽ làm như sau:
on BasketCreated: CreateShoppingProcess
on ItemAdded: ReserveProduct
on ProductReserved: SucceedAddingItem // does nothing, but needs to be there so that the basket knows it can check out
on ProductReservationFailed: RevokeAddItem
on RemoveItem: CancelProductReservation
on Checkout: CreateOrder // create an order and so on...
Các câu hỏi mà tôi không thể tìm thấy câu trả lời dứt khoát là:
- Tôi có cần phải kiên trì quản lý quá trình? Có vẻ như tôi làm, nhưng tôi không chắc
- Nếu tôi làm, tôi cần lưu các sự kiện cho trình quản lý quy trình. Tuy nhiên, các sự kiện mà nó đang nghe được gắn liền với các tập hợp. Tôi có thêm id quá trình cho những người đó không? Tôi có các sự kiện riêng chỉ dành cho người quản lý quy trình không? Làm thế nào để làm điều này và giữ càng sớm càng tốt
- Làm thế nào để tôi biết giỏ các
ProductReserved
sự kiện là gì? Có ổn không khi có mộtBasketId
trong những điều đó quá, hoặc đó là thông tin rò rỉ? - Làm cách nào để giữ mối quan hệ giữa các sự kiện, làm thế nào để tôi biết sự kiện nào đã
ItemAdded
tạo raProductReserved
sự kiện đó ? Tôi có đi ngang quaEventId
không? Điều này có vẻ kỳ lạ ... - Tôi có nên thực hiện
Basket
như một trình quản lý quy trình thay vì tổng hợp đơn giản không?
Sau một số nghiên cứu khác, tôi đã tìm ra điều này: A Saga là thứ gì đó giữ các sự kiện của riêng nó và lắng nghe các sự kiện từ bên ngoài. Về cơ bản, đó là một Tập hợp cũng có thể phản ứng với các sự kiện xảy ra bên ngoài thế giới nhỏ bé của chính nó.
Trình quản lý quy trình làm việc với các sự kiện từ bên ngoài và gửi các lệnh. Lịch sử của nó có thể được xây dựng lại từ các sự kiện đã xảy ra trên các Tập hợp có chung một định danh chung như một tương quanId.