나는 기본적으로 CQRS 의 개념 과 관련 개념에 대해 머리를 감싸려고합니다 .
CQRS가 메시징과 이벤트 소싱을 반드시 통합 할 필요는 없지만, 이러한 개념을 결합한 많은 예제 / 블로그 게시물에서 볼 수 있듯이 좋은 조합으로 보입니다.
무언가에 대한 상태 변경에 대한 유스 케이스가 주어지면 (SO에 대한 질문을 업데이트하는 것과 같이) 다음 흐름이 올바른 것으로 간주합니까 (모범 사례에서와 같이)?
시스템은 질문 집계 루트를 대상으로하는 UpdateQuestion 및 사용자 집계 루트를 대상으로하는 UpdateUserAction (작은 포인트 등)과 같은 두 개의 작은 명령으로 분리 될 수있는 집계 UpdateQuestionCommand를 실행합니다. 이들은 지점 간 메시징을 사용하여 비동기식으로 전송됩니다.
집합 루트는 자신의 일을하고 모든 것이 잘 진행되면 이벤트 이벤트 UpdateUpdate 및 UserActionUpdated가 발생합니다. 이벤트 업데이트에 아웃소싱 된 상태가 포함되어 있습니다.
이 이벤트는 또한 방송을 위해 펍 / 서브 대기열에 놓입니다. 모든 구독자 (읽기 뷰를 생성하는 하나 이상의 프로젝터가있을 수 있음)는이 이벤트를 자유롭게 구독 할 수 있습니다.
일반적인 질문 : 실제로는 명령이 지점 간 (즉 : 수신자가 알려져 있음)으로 전달되는 반면 이벤트는 브로드 캐스팅되는 것이 가장 좋습니다 (즉 : 수신자는 알려지지 않음)?
위와 같이 가정하면, 명령이 지점 간이 아닌 pub / sub를 통해 브로드 캐스트되도록하는 장점과 단점은 무엇입니까?
예를 들어, Saga를 사용하는 동안 명령을 브로드 캐스팅 하는 것이 문제가 될 수 있습니다. saga가 시작하는 데 참여하는 집계 루트를 모르기 때문에 집계 루트 중 하나가 실패 할 경우 Saga가 수행해야하는 중개 역할이 방해 받기 때문에 .
반면에, 방송 명령이 허용 될 때 장점 (유연성)이 보입니다.