2012-06-29 2 views
3

기본 정보 : 로그인을 위해 외부 OAuth 공급자를 사용하고 있습니다. 사용자가 외부 OAuth에 로그인하면 내 시스템에 입장 할 수 있습니다. 그러나이 사용자는 아직 내 시스템에 존재하지 않을 수 있습니다. 기술적 인 문제는 아니지만 JOliver EventStore를 사용하고 있습니다.CQRS 및 EventStore로 동시 생성

논리 :

  1. 나는 새로운 사용자를위한 GUID를 제공하고 있지 않다. 방금 이메일 주소가 있습니다.
  2. 사용자의 전자 메일 이 있으면 명령을 보내기 전에 읽은 모델을 확인하고 ID가없는 로그인 명령을 실행합니다. 생성되지 않은 ID가있는 CreateUser 명령을 실행합니다. 내 문제는 새로운 사용자의 경우입니다.
  3. 이벤트 저장소에 새 ID로 저장이 발생합니다.

문제 : 이 두 읽기 모델로 인해 브라우저 새로 고침 또는 읽기 모델이 달성과 일관성 이전에 발생하는 다른 이상으로 업데이트하기 전에 명령이 어떻게 든 발행 만들 가정합니다. 그건 내 문제가 아니야. 새로운 ID가 GUID를 빗이 때문에, 이벤트 저장소는이 두 createuser가 명령은 동일한 사용자를 나타낸다는 것을 알 기회가 없습니다 : 작업 진행

. 그들이 읽기 모델에 도달 할 때까지, 읽은 모델은 (동일한 전자 메일을 가지고 있기 때문에) 알 수 있고 두 레코드를 병합하거나 다른 보상 작업을 수행 할 수 있습니다. 하지만 이제는 내 읽기 모델이 이벤트 저장소와 동기화되지 않습니다. 이벤트 저장소는 여전히 이들이 두 개의 별도 엔티티라고 생각합니다.

아마도 때문에 문제가되지 않습니다

  1. 을 그래서 확인을해야 읽기 모델 에 같은 영향을 미칠 것입니다 사건을 재생.
  2. 두 명령이 모두 "Create"명령과 중복되기 때문에 동일한 정보를 포함해야하므로 이벤트 저장소에서 아무 것도 잃어 버리는 것과 같지 않습니다.

누구도 비슷한 문제를 어떻게 처리했는지 밝힐 수 있습니까? 일부 보완 조치가 필요한 경우 중복 모델 항목이 있음을 인식하면 읽기 모델 서비스가 일종의 보상 명령을 발행합니까? 고려하지 않은 간단한 방법론이 있습니까?

감사합니다.

답변

7

당신은 내가 적절한 해결책이라고 생각하는 것에 매우 가깝습니다. 시나리오를 요약하면 다음과 같습니다.

  • OAuth-entication을 수행하십시오.
  • 읽기 모델을 사용하면 이메일 주소를 기반로 반복 방문자와 신규 방문자를 결정할 수 있습니다.
  • 새 방문객의 경우 이벤트 저장소에 처리되고 저장되는 RegisterNewVisitor 명령 메시지를 보내십시오.
  • 동일한 전자 메일 주소에 대해 동시성이 발생한다고 가정하면 두 개의 RegisterNewVisitor 메시지가 발생하며 각 메시지에는 시스템에서 전자 메일 주소와 연결된 키가 포함되어 있다고 생각됩니다. 이 키 (guid)는 다릅니다.
  • 읽기 모델에서이 중복 키 문제를 감지하고 두 모델 읽기 레코드를 하나의 레코드로 병합합니다. 이제

대신 읽기 모델에서 레코드를 병합, 왜, 당신의 도메인 모델을 향해 ResolveDuplicateVisitorEmailAddress {키 1, 키 2}을 보낼 수 없습니다 (도메인 모델에 비즈니스 의사 결정의 성문화 양식을 그것을 떠나 기울여야합니다)를 사용하여이 문제를 해결하십시오. 이러한 종류의 문제를 다루기 위해 전용 읽기 모델을 사용할 수도 있습니다. 다른 읽기 모델은 일종의 DuplicateVisitorEmailAddressResolved 이벤트를 가져 와서 적절한 레코드에 투영합니다.

경고 문구 : 기술적 인 질문을하고 기술 가능한 해결책을 제시했습니다. 일반적으로이 기술을 투자하지 않을만한 비즈니스 지표가 없다면 (이 기술을 처음부터 동시에 로그인하는 사용자의 빈도는 무엇일까? 어쩌면이 방법으로 해결할 수 있습니다. 근본 원인을 무시하는 것일뿐입니다. (flakey OAuth, 등록 절차가없는 새로운 방문자 프로세스 등)). 이 문제에 대한 다른 기술적 해결책이 있지만 이미 가지고있는 것과 가장 가까운 것을 제공하고 싶습니다. 그들은 새로운 방문자를 순차적으로 등록하는 것부터 순차적으로 읽지 않은 모델의 방문객을 메모리에 투영하는 것까지 다양합니다.

+0

요점은 도메인 모델에 속한 결정이므로이 작업 과정을 따라야한다는 것입니다. –

+3

완료하기 만하면됩니다 - 여러 번 논의되었습니다 - http://codebetter.com/gregyoung/2010/08/12/eventual-consistency-and-set-validation/ –

+0

잘 답변 해 주신 것에 대해 감사드립니다. . 저는 이것이 여러 번 답변 받았을 것이라고 확신합니다. 그러나 일반적으로 CQRS를 사용하면 확연히 드러나는 답을 찾는 것이 어렵습니다. 나는 그것이 정말로 중요하지 않은 상황을 지나치게 복잡하게 만들 수도 있다는 것에 동의한다. 이 경우에는 아무 것도 할 필요가 없지만이 문제를 해결할 필요가있는 상황에서 사례 자체가 더 많은 "접근 질문"을 제기했습니다. 답변과 링크를 제공해 주셔서 감사합니다. – swannee