2016-06-30 8 views
2

CQRS + ES 설계 응용 프로그램이 있습니다. CQRS + ES 세계는 작년에이 책을 읽었으며 완벽하게 이해할 수 있지만 완벽한 감각을 구현하는 것은 쉽지 않습니다.CQRS의 단일 프로세스에 대한 여러 명령

어쨌든 내 질문이나 질문은 다음과 같습니다

다중 명령 (단계) 과정을 포함하는 가장 좋은 방법은 무엇입니까? 시작하고이 중지 그들은 더 보면 내가 사가의 살펴 보았다

  • 을 SendEmailAddressVerificationCommand

    1. CreateUserProfileCommand
    2. CreatePaymentAccountCommand을 : 즉이 내가 그 과정에서 해고하고자하는 명령입니다 사용자를 등록 모든 연속적인 과정.

      물론 이벤트 단계를 연결하는 것은 악몽을 재생할 수 있습니다.

      UPDATE @EbenRoux
      CreatePaymentAccount 실제로 UpdateUserWithPpaymentAccount 이름을 지정해야합니다 정보를 추가합니다. 명명에 혼란이 따른다. 이 명령이 제 3자를 실제로 얻고 사용자에게 접속하게되는 PaymentCustomerId를 얻는 것.

      나는 사가 (Saga)에 대해 당신이 말하는 것을 얻었고 나는이 과정이 그것을 필요로하는지 궁금해했다.

      지금 당장이 응용 프로그램이 진행 중이므로 모든 비즈니스 컨텍스트 (BC에서 가정 한 내용 임)가 하나의 종단점/하위 관점을 갖지 않습니다. 나는 거기에 도착하고 싶습니다.

    답변

    2

    명령이 재생되지 않습니다. 내 이해의이 단계에서 나는 시스템/도메인 메시지가 이벤트 소싱 (ES)에서 사용 된 이벤트와 다른 것으로 간주한다. ES 이벤트는 상태를 나타냅니다. 그들은 어떤 처리에도 관여해서는 안됩니다. 명령이 실행되거나 어떤 식 으로든 명령이 실행되도록하지는 않습니다. 그것들은 단순히 도메인 모델의 상태를 유지하는 또 다른 방법 일뿐입니다.

    시스템 메시징을 조정하고 상태가 확실히 또한 사용하여 저장 될 수있다 (때로는 사가이라고 무엇을) 귀하의 프로세스 관리자 다른 프로세스를 경계로 컨텍스트 (BC)에서 일류 시민이 될 것입니다 ES.

    다른 소스에서 다른 엔드 포인트로 동일한 메시지 (원하는 경우)를 라우트 할 수 있습니다. 예를 들어, 프런트 엔드/통합 계층에서 CreatUserProfileCommand을 보낼 수 있으며 라우팅에서이를 처리기 BC로 보내면 처리기에서 새 UserRegistrationProcess을 만들고 스트림을 저장 한 다음 User BC로 라우팅되는 CreateUserProfileCommand을 보냅니다. User 기원전 UserProfileCreatedEvent에서

    은 프로세스 BC이 (가) 구독 것을 발표하고 UserRegistrationProcess 스트림이 저장, 업데이트되며, CreatePaymentAccountCommandPayment BC에 퇴장. 다음은 사물의 ES 측면에서 생산되는 것과 다소 다른 구조를 갖는 시스템 메시지 (이벤트)의 예입니다.

    Payment BC에서 PaymentAccountCreatedEvent도 게시되며이 BC는 BC 프로세스에서 구독하고 SendEMailAddressVerificationCommand은 관련 BC로 전송됩니다.

    아주 일반적인 패턴이 나타납니다.

    따라서 관심사가 명확하게 구분되어 있기 때문에 재생 악몽을 피할 수 있습니다.

    +0

    을 일반적으로 명령은 사용자 또는 내부적으로 약간의 "트리거"시스템에서, 즉 의해 생성되는 BC가 비즈니스 컨텍스트를 의미한다고 가정합니다. 나는 UR이 말하는 것을 얻었습니다, 이것은 새로운 프로젝트입니다. 그래서 저는 Saga에 익숙해지고 끝점과 구독자를 설정했습니다. 더 많은 정보를 담은 나의 질문을 업데이트하려고합니다. – ChampChris

    +0

    BC는 Bounded Context입니다. 제 나쁜 것 같습니다. --- 실제로, 실제베이스 시스템이나 제 3 자 통합을 "종결"하는 엔드 포인트를 갖는 것이 도움이됩니다. 이러한 "정면"종단점은 다른 "기본"종말점에 대해 결코 알거나 상호 작용해서는 안됩니다. 이는 프로세스 엔드 포인트의 책임입니다. 프로세스 엔드 포인트는 모든 상호 작용 및 조정을 담당합니다.어쨌든 *** 오케스트레이션 *** (내가 선호하는 것)에 해당합니다. *** 안무 시스템 ***에서는 일들이 다르게 보일지 모르지만 안무로 인해 실수로 복잡 해지는 것을 막을 수 있다고 생각합니다. –

    0

    이것은 하나의 유스 케이스입니까? I. 사용자 프로필 만들기?

    하나의 명령, CreateUserProfile이 유스 케이스를 조정하는 명령 처리기로 처리되는 이유가 궁금합니다. 다른 모든 것은 사건이 될 것입니다. PaymentAccountCreated, EmailNotificationSent 등 ...

    필요한 경우이 명령을 사용하여 프로세스 관리자를 시작할 수 있지만 처리해야 할 다른 항목과 외부 호출이 반환되는 방법에 따라 다릅니다. 즉 단순한 요청/응답이거나 외부 시스템에서 API 등을 호출합니다.

    1

    이벤트는 실제 상황에서 작동하는 것과 같은 악몽이 아닙니다. 당신이 답장을 기다리지 않고 편지를 보내면 평생을 계속하고 답장이 있으면 편지를 집어 읽고 읽으십시오.

    실제로 사가를 사용할 수 있습니다.

    1. 가 등록 사가는
    2. 은 "PaymentAccountCreatedEvent"에 가입하십시오 을 UserProfileCreatedStarted 새 이벤트를 게시하고 지불에게 서비스를 해당 이벤트
    3. 듣는 CreateUserProfileCommand와 무용담을 시작 게시 등록 절차가 완료되면 사용자 프로필 명령을 작성하십시오.
    4. "UserProfileCommandCreated"을 게시하고 무용담을 완료하고
    5. 는 통신 서비스가있는 에 가입을 UserProfileCommandCreated 및 이메일

    보내기 예를 살펴 유무 : 당신이 원하는 것들의 Saga implementation patterns – variations

    하나 피하기 위해 서비스 사이의 커플 링, 그리고 바로 그 때 도메인에서 많은 명령을 사용하면 어떻게됩니까. ChargeMontlyInstallment 이벤트 소싱에 관해서는

    이, 당신에 대한 모든 새로운이기 때문에 여기에서 찾아 보게한다 : 나는 best event sourcing db strategy