내가 이해하는 한, CQRS의 기본 아이디어는 명령과 쿼리를 처리하기위한 두 가지 데이터 모델이 있다는 것입니다. 이를 "모델 쓰기"및 "모델 읽기"라고합니다.
Twitter 응용 프로그램 복제의 예를 생각해 봅시다. 명령은 다음과 같습니다.
- 사용자는 스스로 등록 할 수 있습니다.
CreateUserCommand(string username)
방출UserCreatedEvent
- 사용자는 다른 사용자를 팔로우 할 수 있습니다.
FollowUserCommand(int userAId, int userBId)
방출UserFollowedEvent
- 사용자는 게시물을 만들 수 있습니다.
CreatePostCommand(int userId, string text)
방출PostCreatedEvent
위에서 "이벤트"라는 용어를 사용하지만 '이벤트 소싱'이벤트를 의미하지는 않습니다. 읽기 모델 업데이트를 트리거하는 신호를 의미합니다. 이벤트 상점이 없으며 지금까지 CQRS 자체에 집중하고 싶습니다.
그리고 여기 쿼리가 있습니다 :
- 사용자는 게시물 목록을 확인해야합니다.
GetPostsQuery(int userId)
- 사용자는 팔로어 목록을 확인해야합니다.
GetFollowersQuery(int userId)
- 사용자는 자신이 따르는 사용자 목록을 확인해야합니다.
GetFollowedUsersQuery(int userId)
- 사용자는 모든 친구 활동의 로그인 "친구 피드"를 볼 필요가 있습니다 ( "친구 John이 방금 새 게시물을 만들었습니다").
GetFriedFeedRecordsQuery(int userId)
처리하려면 CreateUserCommand
해당 사용자가 이미 존재하는지 알아야합니다. 따라서이 시점에서 필자의 쓰기 모델에는 모든 사용자 목록이 있어야합니다.
처리하려면 FollowUserCommand
userA가 이미 userB를 따르는 지 여부를 알아야합니다. 이 시점에서 필자의 쓰기 모델에 모든 사용자-팔로우-사용자 연결 목록이 필요합니다.
그리고 마지막으로, 처리하기 위해 CreatePostCommand
와 같은 명령이 없기 때문에 다른 것이 필요하다고 생각하지 않습니다 UpdatePostCommand
. 내가 가지고 있다면 게시물이 있는지 확인해야하므로 모든 게시물 목록이 필요합니다. 그러나이 요구 사항이 없기 때문에 모든 게시물을 추적 할 필요는 없습니다.
질문 # 1 : "모델 작성"이라는 용어를 사용하는 것이 실제로 올바른가요? 또는 ES의 경우 "모델 쓰기"가 항상 "이벤트 저장소"를 의미합니까? 그렇다면 명령을 처리해야하는 데이터와 쿼리를 처리해야하는 데이터 사이에 어떤 종류의 분리가 있습니까?
를 처리하려면 GetPostsQuery
모든 게시물 목록이 필요합니다. 이것은 내 읽기 모델에 모든 게시물 목록이 있어야 함을 의미합니다. 을 듣고이 모델을 유지하겠습니다 PostCreatedEvent
.
모두를 처리하기 위해 GetFollowersQuery
그리고 GetFollowedUsersQuery
, 나는 사용자 사이의 모든 연결 목록을해야합니다. 이 모델을 유지하기 위해을 들어 보겠습니다 UserFollowedEvent
. 여기입니다 질문 # 2 : 여기 연결의 쓰기 모델의 목록을 사용하는 경우는 실질적으로 OK인가? 아니면 나중에 별도의 읽기 모델을 만들어야하는데, 나중에 쓰기 모델보다 자세한 내용이 필요할 수 있기 때문입니다.
마지막으로, 처리 GetFriendFeedRecordsQuery
하려면 다음이 필요합니다.
- 들어 봐
UserFollowedEvent
- 들어 봐
PostCreatedEvent
- 어떤 사용자가 다른 사용자를 팔로우하는지 파악
사용자 A가 사용자 B를 따르고 사용자 B가 사용자 C를 따르기 시작하면 다음 레코드가 나타납니다.
- 사용자 A의 경우 : "친구 B 사용자가 사용자 C를 팔로우하기 시작했습니다."
- 사용자 B의 경우 : "방금 사용자 C를 시작했습니다."
- 사용자 C의 경우 : "사용자 B가 이제 당신을 따르고 있습니다"
여기의 질문 # 3 : 나는 연결 목록을 얻기 위해 무엇을 사용해야 모델? 쓰기 모델을 사용해야합니까? 나는 모델을 읽을 사용해야합니다 - GetFollowersQuery
/를 GetFollowedUsersQuery
? 아니면 GetFriendFeedRecordsQuery
모델 자체를 처리하고 UserFollowedEvent
모든 연결의 자체 목록을 유지해야합니까?