2011-11-18 3 views
1

DDD 및 CQRS를 기반으로 아키텍처를 설정했습니다. 또한 우리는 고객이 연결할 수있는 OAUTH 구현을 갖춘 편안한 API를 보유하고 있습니다. 고객은 API에 연결하여 클라이언트를 대신하여 작업을 수행합니다. 그들의 고객은 우리 측의 프로파일로 대표됩니다.DDD CQRS 동시 처리 문제

우리는 다음 문제에 대한 좋은 해결책이 없습니다. 클라이언트는 API에서 메소드를 호출하여 프로파일을 작성할 수 있습니다. 문제는 프로필의 고유성을 보장해야한다는 것입니다. 따라서 현재 수행중인 작업은 읽기 모델에서 기존 프로필을 확인하고, 존재하지 않는 경우 명령을 만들고, 다른 API 호출을 수행 할 수 있도록 클라이언트에 프로필 ID를 반환하는 것입니다.

클라이언트가 연속적으로 여러 번 호출을 수행하면 오래된 읽기 모델로 인해 프로파일이 한 번이 아닌 두 번 생성됩니다. 우리는 그것을 원하지 않지만 어떻게이 문제를 해결할 수 있습니까?

도메인에 둘 이상의 프로필이 생성되지 않도록하기 위해 사가를 만드는 방법에 대해 생각해 보았습니다. 요청이 동일 할 경우 동일한 프로필 ID를 클라이언트에 반환해야하기 때문에 여전히 문제가 있습니다.

의견이 있으십니까?

답변

2

명령이 결과를 반환하지 않아야합니다.

GUID 인 경우 새 프로파일의 ID를 포함하는 명령을 만들 수 있습니다. 어떤 종류의 시드 된 ID 열을 사용하고 있다면 물론 작동하지 않습니다.

그러나 귀하의 ID는 GUID라고 말하십시오. 그런 다음 명령에서 GUID를 백엔드에 전달할 수 있습니다. 백엔드는 GUID가 이미 존재하지 않는 경우에만 새 프로파일을 작성하며 단일성을 보장합니다.

+0

우리 명령은 실제로 아무것도 반환하지 않습니다. 그렇다면 고객이 API 메소드 대신 새로운 ID를 생성하도록해야한다는 것입니다. 그것은 나쁜 생각이 아닐 수도 있습니다. – TheGuest

+0

그건 정확히 내가 말하는거야. ID가 GUID 인 경우 ID가 어디서 오는지는 중요하지 않으며 고유합니다. 행을 추가 할 때 ID를 얻기 위해 DB를 쿼리 할 필요가 없습니다. –

+0

죄송합니다, 아마도 아직 여기 뭔가 빠졌어 .... 이벤트가 거의 동시에 발생하여 프로필이 읽기 모델에서 발견되지 않으면 도메인의 기존 GUID와 일치하는 두 번째 GUID를 어떻게 생성 할 수 있습니까? ? – swannee

0

CQRS 패턴에서 알 수 있듯이 명령 계층은 어떤 결정을 내리기 위해 읽기 모델을 사용하지 않아야합니다. 명령 계층은 자체 도메인을 기반으로 처리합니다. 그가 모델을 읽지 않았기 때문입니다. 도메인 데이터에는 항상 유효성 검사가 수행됩니다. 프로파일 작성 명령 처리기는 읽기 모델이 아닌 도메인에 프로파일이 사전 존재하는지 확인해야합니다.

-2

맞습니다. 명령은 ReadModel의 일관된 원칙 때문에 ReadModel에 의존하면 안됩니다.

명령을 사용하여 Domain을 사용하여 결정을 내립니다.

일반적으로 CQRS + EventSourcing 리포지토리에는 거의 메서드가 없지만 GetById (Guid id)가 있습니다. 해당 엔티티가 이미 도메인에 있는지 확인하는 데 사용할 수 있습니다.