내가 확실하지 않은 것은 이벤트 스토어 자체에서 집계를 다시 수화하는 이유입니다.
"이벤트"는 기록적인 책이기 때문입니다.
"읽기"데이터베이스에 대한 변경 사항을 투사하는 것이 매우 쉬운 경우 스키마가 도메인 모델과 완벽하게 일치하는 "쓰기"데이터베이스에 변경 사항을 항상 투영하지 않는 이유는 무엇입니까? 효과적으로 스냅 샷 데이터베이스가됩니다.
예; 매번 상태를 처음부터 다시 생성하지 않고 캐시 된 집계 상태 사본을 사용하는 것이 유용한 성능 최적화 인 경우가 있습니다. 기억하십시오 : 성능 최적화의 첫 번째 규칙은 "안함"입니다. 솔루션에 추가 복잡성을 가중 시키므로 강력한 비즈니스 동기가 생길 때까지는 피하는 것이 좋습니다.
이 경우 이벤트 저장소는 스키마 변경의 결과로 "쓰기"데이터베이스를 재 구축 할 때만 유용합니까? 아니면 더 큰 것을 놓치고 있습니까?
더 큰 것이 없습니다.
첫 번째 요점은 이벤트 소스 솔루션을 고려하는 경우 발생한 변경 사항의 히스토리를 보존하는 데 가치가있을 것으로 예상되기 때문입니다. 즉, 비파괴적인 변경을 수행하려고합니다 .
그래서 우리는 이벤트 저장소에 전혀 글을 쓰고 있습니다.
특히, 모든 변경 사항을 이벤트 저장소에 기록해야합니다.
경쟁 작가는 서로의 글을 훼손하거나 서로의 편집 내용을 모르는 경우 시스템을 의도하지 않은 상태로 만들 수 있습니다. 따라서 일관성이 필요할 때 일반적인 접근 방식은 저널의 특정 위치에 대한 쓰기를 처리하는 것입니다 (HTTP API의 조건부 PUT과 유사). 쓰기 실패는 작가에게 저널에 대한 현재의 이해가 동기화되지 않았으며 복구해야한다고 알려줍니다.
알려진 양호한 위치로 돌아간 다음 추가 이벤트를 재생하는 것이 일반적인 복구 전략이므로이 시점부터입니다. 잘 알려진 위치는 로컬 캐시에있는 내용의 사본이거나 스냅 샷 저장소에있는 표현 일 수 있습니다.
행복한 길에서는 집계의 스냅 샷을 메모리에 보관할 수 있습니다. 사용 가능한 로컬 사본이없는 경우에만 외부 상점에 연락해야합니다.
또한, 기록부에 접근 할 수 있다면 완전히 따라 잡을 필요가 없습니다 .
따라서 일반적인 접근 방식 ( 스냅 샷 저장소를 사용하는 경우 )은 비동기 적 으로 유지 관리하는 것 입니다. 이렇게하면 복구해야 할 경우 집계의 전체 기록을 다시로드하고 재생하지 않고도 복구 할 수 있습니다.
범위가 지정된 수명을 가진 세분화 된 집계는 일반적으로 스냅 샷 캐시 유지 관리 비용을 초과 할 수있는 충분한 이벤트를 수집하지 않기 때문에 이러한 복잡성이 관심이없는 경우가 많습니다.
그러나 문제에 적합한 도구 인 경우 집계의 오래된 표현을 쓰기 모델에로드 한 다음 추가 이벤트로 업데이트하는 것이 매우 합리적입니다.