다음 모델이 있습니다.
public class Team {
public Guid Id {get; set;}
public string Name {get; set;}
public string League {get; get;}
public int Rating {get; set;}
}
시스템에 새 팀을 만들면 이벤트 TeamCreated
를 서비스 버스에 게시합니다 .
{
"MessageId": "33909eaf-56a1-4467-a01a-64b94f10490c"
"MessageType": "TeamCreated",
"CreationDate": "20-01-2016",
"Payload": {
"Id": "11111www-56a1-4467-a01a-64b94f000111",
"Name": "Toronto Maple Leafs",
"League": "NHL NorthEast",
"Rating": 100
}
}
다음으로이 항목이 다음과 같이 수정되었습니다.
{
"MessageId": "33909eaf-56a1-4467-a01a-64b94f10490c"
"MessageType": "TeamUpdated",
"CreationDate": "20-01-2016",
"Payload": {
"Id": "11111www-56a1-4467-a01a-64b94f000111",
"Name": "Toronto Maple Leafs",
"League": "NHL NorthEast",
"Rating": 50
}
}
보시다시피, 그는 업데이트 된 메시지는 팀의 등급 인 변경된 속성뿐만 아니라 모든 속성의 값을 여전히 유지합니다.
내 모델은 실제 시스템에서 50 개 이상의 속성을 가지고 있으며 업데이트 될 때 각 속성에 대해 별도의 이벤트를 만들고 싶지 않습니다. 특히 하나의 업데이트에서 둘 이상의 속성이 변경된 경우 일 수 있기 때문입니다.
이벤트 소싱 아키텍처에서이 시나리오에 대해 정의 된 패턴이 있습니까?
일반적인 대답은 CRUD 이벤트를 버리고 대신 유비쿼터스 언어를 사용하여 변경 사항을 설명하는 것입니다.
어느 정도까지는 이것은 단지 디커플링 연습 일뿐입니다. 우리는 오늘날 엔터티의 상태를 구현 한 방식에 너무 투자하지 않고 "무슨 일이 일어 났는지"를 설명하려고합니다.
예를 선택하려면; '잎이 라스베가스로 이동해야했다. 유비쿼터스 언어로 어떻게 설명할까요? 우리는 아마도 팀이 재배치 (홈 도시, 경기장 변경), 재배치 (리그 변경), 브랜드 변경 (팀 이름, 로고 변경), 판매 가능성 (소유권 그룹 변경) 이라고 말할 수 있습니다 . 따라서이 데이터를 하나의 TeamUpdated
이벤트 로 압축하는 대신 논리적으로 그룹화 된 데이터가 적절한 이벤트를 공유하는 여러 이벤트로 표시되는 변경 사항을 볼 수 있습니다.
엔터티를 다시 수화하면 이벤트 페이로드의 데이터를 인식하고 이전에 기록 된 기록을 반영하기 위해 자체 (비공개) 상태를 변경하는 방법을 이해해야합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다