2

dddd를 사용하여 이벤트 소스 시스템을 구현하려고합니다. 현재 나는 어떻게 내 이벤트가 경계 상황의 경계를 넘나들고 있는지 고심하고있다. 바운드 컨텍스트 내부 및 외부 이벤트 소싱

  • 물류 시스템
  • 제품 관리는 제품에 대한 모든 지식을 가지고

    1. 제품 관리 :

      두 경계 상황이 상상. 단순화를 위해 그것은 단지 "이름"입니다. 물류 시스템에도 제품이 있지만 메타 데이터에 대한 지식이 없습니다. 그 (것)들을 위해 ID를 가진 주로 육체적 인 상자이다. 그러나 누군가이 제품을 검색 할 때 이름을 표시하려고합니다. 따라서 ProductManagement BC는 제품이 등록되고 이름이 변경되었음을 Logistics BC에 알려야합니다. 그래서 ProductAggregate 내부에서 제기 ProductManagement의 이벤트로 끝날 것이다 :

      ProductManagement.Events.ProductRegistered 
      ProductManagement.Events.ProductNameChanged 
      

      내가 도착했을 때 제대로이 내가 이벤트 저장소에 저장됩니다 이벤트가 있습니다. 그리고 이들은 또한 메시지 버스에 게시 될 이벤트들입니다. 그래서 물류 측면에서 나는이 이벤트들을 구독 할 것입니다. 여태까지는 그런대로 잘됐다.

      문제는 다음과 같습니다. 물류 측면에서이 행사를 어떻게 처리합니까? 본 버논 (Vaughn Vernon)은 애플리케이션 레이어에있는 이벤트 핸들러를 사용하는 것이 가장 좋으며, 기본적으로 애플리케이션 서비스가 될 것이라고 말했다. 그는 또한 하나 또는 여러 명령으로 변환하는 것이 가장 좋을 것이라고 말했다. 접수 된 모든 이벤트를 다시 물류 측면에 저장합니까? 명령도 저장합니까? 문제가 발생하면 현재 상태를 어떻게 재현 할 수 있습니까? 또는 수신 경계가있는 컨텍스트에서의 처리 오류가 아니라 오히려 잘못된 이벤트임을 어떻게 알 수 있습니까? 변형 된 명령이 거부되면 어떻게합니까?

      물류 측면의 집계에서 계산이나 변경이 없음을 알고 있습니다. 그러나 이것이 내 질문에 대해서는별로 중요하지 않다고 생각합니다.

    답변

    1

    여기에 몇 가지가 있습니다.

    먼저 이름 변경에 대해 Logistics BC를 가져올 필요가 없습니다. 필요한 경우 클라이언트로부터이 정보를 PM BC에서 얻을 수 있습니다. 이는 일반적으로 일종의 복합 UI로 수행됩니다. UI 구성은 클라이언트 또는 (웹) 서버에서 수행 할 수 있습니다. Mauro Servienti가 The secret of better UI composition이라는 기사를 확인하여이를 설명하고 싶을 수 있습니다.

    그러나 일반적으로

    , 이것은 일반적으로 다음과 같이 작동이 생길 것입니다

    domain event -> pub/sub -> message consumer -> command -> domain command handler

    따라서는,

    1. 당신은 오후 BC
    2. 에서, 버스에 도메인 이벤트를 게시 물류의이 이벤트에 대한 이벤트 처리기
    3. 이벤트 처리기에서 몇 가지 검사를 수행하고 RegisterProduct 같은 BC
    4. 에 대한 명령은 명령이 정상적으로 처리되고 새로운 Product 집계는 물류
    그것은 이벤트 소스 시스템에 있지만 여러 서비스와 모든 시스템에서뿐만 아니라 다음과 같이 작동

    사용하여 이벤트에 생성됩니다 - 구동 아키텍처.

    0

    귀하가 기술 한 사용 사례의 경우 물류 시스템에서 사용할 제품의 일부 속성 만 있으면됩니다. 그 때문에 물류 시스템은 설명하는 이벤트에 가입하여 필요한 제품 정보의 로컬 캐시를 유지할 수 있습니다. 이는 간단한 메모리 캐시 일 수 있습니다. 그들은 당신이 읽은 모델을 다루는 동안 명령이나 다른 것으로 변환 할 필요가 없습니다. 관점. 간단한 이벤트 처리기에서 이벤트를 처리하고 어딘가에있는 상태를 업데이트하도록하십시오. 이벤트를 읽을 필요가 없습니다. 물류 시스템에 제품 이름이 필요하면 로컬 캐시에서 가져옵니다. 제품 관리가 여전히 진실의 원천이므로 두 상황의 자율성을 깨뜨리지 않았습니다.

    상태를 다시 작성해야하는 경우 캐시를 지우고 처리기를 통해 모든 이벤트를 재생할 수 있습니다. 그러나 제품 관리 컨텍스트가 이러한 이벤트를 소유한다는 것을 기억하십시오. 물류 컨텍스트가 아닌 물류 컨텍스트에만 저장해야합니다. 상태를 다시 작성하려는 경우 다시 게시 할 방법이 필요합니다.

    그런데이 블로그 게시물 시리즈 이 정확한 사용 사례를 설명

    당신은 이름이 제품의 관리 상황과 다른에서 가져 UI 구성의 일종을 할 수있는 대안으로

    (내가 올바르게 기억 5 부에서)

    https://www.tigerteam.dk/2014/micro-services-its-not-only-the-size-that-matters-its-also-how-you-use-them-part-1/

    Logistics 컨텍스트의 세부 정보 (디스크 위의 블로그 게시물에 나와 있습니다)

    0

    [...] 그는 또한 하나 또는 여러 명령으로 변환하는 것이 가장 좋을 것이라고 말했습니다. 접수 된 모든 이벤트를 다시 물류 측면에 저장합니까? 명령도 저장합니까?

    먼저 도메인 전문가에게 해당 이벤트로 인해 LS 컨텍스트에 영향을주는 부작용이 발생할 것인지 묻습니다. 이 경우에만이 이벤트에 가입하고 관련 명령을 LS Aggregate로 보내야합니다.이 명령은 상태를 변경 및 확정합니다. 또는 이벤트 집계를 선택하면이 이벤트도 발생합니다.

    무엇이 잘못되었을 때 현재 상태를 재현 할 수 있습니까? 아니면 수신 경계 된 컨텍스트에서 처리의 잘못이 아니라 오히려 잘못된 이벤트임을 어떻게 알 수 있습니까? 변형 된 명령이 거부되면 어떻게합니까?

    이벤트는 발생한 일의 표현이므로 "잘못"될 수 없습니다. 어쨌든 이벤트에 의해 트리거 된 명령은 실패 할 수 있습니다. 어떤 유형의 실패에 대해 이야기하고 있습니까? 기술 또는 도메인 별? 첫 번째 경우에는 소스 이벤트가 향후 재시도 (어쩌면 버그 수정 후)를 위해 버스에 남아있을 것입니다. 두 번째 경우, PM 집계에 결과에 대한 정보가 필요하면 LS 집계가 PM 집계에 의해 처리되는 적절한 이벤트를 방출해야합니다.