CQRS 및 이벤트 소싱의 개념을 배우기 위해 작은 예제 응용 프로그램을 만들고 있습니다. 나는이 Basket
집계과 Product
독립적으로 작동합니다 집계를.
다음은 구현을 보여주는 의사 코드입니다.
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; }
명령은 과거 시제가 아닌 명령형 이름을 사용하여 이벤트와 매우 유사합니다.
현재 이들은 독립적으로 잘 작동합니다. 나는 command를 발행 하고 집계 AddItem
에서 ItemAdded
이벤트를 생성 Basket
하여 '바구니'의 상태와 관련이 있습니다. 마찬가지로 제품의 경우 명령 및 이벤트가 정상적으로 작동합니다.
이제 이것을 명령과 이벤트 측면에서 이와 같은 프로세스로 결합하고 싶습니다.
프로세스 관리자는 다음을 수행합니다.
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...
내가 찾을 수없는 질문은 다음과 같습니다.
- 프로세스 관리자를 유지해야합니까? 마치 것 같지만 확실하지 않습니다
- 그렇다면 프로세스 관리자의 이벤트를 저장해야합니다. 그러나 듣고있는 이벤트는 집합에 연결됩니다. 프로세스 ID를 추가합니까? 프로세스 관리자만을위한 별도의 이벤트가 있습니까? 이 작업을 수행하고 가능한 한 건조하게 유지하는 방법
ProductReserved
이벤트의 바구니가 무엇인지 어떻게 알 수 있습니까?BasketId
그것들도 켜도 괜찮 습니까? 아니면 유출 정보입니까?- 이벤트 간의 관계를 유지하려면
ItemAdded
어떤ProductReserved
이벤트 를 생성 했는지 어떻게 알 수 있습니까? 나는 통과EventId
합니까? 이상해 보인다 ... Basket
간단한 집계 대신 프로세스 관리자로 구현해야합니까 ?
더 많은 연구를 한 후에 나는 이것에 도달했습니다. 사가는 자체 이벤트를 유지하고 외부의 이벤트를 듣는 것입니다. 기본적으로, 그것은 작은 세계 밖에서 일어나는 사건에 반응 할 수있는 집합체입니다.
프로세스 관리자는 외부에서 이벤트를 처리하고 명령을 보냅니다. correlationId와 같은 공통 식별자를 공유하는 집계에서 발생한 이벤트에서 히스토리를 다시 빌드 할 수 있습니다.