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 Baskettổng hợp và một Producttổ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 AddItemvà nó tạo ra một ItemAddedsự kiện trên Baskettổ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 ProductReservedsự kiện là gì? Có ổn không khi có mộtBasketIdtrong 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 đã ItemAddedtạo raProductReservedsự kiện đó ? Tôi có đi ngang quaEventIdkhông? Điều này có vẻ kỳ lạ ...
- Tôi có nên thực hiện Basketnhư 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.