2017-02-05 1 views
1

DDD 및 CQRS를 사용하여 캘린더를 모델링하는 방법을 알고 싶습니다. 내 문제는 사건의 수를 늘리는 것입니다. 나는 이벤트가 포함 된 집계 루트 (Aggregate Root)로 간주한다 (달력 이벤트). ReadSide를 내 명령에서 사용하고 싶지 않지만 도메인 수준에서 이벤트 충돌을 검사 할 방법이 필요합니다.엄청난 수의 어린이를 포함한 골재 루트

답변

4

DDD 및 CQRS를 사용하여 캘린더를 모델화하는 방법을 궁금합니다. 내 문제는 사건의 수를 늘리는 것입니다.

"수명이 긴"집계에 대한 가장 일반적인 대답은 그 수명을 에피소드로 분해하는 것입니다. 예를 들면 회계사가 end of the fiscal year에 닫을 임시 계정이 있습니다.

특정 경우에는 도메인에 적합한 그레인에서 "2 월 캘린더", "3 월 캘린더"등과 같이 "캘린더"가 아닌 것이 좋습니다.

정확성면에서 DDD에 관한 내용이 맞는지 확실하지 않습니다. 요점은 모델이 무효 상태에 들어가는 것을 허용하지 않는 것이라고 믿습니다.

예,하지만 유효하지 않은 상태는 정의하기 까다로운 문제입니다. Udi Dahan이 제안했습니다. this observation

마이크로 초의 타이밍 차이로 인해 핵심 비즈니스 동작이 달라지지 않아야합니다.

더 간결하게, 명령 B를 처리하여 다음 처리 명령 (A)는 다음 또한

이의 당신의 "이벤트를 선택하자 먼저 처리 명령 B를 결국 사실, 다음 A.해야 유효한 상태를 생산 충돌 "예제. 두 개의 명령 scheduleMeeting(A)scheduleMeeting(B)을 처리한다고 가정하면 도메인 모델은 AB과 충돌 함을 인식합니다. 수수께끼 : 캘린더가 유효한 상태로 유지되도록하려면 어떻게해야합니까?

일반성을 잃지 않고 동전을 뒤집어 어떤 명령이 먼저 도착하는지 결정할 수 있습니다. 내 동전에 꼬리가 생겨서 B 명령이 먼저 도착했습니다.

on scheduleMeeting(B): 
    publish MeetingScheduled(B) 

이제는 A 회의 명령이 도착합니다.유효한 달력은 충돌을 허용하지 않는 경우, 구현은 명령이 다음 고려할 필요, 결과에 영향을 안 도착한다는 생각을 받아 들일 경우, 다른 한편으로

on scheduleMeeting(A): 
    throw DomainException(A conflicts with B) 

처럼 보일 필요 또 다른 접근법. 아마도

입니다
on scheduleMeeting(A) 
    publish MeetingScheduled(A) 
    publish ConflictDetected(A,B) 

, 일정 집계 예약 된 이벤트뿐만 아니라 제기 한 갈등뿐만 아니라 추적 모델링된다. aggregates and RFC 2119

+0

답변 해 주셔서 감사합니다. 다른 달로 달력을 분할하는 것에 대한 귀하의 아이디어는 나에게 완벽하게 유효합니다. 유효성 측면에서 DDD에 관한 내용이 맞는지 확실하지 않습니다. 요점은 모델이 무효 상태가되는 것을 허용하지 않는다는 것입니다. 이는 일정에 따라 모든 이벤트를 알 필요가 있음을 의미합니다 (Agreiggate Root). – ayeo

+0

당신은 시스템이 어떻게 일관된 결과를 낼 수 있는지에 대해 좀 더 자세히 설명 할 필요가 있다고 생각합니다. 왜냐하면 당신이 그것을 묘사 한 방식이기 때문에 여전히 충돌이 발생했음을 감지하기 위해서는 큰 집계 경계가 필요하기 때문입니다. 최종 일관성을 사용하면 이벤트가 별도의 집계가 될 수 있으므로 전체적으로 일정에있는 이벤트 모음을 제거 할 수 있습니다 (쿼리로 대체). – plalx

+0

일종의 자원 관리를 할 때, 나는 Day의 개념을 갖게되었습니다. 놀랍지 만 다른 종사자들도 같은 결론에 도달했습니다. 이벤트와 요일을 모두 가질 수 있으며 상호 호환되는지 확인하십시오 (하루에 가용성이 있고 이벤트가 며칠에 도착할 수 있음). –

3

이벤트도 집계 루트 일 수 있습니다. 귀하의 비즈니스 제약 조건을 모르겠지만 두 개의 이벤트 콜라이드가 있다면 사용자에게 어떻게 든 수동 조치를 취할 수 있음을 알릴 수 있다고 생각합니다. 그렇지 않으면 이 실제로 실제로 일 경우 대용량 캘린더 AR의 속도를 높이기 위해 스냅 샷을 사용할 수 없습니다.

내 명령에 ReadSide를 사용하고 싶지 않지만 도메인 수준에서 이벤트 충돌을 검사해야합니다.

집계 명령 처리기 내에서 읽기 모델을 쿼리 할 수 ​​없습니다. colision 감지를 위해 나는 EventScheduled 이벤트에 가입하고 콜리 전이 발생했을 때 (많은 이벤트 인 경우 비동기 가능한) 체크하고 어떻게 든 사용자에게 알리는 특별한 DetectColisionSaga을 생성해야합니다.

+0

감사합니다,하지만 전혀 좋은 연습 간주 도메인에서 측면 읽기에 액세스 :

또한보십시오? – ayeo

+0

"도메인"이란 무엇입니까? 쓰기 편을 의미합니까? –

+0

네, 기본적으로이 질문에 관해서는 글씨를 쓰는 것을 의미합니다. 내가 명령을 파악하는 한, 도메인 모델에서 핸들러에 의해 직접 실행될 것으로 예상되는 명령입니다. – ayeo

관련 문제