2016-09-10 4 views
3

CQRS에서 DB 호출이 필요한 명령의 유효성을 검사하는 가장 좋은 방법은 무엇입니까? 예를 들어, CommitOrder이라는 명령의 유효성을 검사하는 집계가 Order이고 충분한 재고가 없으면이 명령을 허용하고 싶지 않습니다. 이 경우 주문 처리 품목의 재고가 있는지 여부를 명령 처리기에서 어떻게 확인할 수 있습니까? 쓰기 측면에서 읽기 측면을 쿼리 할 수 ​​있습니까?DB 호출이 필요한 CQRS 명령 유효성 검사

참고 : - 당신이 서비스에 전달 집계 규칙 유효성 검사를 수행하기 위해 읽기 모델을 조회 할 필요가있는 경우 내가 구현

+0

명령은 쿼리를 실행할 수 있지만 쿼리는 명령을 실행할 수 없습니다. – CSharper

답변

7

에 대한 akka를 사용하고, 그렇게하기 위해 다음 일반적인 방법은 도메인 서비스를 통해입니다 쿼리의 계약을 지정하는 인터페이스. 해당 계약의 구현은 쿼리를 실행합니다.

하지만 쿼리 실행으로 얻은 응답이 오래되었음을 알고 있어야합니다. 다른 집계에 저장된 데이터는 "최신"이라고 가정 할 수 없습니다.

또한 요구 사항을 다시 확인해야합니다. 많은 도메인에서 인벤토리를 현재 사용할 수없는 경우에도 주문을 수락하는 것이 바람직합니다. 결국 주문은 비즈니스 가치를 추가 할 수있는 기회입니다. 당신은 관련성이없는 우려에 대해이를 거부하고 싶지 않습니다. 이는 비즈니스가 "재고 부족"예외를 완화하는 방법을 이미 이해하고있는 경우 특히 그렇습니다.

다른 집계의 데이터는 오래되었습니다. 주문을 수락 할 수 있도록 시스템의 다른 부분이 현재 재고 수준을 업데이트하고있는 것일 수 있습니다.

주식을 사용할 수 없을 때 주문을 수행 할 수있는 요구 사항을 완화 할 수없고 부실 쿼리 데이터를 사용한 오류율이 용납 할 수 없을 정도로 높다면 집계를 재 설계하여 현재 재고 수준이 주문 커밋과 동일한 일관성 경계에 있습니다.

+0

답변 해 주셔서 감사합니다. 예, 실제 비즈니스 요구 사항 및 부실 데이터에 대해서도 동의합니다. 내 문제는 궁극적으로 당신이 쓰기에서 읽기를 쿼리하는이 문제에 부딪 칠 것 인 디자인이다. 그래서 나는 의존성 얽힘에서 나를 끝내는 방향으로 움직이는 것을 두려워했습니다. 쓰기 측면과 읽기 측면을 조정하는 독립적 인 서비스에 명령 검증을 적용하는 것은 어떻습니까? 그렇다면 사가를 사용할 수 있습니까? 아니면 다른 서비스를 만들고 사가를 워크 플로 전용으로 유지해야합니까? – Mutaz