2012-11-20 3 views
1

CQRS 시스템에서 명령이 실행될 때 발생하는 이벤트가 명령과 동일한 ID를 가지므로 명령에 연결할 수 있습니다.명령에 의해 이벤트 ID가 발생했습니다.

저는 현재 CQRS 시스템에 Saga를 구현하고 있습니다. Saga의 개념은 사가가 대표하는 프로세스를 완료하기 위해 특정 이벤트를 처리하고 명령을 처리한다는 것입니다.

이제는 사가가 처리중인 이벤트가 대기중인 이벤트임을 어떻게 알 수 있습니까?

사가의 CommandBus에 전달 된 명령의 ID를 저장하여 동일한 ID의 이벤트를 기다려야합니까? 명령 실행으로 많은 다른 이벤트가 발생하면 모두 동일한 ID를 갖게됩니까?

답변

1

무용담의 경우, 구성 메시지에 몇 가지 상관 관계 키가 있어야합니다. 경우에 따라 OrderId와 같은 자연스러운 비즈니스 도메인 키가 될 수 있습니다. 다른 경우에는 Guid와 같이 전역 적으로 고유 한 키가 더 적합합니다. 이 키는 사가가 구현 한 단일 태스크와 관련된 메시지를 연관시킵니다.

이 상관 ID는 사가를 시작하는 명령의 ID 인 것 같습니다.

나는 ID가 동일한 이벤트를 기다리는 사가의 CommandBus에 전달되는 명령의 ID를 저장해야 하는가?

예. 이 ID가 고유하고 사가가 구현하는 작업을 완전히 식별 할 수 있다고 주장 할 수 있다면 이것이 사가의 상관 ID 여야합니다.

만약에 많은 diffrent 이벤트의 명령 결과의 실행, 그들은 모두 동일한 ID를해야합니까?

그들은 모두 상관 ID를 공유하지만 이벤트의 ID로 생각하지 않습니다. 이벤트 자체에 개별 ID가있을 수 있지만, Saga가 작동하려면 상관 ID가 있어야합니다.

1

나는 eulerfx에 동의하고 포인트 추가 할 : 사가는 집계의 ID가 충분하다 특정 집계에 releated 경우

합니다.

Command: CreateCustomer { CustomerId = New Guid } 
- Creates Customer Aggregate with CustomerId 
- Emits Event CustomerCreated { CustomerId = Customer.CustomerId } 

Command: BlackListCustomer { CustomerId = Customer.CustomerId } 
- Blacklists Customer 
- Emits Event CustomerBlacklisted { CustomerId = Customer.CustomerId } 

Saga: CustomerLifecycle 
- Listens to Event CustomerCreated 
- Stores created customer's CustomerId 
- Listens to Event BlacklistCustomer and only acts if CustomerIds match 
관련 문제