2012-03-17 2 views
1

이벤트 소싱으로 첫 번째 CQRS 프로젝트를 계획하기 시작했으며 시간 제약으로 인해 모델의 일부가 XML 파일에 남아 있습니다. DDD에서 알 수있는 것은 각 업데이트가 집계 루트에 대해 수행되고 다른 집계 루트를 첫 번째 (이벤트가 도메인에서 발생)에서 변경하려는 경우 먼저 두 번째 집계를 수정하는 명령입니다. 각 변경에는 고유 한 트랜잭션 경계가 있습니다.CQRS - 데이터베이스와 파일에 집계가있는 경우?

자, 데이터베이스의 첫 번째 집계에 변경 사항을 커밋 한 경우 두 번째 집계 (이 경우 파일에 쓰기)가 실패하는 상황을 어떻게 처리합니까?

첫 번째 파일 (두 번째 집계)을 업데이트하는 명령을 내린 다음 첫 번째 집계를 변경하는 명령을 내릴 수 있지만 두 번째 명령이 실패 할 수는 있지만이 경우 두 개의 별도 명령이 있습니다. 첫 번째 경우와 같이 처리되는 도메인에서 발생한 이벤트에 대한 생각을 거스르는 것처럼 보입니다.

파일을 사용하지 않고 모든 변경 사항이 데이터베이스에 기록되었다고해도 두 번째 집계 변경이 실패 할 가능성이 있습니다. 이걸 생각 하는게 옳은가요?

아직 내 머리 속의 개념을 분명히하려고 노력하면서 어떤 도움을 주시면 감사하겠습니다.

답변

2

두 번째 집계는 UpdateFailed 이벤트와 같은 것을 방출 할 수 있습니다. 이는 롤백 명령을 첫 번째 집계로 전송하여 처리 할 수 ​​있습니다.

구체적인 예가 있습니까? 집합 경계를 넘는 트랜잭션의 필요성은 종종 모델을 다듬어 해결할 수 있습니다.

업데이트 : 또한 "사가"라는 개념을 살펴보십시오. 무대는 자신과 같은 교차 집계 프로세스에 유용한 조정자가 될 수 있습니다. Saga는 기본적으로 수신 한 이벤트에 따라 명령을 제출하는 이벤트 핸들러입니다. 무용담은 단순한 상태 비 저장 코디네이터 일 수 있지만 상태 유지가 가능하므로 후속 명령이 실패한 경우 어떤 명령을 보완해야하는지 알 수 있습니다. 그냥 구글 "CQRS Saga"와 거기에서 이동하십시오. Greg Young과 Rinat Abdullin의 기사는 특히 도움이됩니다.

+0

데니스 감사합니다. 나는 여전히 내가 DDD 라이트 캠프에 있다고 생각하고 나의 이해를 정돈하려고 노력 중이다. 내가 가진 것은 JOliver의 이벤트 저장소를 사용하는 라이센스 기반 컨텍스트입니다. 각 라이센스에는 서비스 유형 (TV, 비디오 등)이 연결되어 있지만 이러한 서비스는 xml 파일에 저장됩니다. 따라서 새로운 라이선스를 만드는 것은 XML 레코드를 생성하는 것입니다. 라이센스 집계는 서비스 집계와 별개의 것으로 보이며 모델을 수정하는 방법을 알 수 없습니다. –

+0

모델을 정제 할 수 없다고 가정하면 첫 번째 집계는 두 번째 집계로 명령을 실행하는 이벤트를 시작합니다. 그것을 가정하는 것이 맞습니까? 지금 두 번째가 실패하면, 나는 "보상 명령"을 보낸다. (나는 그것이 용어라고 생각한다. 제발 고쳐주십시오.) 첫 번째 집합으로. 그 맞습니까? –

+2

@JD 당신은 올바른 길을 가고 있습니다. 이 경우 어떤 종류의 보상 명령이 필요합니다. 또한 "사가 (Saga)"라는 개념을 살펴보십시오. 무대는 자신과 같은 교차 집계 프로세스에 유용한 조정자가 될 수 있습니다. 무용담은 기본적으로 이벤트 핸들러이며, 수신 한 이벤트에 따라 명령을 제출합니다. 그냥 구글 "CQRS Saga"와 거기에서 이동하십시오. 특히 Greg Young과 Rinat Abdullin의 기사. –

1

여기에 트랜잭션 일관성에 대한 질문이 있습니다. 대화를위한 실제 비즈니스 컨텍스트를 제공하지 않았기 때문에 적절한 솔루션에 대해 완전히 언급하기는 어렵습니다.

그러나 일반적으로 두 번째 집계가 일 경우은 첫 번째 집계에 대한 명령을 기반으로 업데이트해야하며, 동일한 트랜잭션 (DDD 'Bounded-Context')에있을 수 있습니다. 문맥 없이는 알기가 정말 어렵습니다.

그렇지 않으면 대개 두 번째 집계가 첫 번째 이벤트에 가입 한 경우 해당 메시지를 트랜잭션 (이 시간은 두 번째 집계에 속함)에서 수신하고 해당 작업을 수행 할 수없는 경우 이벤트 처리 롤백되고 다시 시도됩니다 (또는 오류 대기열과 같은 수동 작업을 위해 다른 장소로 푸시).

이 정보가 도움이됩니까?

+0

많은 도움을 주셔서 감사합니다. 서로 다른 "경계 상황"에 있다고 가정하면 두 번째 작업이 수행되지 않으면 이벤트가 롤백됩니다. 각 변경 사항이 자체 거래에 있다고 생각 했나요? 따라서 첫 번째 집계 변경은 자체 트랜잭션에 있고 두 번째 집계 변경은 자체 트랜잭션에 있습니다. –

+0

도메인 정보 : 첫 번째 집계가 라이센스 모듈에 있고 라이센스를 서버에 적용 할 수있는 경우 XML 파일 (두 번째 집계에 포함)에 서비스 레코드를 만듭니다. –

+0

그래서 두 번째 집계는 라이센스 할당의 결과로 생성됩니다. 마찬가지로 라이센스가 취소되면 XML 파일에서 두 번째 집계가 삭제됩니다. –