2013-12-21 6 views
2

CQRS에 대한 자습서를 몇 개 읽었지만 모두 실제 사례를 사용하지 않았습니다. 쉬운 일들)은 메모리 이벤트 저장소 만 가지고 있습니다. 그리고이 예제에서는 이벤트의 "재생"에서 객체의 현재 상태를 쉽고 빠르게 얻을 수 있습니다.CQRS는 아직 완성되지 않았으며 DB에 저장된 내용이 없습니다 (

그러나이 방법은 실제 단어로 어떻게 작동합니까? SQL 데이터베이스와 예. .이 전 사용자와 시스템을 가지고 있다고

하자 그리고 내가 추가하고 편집 사용자뿐만 아니라 모든 사용자의 목록을 얻을 수있는 UI가 있습니다.

자습서의 내용에 따라 DB에 내 이벤트가 저장되어 있다고 가정 해 봅시다. 각 사용자의 프로필에 3 가지 변경 사항이 있고 100.000 명의 사용자가 있다고 가정 해 봅시다.

이제 GetById가 포함 된 레포가 있습니다. 정상적인 비 CQRS 시스템에서는 ID를 기반으로 정확하게 하나의 레코드를 얻습니다. 빠르고 작은 리소스 사용.

이제 CQRS 시스템에서 DB로부터 3 개의 레코드를로드하고 새로운 사용자 개체에 적용하고 이것을 반환해야합니다 ... 그다지 성능이 좋지는 않지만 내가 말할 수있는 것입니다. " 어쩌면 로깅 혜택 등으로 인해 그럴 수 있습니다. "

그러나 한 페이지에 50 명의 사용자를 표시하는 목록 사용자 시나리오는 어떻게합니까? 50 번 x 3 개의 레코드 및 각 페이지 클릭 그리고 이것은 고객, 어쩌면 청구서, 예약 등에 대해서뿐만 아니라 자원 낭비가 무엇입니까?

CQRS/EventSourcing에 대한 잘못된 점이 있습니까? 아니면이 무승부로 평생을 보내고 있습니까?

종류는

답변

6

비정규 화 된 읽기 모델/지속 된보기 모델이 누락되었습니다. CQRS의 주요 이점은 읽기 및 쓰기를 다르게 처리하고 다르게 최적화 할 수 있다는 것입니다. 쓰기 이벤트로 집계를로드합니다. 읽기를 위해 시스템은 목적을 위해 작성된 테이블을 읽습니다. 포함하지 않는 테이블 아마 SQL 또는 NoSQL에 아마 등 예를 http://msdn.microsoft.com/en-us/library/jj554200.aspx

+0

나는 CQRS가 읽기와 쓰기를 분리한다는 것을 알고 있으며, 이것에 관해서는 큰 부분이다. 그러나 이것 이후의 모든 것은 나에게 불분명하다. 아주 작은 현실 세계의 예가 훌륭합니다. UserAggregat의 UpdateUserCommand는 이벤트 SQL 테이블에 일련 번호로 저장되는 이벤트 UserUpdatedEvent를 발생시킵니다. 이 부분도 있습니다. 이것은 쓰기 측입니다. 그러나 읽기면을 처리하는 방법, 사용자 테이블이 있는지 여부 (이벤트 테이블 만 있음) (있는 경우)는 이벤트 테이블에 삽입하지 않고 사용자 테이블의 사용자도 업데이트합니다 ? 그리고 읽기는 사용자 테이블에서만 작동합니다. – SharpNoiZy

+0

MS의 샘플을 보면이 모든 것을 다룰 수 있습니다. 필요한 정보를 표시하도록 설계된 하나 이상의 사용자 테이블이있을 수 있습니다. 다른 뷰를 업데이트하는 하나 이상의 프로세서에서 이벤트를 처리 할 수 ​​있습니다. 이러한 뷰는 일반적으로 매우 단순하며 데이터를 버리고 프로세서를 통해 다시 이벤트를 실행하여 다시 볼 수 있습니다. – GraemeMiller

2

내가 생각 안부 (그리고 내가 지적해야 CQRS에서 초보자 해요)이 생각의 핵심은 데이터 읽기 및 쓰기 데이터의 개념을 분리하는 것입니다. 귀하의 경우 목록 페이지에 대해 읽을 수있는 데이터 저장소를 만들어야합니다. 이 저장소는 이벤트 저장소에 쓰기가 발생할 때 읽기 전용이며 업데이트되거나 모든 이벤트를 재생하여 다시 작성됩니다 (예 : 손상된 경우).

1

엡에 대한

참조 마이크로 소프트 패턴과 연습 CQRS 여행 조인, 당신은 틀렸어. 쓰기 측면을 쿼리에 사용할 수 없습니다. 도메인 이벤트에 반응하는 리스너 (비동기식 일 수 있음)를 사용하여 비정규 화 된 저장소를 만들어야합니다. 그런 다음이 저장소를 사용하여 빠른 쿼리를 만듭니다.