2013-05-17 1 views
3

일반적으로 CQRS 패러다임에 대한 일반적인 질문이 있습니다.CQRS에서 쿼리 측 데이터 동기화 - 아직 충돌이 발생하지 않습니까?

CommandBus와 EventBus는 쿼리 모델 데이터 스토어에서 도메인 모델을 분리하고 최종 일관성의 장점을 제공하며 쿼리 측면의 저장소를 비정규 화하여 읽기 등을 최적화한다는 것을 알고 있습니다. .

그러나 업데이트를 수행하기 위해 서로 경쟁하기 시작하지 않는다면 Query 데이터 스토어를 업데이트하는 책임이있는 쿼리 측면에서 구성 요소의 수를 확장하기 시작합니다.

즉, 우리가 EventBus에 대해 pub/sub 모델을 사용하려고 시도하고 특정 이벤트 유형에 대해 많은 다른 가입자가있는 경우 다양한 비트를 업데이트 할 때 서로 경쟁 할 수 없었습니다 비정규 화 된 데이터? 이것이 우리가 CQRS 이전과 같은 배에 우리를 두지 않았을까요?

내가 들었던 것처럼 CQRS가이 논쟁을 모두 모면하기로되어있는 것처럼 들리지만 이것이 이상적이며 사실 우리는 실제로 그것을 최소화하고 있습니다. 나는 뭔가를 여기에서 놓칠 수있는 것처럼 느낀다. 그러나 그것에 나의 손가락을 댈 수 없다.

답변

10

인프라 구조를 어떻게 설계했는지에 따라 다릅니다. 엄밀히 말하자면 CQRS 자체는 쿼리 모델이 어떻게 업데이트되는지에 대해서는 말하지 않습니다. 이벤트 사용은 사용자가 가지고있는 옵션 중 하나 일뿐입니다. CQRS는 논쟁을 다루는 것에 관해서도 아무 말도하지 않습니다. 이것은 동시성 같은 것을 처리 할 수있는 더 많은 옵션과 선택을 제공하는 아키텍처 패턴 일뿐입니다. 계층화 된 아키텍처와 같은 "일반"아키텍처에서는 이러한 옵션이 전혀없는 경우가 많습니다.

명령 처리 구성 요소를 여러 시스템으로 확장 한 경우 단일 이벤트 처리 구성 요소가 처리 할 수있는 것보다 많은 이벤트를 생성 할 수 있다고 가정 할 수 있습니다. 그건 나쁜 일이 아니야. 이는 쿼리 모델이 피크 시간 동안 약간 더 큰 지연으로 업데이트된다는 것을 의미 할 수 있습니다. 인 경우 쿼리 모델 확장을 고려해야합니다.

이벤트 처리기 구성 요소 자체는 서로 경합하지 않습니다. 이들은 안전하게 이벤트를 병렬로 처리 할 수 ​​있습니다. 그러나 모두 동일한 데이터 저장소를 업데이트하도록 시스템을 설계하면 데이터 저장소에 병목 현상이 발생할 수 있습니다. 클러스터를 설정하거나 다른 데이터 소스로 쿼리 모델을 나누면 문제의 해결책이 될 수 있습니다.

조숙하게 최적화하지 않도록주의하십시오. 특정 경우에 도움이된다는 것을 증명할 때까지 수평 확장하지 마십시오. CQRS 기반 아키텍처를 사용하면 많은 선택을 할 수 있습니다. 당신이해야 할 일은 적절한시기에 올바른 선택을하는 것입니다.

지금까지 응용 프로그램에서 필자는 쿼리 모델이 병목 현상이있는 상황을 직접 경험하지 못했습니다. 이러한 응용 프로그램 중 일부는 하루에 100ml 이상의 이벤트를 생성합니다.

+0

"Axiom"대신 질문에 "Axon"태그를 추가 하시겠습니까? – Allard

+0

mistag를 지적 해 주셔서 감사합니다. 자동 완성에주의를 기울이지 않았습니다. – cwash

+0

답변을 주셔서 감사합니다! – cwash

관련 문제