기본 정보 : 로그인을 위해 외부 OAuth 공급자를 사용하고 있습니다. 사용자가 외부 OAuth에 로그인하면 내 시스템에 입장 할 수 있습니다. 그러나이 사용자는 아직 내 시스템에 존재하지 않을 수 있습니다. 기술적 인 문제는 아니지만 JOliver EventStore를 사용하고 있습니다.CQRS 및 EventStore로 동시 생성
논리 :
- 나는 새로운 사용자를위한 GUID를 제공하고 있지 않다. 방금 이메일 주소가 있습니다.
- 사용자의 전자 메일 이 있으면 명령을 보내기 전에 읽은 모델을 확인하고 ID가없는 로그인 명령을 실행합니다. 생성되지 않은 ID가있는 CreateUser 명령을 실행합니다. 내 문제는 새로운 사용자의 경우입니다.
- 이벤트 저장소에 새 ID로 저장이 발생합니다.
문제 : 이 두 읽기 모델로 인해 브라우저 새로 고침 또는 읽기 모델이 달성과 일관성 이전에 발생하는 다른 이상으로 업데이트하기 전에 명령이 어떻게 든 발행 만들 가정합니다. 그건 내 문제가 아니야. 새로운 ID가 GUID를 빗이 때문에, 이벤트 저장소는이 두 createuser가 명령은 동일한 사용자를 나타낸다는 것을 알 기회가 없습니다 : 작업 진행
. 그들이 읽기 모델에 도달 할 때까지, 읽은 모델은 (동일한 전자 메일을 가지고 있기 때문에) 알 수 있고 두 레코드를 병합하거나 다른 보상 작업을 수행 할 수 있습니다. 하지만 이제는 내 읽기 모델이 이벤트 저장소와 동기화되지 않습니다. 이벤트 저장소는 여전히 이들이 두 개의 별도 엔티티라고 생각합니다.
아마도 때문에 문제가되지 않습니다
- 을 그래서 확인을해야 읽기 모델 에 같은 영향을 미칠 것입니다 사건을 재생.
- 두 명령이 모두 "Create"명령과 중복되기 때문에 동일한 정보를 포함해야하므로 이벤트 저장소에서 아무 것도 잃어 버리는 것과 같지 않습니다.
누구도 비슷한 문제를 어떻게 처리했는지 밝힐 수 있습니까? 일부 보완 조치가 필요한 경우 중복 모델 항목이 있음을 인식하면 읽기 모델 서비스가 일종의 보상 명령을 발행합니까? 고려하지 않은 간단한 방법론이 있습니까?
감사합니다.
요점은 도메인 모델에 속한 결정이므로이 작업 과정을 따라야한다는 것입니다. –
완료하기 만하면됩니다 - 여러 번 논의되었습니다 - http://codebetter.com/gregyoung/2010/08/12/eventual-consistency-and-set-validation/ –
잘 답변 해 주신 것에 대해 감사드립니다. . 저는 이것이 여러 번 답변 받았을 것이라고 확신합니다. 그러나 일반적으로 CQRS를 사용하면 확연히 드러나는 답을 찾는 것이 어렵습니다. 나는 그것이 정말로 중요하지 않은 상황을 지나치게 복잡하게 만들 수도 있다는 것에 동의한다. 이 경우에는 아무 것도 할 필요가 없지만이 문제를 해결할 필요가있는 상황에서 사례 자체가 더 많은 "접근 질문"을 제기했습니다. 답변과 링크를 제공해 주셔서 감사합니다. – swannee