2010-06-23 2 views
22

이벤트 소스로 연결된 집계 백엔드를 사용하여 DDD 원칙에 따라 구축 된 환경에서 aggregate roots (AR)을 서로 어떻게 구분해야합니까?CQRS + DDD + 이벤트 소싱의 Inter-Aggregate 통신

예를 들어 Booking AR을 생성하는 팩토리 메소드가있는 Facility 집계 루트 (AR)가 있습니다. Booking은 AR (Person AR)과 Facility AR (AR)의 시간에 민감한 조합입니다. Person은 단 하나의 Facility으로 예약 할 수 있습니다.

DDD에서 Booking에 대한 참조는 Person이고 PersonFacility입니다. 그러나 이벤트 소싱에 사용할 이벤트를 생성 할 때 백엔드에서 이벤트 deserialization을 처리하는 것은 금지됩니다. 그러므로 나는 값 객체 기반 고유 ID에 대한 참조 만 가지고있다. AR에 대한 메소드가 다른 AR에서 다른 메소드를 호출 할 필요가있을 때 이것은 새로운 문제를 야기합니다. 어떻게 그 상황을 처리합니까? 도메인 AR에서 이벤트 소스 저장소를 조회 하시겠습니까?

이 시나리오의 일반적인 사용 사례는 무엇입니까? 나는이 모든 잘못에 접근하고 있는가?

답변

37

집합 루트 경계는 일관성 경계를 정의합니다. 집계 내에 일관성이 보장됩니다. 바깥 쪽 ... 그렇지 않습니다. 따라서 여러 집계에 걸쳐 일관된 작업을해서는 안됩니다. 두 개의 집계에 걸쳐있는 트랜잭션이 필요한 경우 집계 경계를 검토해야합니다.

집계 외부에서 발생하는 일에 대해서는 다른 집계에 명령을 보내는 이벤트 처리기가 있어야합니다. 집계 간의 동작 논리가 더 복잡하면 프로세스를 정의하고 이벤트를 수신하고 집계에 명령을 보내는 상태 시스템을 정의 할 수 있습니다. 프로세스는 장기 실행 트랜잭션 (롤백 대신 보상)을 정의하거나 시스템에서 대규모로 발생하는 상황 (바운드 컨텍스트 사이에서도)을 기반으로 비즈니스 의사 결정을 내릴 수 있습니다.

+2

좋은 답변 -이 주제에 대해 자세히 알고 싶다면이 게시물이 도움이 될 것입니다. [이벤트 공급 시스템의 Intergregate Communication] (http://danielwhittaker.me/2014/11/22/) 4-secrets-inter-aggregate-communication-event-sourced-system /) – Codescribler

4

Event Sourcing 및 CQRS를 사용할 때 AR 간 통신의 가장 우아한 방법은 메시징입니다. 당신은 Ncqrs 프로젝트를 볼 수 있습니다 (.NET 사용자 인 경우 더 쉬울 것입니다). 특히 'Messaging'브랜치입니다. AR은 처리하는 모든 메시지 유형에 대해 IMessageHandler 인터페이스를 구현하고 AR 기본 클래스는 메시지를 보내기 위해 Send 메서드를 노출합니다. 이 API를 통해 클라이언트는 모델 동작을 호출하고 모델 자체는 (AR간에) 통신 할 수 있습니다.