2012-10-14 5 views
4

지난 6 개월 간의 학습 곡선은 CQRS와 DDD가 주범이었습니다.CQRS 프로젝트에 NServiceBus와 같은 메시징 프레임 워크가 필요합니까?

재미 있었고 우리는 프로젝트를 통해 1/2 길을 달렸고 내가 탐구 할 시간이 없었던 부분은 메시징 프레임 워크입니다.

현재 DTC를 사용하지 않으므로 읽은 모델이 업데이트되지 않은 경우 읽기 및 쓰기 데이터베이스간에 불일치가 발생할 가능성이 매우 높습니다. 또한 내 읽기 및 쓰기 데이터베이스는 동일한 시스템에 있습니다. 나는 우리가 그들을 분리 된 기계에 두지 않을지 의심 스럽다.

내 시스템에는 많은 양의 메시지가 없으므로 시스템의 일관성과 신뢰성에 더 많은 관심이 있습니다.

NServiceBus와 같은 메시징 프레임 워크에 넣어야합니까 (읽기 및 쓰기 데이터베이스가 모두 동일한 시스템에 있더라도) 또는 다른 옵션이 있습니까? 그렇습니다. 학습 곡선이 있지만 사용하지 않으면 배울 점이 많을 것이라고 생각합니다. 이

생각을 필요하지 않은 경우도

, 나는 레이어에 넣어 싶지 않아? 내 읽기 모델이 다음 업데이트되지 않은 경우 내가 사이의 읽기 일관성을 가지고 데이터베이스를 쓰는 것 아주 좋은 것 후드가되도록

답변

6

은 현재 내가 DTC를 사용하지 않습니다.

저는 개인적으로 DTC를 싫어하고 피하려고합니다. 대신 보상 메커니즘을 구현하는 것이 가능합니다. 특히 최종 일관성이 이미 받아 들여지고 업데이트가 멱등 (idempotent) 인 읽기 모델과 같은 경우가 있습니다. 예를 들어 엔티티에 버전을 구현하고 버전이 동기화되도록하는 백그라운드 작업을 가질 수 있습니다. DTC를 사용하면 트랜잭션 재시도 기능이 제공되지만 다시 시도한 후에 오류가 발생하는 경우는 해결되지 않습니다. 오류 로그를보고 오류를 처리해야하는 절차가 있어야합니다.

그래서, 나는 (읽기 및 쓰기 데이터베이스가 동일한 시스템에 있는데도 불구하고 ) NServiceBus 같은 메시징 프레임 워크에 넣어하거나 내가 다른 옵션이 해야합니까?

몇 가지 사항에 따라 다릅니다. CQRS 시스템에서 자주 접하게되는 것은 여러 하위 시스템이 쿼리/캐싱 시스템이 구독하는 이벤트를 게시하는 pub/sub에 대한 필요성입니다. 기본적인 point-to-point 메시징 이상의 pub/sub가 필요하다면 NServiceBus 같은 것을 사용하십시오. 또한 논리적 파티셔닝이 독자적으로 유익하다고 생각하기 때문에 확장 성 목적으로 NServiceBus를 사용하지 않아도 즉시 즉각적으로 부끄러워하지는 않을 것입니다. 반면에, 복잡성의 레이어를 추가하는 것은 비용이 많이 드는 것을 지적하므로, 가능한 가장 단순한 것이 작동하는지 먼저 확인하십시오.

또 다른 질문은 별도의 쿼리 저장소가 필요한지 여부입니다. 모두 가지고있는 기계가 하나 인 경우 왜 귀찮을까요? read-model pattern과 같은 간단한 것을 사용할 수도 있고 CQRS의 많은 이점을 누릴 수 있습니다.

+0

정보를 제공해 주셔서 감사합니다. 읽기 모델 패턴을 살펴 보겠습니다.엔티티의 버전을 언급했는데, 전체 루트 또는 이벤트를 의미합니까? –

5

CQRS 프로젝트에 NServiceBus와 같은 메시징 프레임 워크가 필요합니까?

짧은 대답 : 아니오.

eulerfx에서 언급 한 '읽기 모델 패턴'에 대해 처음 듣는 것은 처음입니다. 그것은 충분히 좋은 이름이지만 조금 더 있습니다 :

'query'부분의 일반적인 개념은 데이터의 비정규 화 된 뷰를 쿼리하는 것입니다. 'read-model pattern'링크에서 읽기 모델을 채우는 데 사용 된 쿼리가 약간의 작업을 수행하고 있음을 알 수 있습니다. 위에서 언급 한 예제에서 필요한 데이터 조작은 복잡하지 않지만 일 경우이 더 복잡해 집니까? 여기서 denomalization이 발생합니다. '명령'부분을 수행 할 때 다음 작업은 데이터를 비정규 화하고 쉽게 읽을 수 있도록 결과를 저장하는 것입니다. 모든 무거운 짐을 싣는 작업은 도메인에서 수행해야합니다.

메시징에 대해 묻는 이유는 여기에 있습니다. 몇 가지 기술은 여기에 있습니다 :

가 가
    이 같은 데이터베이스, 같은 테이블에
  • 비정규 데이터,
  • 이 같은 데이터베이스에서 데이터를 비정규 다른 열,
  • 가 다른 데이터베이스

의 데이터를 비정규 다른 테이블의 그 저장. 어떻게

  • 즉시 일관성 일관성?
  • 결국 일관성

가장 간단한 해결 방법 (빠른 승리)에 대해 도메인으로 데이터를 비정규 화하는 것입니다 다음 도메인을 저장 한 후 저장소를 통해 객체 동일한 데이터 스토어, 동일한 테이블, 다른 열에 즉시 denomarized 된 데이터를 저장합니다. 100 % 일치하면 비정규 화 된 데이터를 즉시 읽을 수 있습니다.

정말로 데이터 전송 프레임 워크에서 제공하는 일부 데이터 운반 객체를 반환하는 간단한 쿼리 레이어를 작성하는 것이 더 간단합니다. .net의 경우는 DataRow/DataTable입니다. 공상을 얻을 절대 이유가 없습니다. 예외는 항상 존재하지만 데이터 컨테이너를 작성할 수 있습니다.

최종 일관성을 유지하려면 대기열 처리 및 관련 처리가 필요합니다. 자신의 솔루션을 롤백하거나 서비스 버스를 선택할 수 있습니다. 그것은 당신에게 달려 있으며, 시간/기술적 인 제약 : BTW

: 나는 여기에 무료 오픈 소스 서비스 버스가 있습니다

모든 의견은 것 환영 받아라. 그러나 오래된 서비스 버스는 (MassTransit/NServiceBus/등) 할 것입니다.

희망이 있습니다.

+0

잘 답변했습니다. 재미있는 프로젝트 (셔틀) - 지금 조사 중입니다. –

+0

비정규 화 된 데이터에 대해 다른 테이블을 사용하는 경우 (두 번째 옵션), 도메인 지속성과 비정규 화 된 데이터가 동일한 트랜잭션에 있다고 말할 수 있습니까? –

+1

@JD : 귀하의 데이터가 얼마나 일관성이 있는지에 달려 있습니다. 100 % 일관성을 유지하는 것이 절대적으로 필요한 경우 (예 : 어카운트 잔고 등) 그렇다면 예; 조회 데이터가 오래 동안 유효하지 않으면 동일한 트랜잭션을 사용할 필요가 없습니다. –

관련 문제