2017-01-20 4 views
3

이벤트 소싱 패턴을 배우고 있습니다. 한 가지를 이해할 수 없습니다.이벤트 소싱 패턴 : 왜 현재 상태를 저장하면 안됩니까?

에 대한 지침이 없습니다.은 많은 자습서에서 DB에있는 엔터티의 현재 상태를 저장하지 않습니다. 개발자는 필요한 엔티티와 관련된 DB에서 모든 이벤트 ("이벤트 스트림")를 추출하기위한 인프라를 구축해야합니다. 그런 다음 새로운 필수 유형의 객체에 적용하여 마침내 현재 상태입니다.

은행 계좌로 지정하십시오. 내 클라이언트에 내가해야 그녀의 현재 계정 상태로 돌아가려면 :

  1. 추출 관련된 모든 이벤트를 그 순간에 무료로 돈을
  2. 계산 금액 (아마도 DB에서 수천 개의 이벤트가 있습니다).

그러나 성능은 어떻습니까? 모든 계정의 현재 상태를 저장하는 것이 더 좋을 것이라고 생각하며 새로운 이벤트는 즉시 부작용을 초래합니다. 내가 옳지 않은가?

+0

그게 이벤트 소싱의 요점이야, 당신은 이벤트에서 상태를 다시 빌드. 이 작업을 수행하지 않으면 이벤트 소싱이 없습니다. 감사 기록 ​​등이있을 수 있습니다. 그래서 그 질문이 무엇인지 이해하는 것은 어렵습니다. –

+0

@Alexey Zimarev 이벤트 소싱 패턴에서 성능 문제를 해결하는 방법에 대해 질문했습니다. 내 질문을 이해하는 것이 어렵다고 나는 생각하지 않는다. – Mergasov

+1

아직 성능 문제가 발생 했습니까? –

답변

2

이벤트 소싱의 전체 지점은 상태를 일련의 변경으로 유지하는 것이므로 현재 상태가 ES와 반대입니다.

성능 요구 사항으로 인해 때로는 snapshot이 생성되어 업데이트가 처음부터 적용되지 않고 앞으로 만 스냅 샷부터 적용됩니다. 이벤트 저장소는 이벤트 소싱을 사용하는 응용 프로그램을 대상으로하는 특수 데이터베이스이며 스냅 샷 기능 out of the box을 제공 할 수 있습니다.

방정식의 다른 부분은 읽기 및 쓰기 모델을 분리하는 CQRS - Command Query Responsibility Segregation 패턴 (이전 링크가 제대로 이해하지 못했기 때문에 IMO, this one)을 보완한다는 점입니다. 그런 다음 실행중인 명령 또는 도메인 이벤트는 실제로 현재 상태의 비정규 화 된 표현 인 읽기 모델을 지속적으로 업데이트하는 데 사용됩니다. 따라서 명령의 경우 이벤트 (ES)에서 도메인 객체를 작성하고 그에 대한 작업을 수행하며, 쿼리의 경우 이벤트 저장소를 우회하여 최적화 된 관계형 데이터베이스, 문서 데이터베이스 또는 다른 어떤 것일 수있는 읽기 모델에서 데이터를 직접 검색합니다 당신의 독서 시나리오.

ES로 구현 된 명령 측면의 성능보다 거의 독서력이 뛰어난 응용 프로그램을 사용하는 경우 그다지 중요하지 않을 수 있습니다.

ES의 이점은이 질문의 범위를 벗어나며 인터넷에서 많은 정보를 찾을 수 있습니다 (특히 Greg Young 및 Udi Dahan). 나는 개인적으로 조금 회의적이며 오랫동안 운영되는 비즈니스 시나리오로 작업하는 것이 합리적이라고 생각합니다.

+0

답변 및 링크, Zdeslav에 감사드립니다. 내 프로젝트에서 어떤 개체 개체와 관련된 모든 변경 내용을 추적하기위한 인프라를 구축해야합니다. 내 시나리오에서 DB에 "이벤트"(로깅)를 저장하는 것이 클리어 ES + CQRS 패턴을 구현하는 것보다 낫다고 생각합니다. – Mergasov

+1

6 ~ 7 년 전 나는 ES/CQRS를 사용하지 않고 '일반적인'도메인 모델을 사용하는 프로젝트를 진행했습니다. NHibernate가 ORM에 사용 되었기 때문에 [interceptors] (http://nhibernate.info/doc/nhibernate-reference/events.)를 사용할 수있었습니다.html) - 각 모델 업데이트/저장/삭제에서 수정 된 필드 목록과 작업을 시작한 사용자의 사용자 이름과 함께 필드 이름과 값을 저장했습니다. 몇 줄의 코드에서 감사 추적을 완료하십시오. –

관련 문제