이벤트 소싱 및 지속성


12

이벤트 소싱에 대해 읽고 있으며 지속성에 관한 질문이 있습니다.

여전히 모든 엔티티가있는 DB를 가질 수 있습니까? 또는 메모리에서 각 엔티티의 최신 버전을 가져 오기 위해 애플리케이션을 시작할 때마다 이벤트를 재생해야합니까? 더 큰 시스템에서 많은 양의 데이터처럼 낭비되는 것처럼 보입니까?

이벤트 소싱의 요점은 필요한 경우 이벤트를 재생하여 데이터 저장소를 채울 수 있다는 것입니다. (또는 데이터 분석)

답변:


9

시스템 아키텍처도 변경하기로 결정하면 이벤트 소싱의 이점을 최대한 활용할 수 있습니다. DDD와 결합 된 CQRS 스타일 아키텍처로 가면 적어도 내 의견으로는 이벤트 소싱의 진정한 이점을 얻을 수 있습니다.

대규모 시스템에서 잘 작동하는 이벤트 저장소를 구축하는 것은 쉬운 일이 아닙니다. 모든 데이터를 재생하는 것은 실제로 비용이 많이들 수 있습니다. 재생해야하는 데이터의 양에 따라 다릅니다. 그러나이를 해결하는 데 도움이되는 기술이 있으며 그 중 하나가 스냅 샷의 개념입니다. 재생은 특정 시점에서만 수행됩니다. 이벤트 저장소가 시스템에 가져 오는 이점은 매우 중요합니다. 시스템에서 발생한 모든 것을 재생할 수 있으므로 모든 순간의 모든 데이터가 훌륭합니다. 분석, 버그 재현, 통계에 대해 생각하십시오.

훌륭한 이벤트 저장소가 많이 있으며 마지막 이벤트 저장소 는 어제 이벤트 저장소로 릴리스되었으며 실제로 좋은 것 같습니다.

요청 된 데이터로 DTO를 구축하기 위해 시스템의 쿼리 부분에 대해 기존 데이터베이스를 유지할 수 있습니다. 이 데이터베이스는 응용 프로그램 및 클라이언트의 쿼리 요구를 고려하여 구성하고 최적화 할 수 있습니다.

CQRS 아키텍처의 이점과 이벤트 소싱과의 결합에 대한 자세한 기사를 작성했습니다. CQRS, 도메인 이벤트 및 DDD 검토를 확인할 수 있습니다 .


1
CQRS와 DDD에 대해 모두 알고 있습니다. 이벤트 소싱의 이점을 이해합니다. 스냅 샷은 프로세스 속도를 높이는 좋은 방법입니다. 그러나 그것은 질문의 일부가 아닙니다. 그러나 문제는 모든 모델 / 엔터티가 일단로드되면 저장되는 위치였습니다. 메모리 (대규모 시스템에서는 많은 메모리가 필요함) 또는 DB? 가장 좋은 방법은 무엇입니까?
jgauffin

1
주어진 명령을 수행하기 위해 집계를 재 작성할 때 이벤트가 재생되고 집계가 메모리에 유지되고 조치를 수행하고 이벤트를 생성 한 후 이벤트를 이벤트 저장소에 저장합니다. 그러나 그렇습니다. 가치 객체와 엔티티가있는 집계는 메모리에 보관됩니다. 다른 데이터베이스에 보관할 필요가 없습니다. 어쨌든 명령이 완료 될 때까지 일반적으로 짧은 시간입니다. 조금 다른 여러 집계에 걸쳐있는 명령이있는 경우 경계 컨텍스트와 관련된 일부 디자인 문제를 나타낼 수도 있습니다.
Vadim

9

이벤트 소싱의 주요 질문은 "당신의 기록은 무엇입니까"입니다.

귀하의 기록이 이벤트 스트림 인 경우 아무런 문제가 없습니다. 당신의 기록이 당신의 "엔티티 모델"이라면, 문제는 모든 곳에서 일어나기 시작할 것입니다. 이것의 일부는 "엔티티 모델을 잃어버린 경우 이벤트 스트림에서 다시 만들 수 있습니다"라고 말할 수 있다는 것입니다. 이 질문에 긍정적 인 반응을 보인 경우, 이벤트 로그가 기록입니다.

이벤트 소싱을 사용하는 대부분의 사람들이 읽기 모델을 사용한다는 것을 기억하는 것도 중요합니다. 이 모델은 데이터를 쿼리하는 데 사용됩니다. 이것은 3nf 엔터티 모델보다 1nf 모델과 비슷할 것입니다. 쓰기 만 허용되는지 판별하기 위해 집계 상태를 다시 가져 오기 위해 이벤트 만 재생합니다.


안녕하세요 Greg, 저는 이벤트 소싱에 익숙하지 않지만 실제로 이것을 마스터하고 싶습니다. 실제적인 예제와 설명에 대한 리소스를 제안 해 주시겠습니까? CQRS, ES에 대해 많이보고 읽었지만 프로토 타입을 시작하고 싶을 때 그것을 사용하여 나는 언제 어디서 무엇을 알아낼 수 없습니다 :) 나는 당신이 나에게 무언가를 제안 할 수 있기를 바랍니다 (나는 자바쪽에 있습니다). 시간 내 줘서 고마워.
vach

1

여전히 모든 엔티티가있는 DB를 가질 수 있습니까? 또는 메모리에서 각 엔티티의 최신 버전을 가져 오기 위해 애플리케이션을 시작할 때마다 이벤트를 재생해야합니까?

답은 응용 프로그램의 요구 사항에 따라 다릅니다. 나는 그것이 두 가지 방법을 모두 수행하는 것을 보았다.

소규모 회계사를위한 매우 성공적인 소프트웨어 패키지는 시작할 때마다 CQRS 로그를 읽습니다. 원시 데이터의 양이 상대적으로 적으므로 느린 컴퓨터에서도 시작 시간이 1 분 미만이었습니다. 그들은 관행이 대중화되기 전에 10 년 이상 CQRS를 해왔다. 그들은 더 큰 시스템으로 인해 어려움을 겪지 않고 클라이언트 데이터를 계속해서 업그레이드 할 수 있다는 것을 깨달았을 때 좋은 일을하고 있다는 것을 알았습니다.

쿼리 측을 구현하기 위해 RDBMS 기능에 의존하는 대량의 데이터 및 / 또는 시스템의 경우, 이벤트 소스 데이터의 "현재 뷰"에 대한 데이터베이스가 있습니다 (여러 개의 뷰를 가질 수도 있음). 이 방법의 장점은 익숙한 기술을 사용하여 쿼리 측을 작성할 수 있다는 것입니다.


어떤 회계 패키지가이 작업을 수행합니까?
magnus

@ user1420752 Axys .
dasblinkenlight
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.