2010-07-13 3 views
3

누구든지 여러 가지 방법으로 쓰기 및 읽기 데이터베이스를 동기화 할 수있는 방향을 알려주십시오.CQRS : 쓰기 및 읽기 데이터베이스 동기화

어떤 다른 기술이 거기 밖으로, 당신은 등, realiability, 성능, 구현 비용의 측면에서, 일반적으로 CQRS에서

+0

DDD와 관련하여 설명 할 수 있습니까? –

+0

죄송합니다! 내 나쁜 ... 나는 거기에 CQRS를 넣어야했다 ... 친구를 언급 주셔서 감사합니다! – Mosh

답변

6

을 각각 평가 어떻게, 쓰기 DB는 대한 전환 데이터를 저장하는 데 사용됩니다 장기 실행 프로세스 (sagas). 읽기 및 쓰기 DB를 동기화하는 경우 (나는 두 가지를 모두 의미한다고 가정합니다), 당신은 잘못된 일을하고있을 것입니다.

서비스가 여러 메시지를 예상하는 장기 실행 프로세스의 경우 모든 메시지가 도착하기 전에 데이터를 임시로 저장하는 방법이 필요합니다. 예를 들어 고객 등록이 있으며, 일 주일간 처리해야하는 관리자의 승인이 필요합니다. 서비스는 승인이 도착하기 전에 고객 정보를 임시로 저장하는 방법이 필요합니다. 여기서 쓰기 DB가이 임시 데이터를 저장하는 데 사용됩니다. 고객이 승인되기 전에는 아직 읽은 DB에 아무 것도 기록되지 않습니다.

승인이 마침내 도착하면 서비스는 쓰기 DB에서 고객 정보를 가져와 등록 프로세스를 완료하고 읽기 DB에 기록합니다. 이 시점에서 쓰기 DB에있는 임시 고객 정보는 작업을 완료하고 쓰기 DB에서 제거 할 수 있습니다. 관련된 양방향 동기화가 없음을주의하십시오.

고객의 성명 변경과 같은 간단한 프로세스를 위해 변경 내용을 즉시 읽기 DB에 기록 할 수 있습니다. 이 경우 임시 데이터가 없으므로 쓰기 DB에 쓰기가 필요하지 않습니다.

1

쿼리 서비스에서 사용하는 데이터베이스 (읽기 전용 저장소)가 이고 데이터베이스가 도메인 이벤트가 저장되는 데이터베이스로 쓰인 것처럼 읽는 경우, 해당 데이터베이스와 동기화해야하는 경우 당신이 할 수있는 특별한 순간은 당신이 저장 한 이벤트를 재생하는 것입니다. 경우 당신이 당신이 CQRS를 사용하는 경우 버전

으로 제한 할 필요가 없습니다 다음 가능한 한 최신 상태로되고 싶어요, 다음 아마 당신은이

public interface IRepository<T> where T : AggregateRoot, new() 
    { 
     void Save(AggregateRoot aggregate, int expectedVersion); 
     T GetById(Guid id); 
     T GetById(Guid id, int version); 
    } 
처럼 약간 보이는 저장소를해야합니다

희망이 도움이 환호

0

쿼리 모델이 일치 할 필요는 없습니다. 결국 일관성이 있어야합니다. 쿼리 모델은 뷰 모델이기도합니다. 즉, 사용자 인터페이스의 요구 사항에 따라 테이블이 이미 조인되어 있습니다. 따라서 메모리 캐시를 사용하거나 Redis를 사용할 수 있습니다.
명령면은 데이터베이스를 업데이트하는 모든 관련 정보를 포함하는 명령 객체와 같습니다. 이 오브젝트는 메시징 큐를 채울 수 있습니다. 명령 개체는 쿼리 캐시와 쓰기 데이터베이스를 트랜잭션 방식으로 업데이트하는 명령 프로세서에 의해 처리됩니다. 쓰기 데이터베이스는 RDBMS 일 수 있지만 분명히 MongoDB와 같이 쓰기 최적화되어야합니다.
메시징 시스템을 통해서도 읽기 데이터베이스를 업데이트 할 수 있습니다.
이 목적을위한 좋은 메시징 시스템으로는 RabbitMQ와 0MQ가 있습니다.