2017-11-10 5 views
3

DDD 서술에서 반환 도메인 이벤트 패턴은 도메인 이벤트를 관리하는 방법으로 설명됩니다. 개념적으로 집계 루트는 도메인 이벤트의 목록을 유지하며 도메인 이벤트의 일부 작업을 수행 할 때 채워집니다.DDD - "도메인 이벤트 반환"패턴의 트랜잭션을 처리하는 방법은 무엇입니까?

집계 루트에 대한 작업이 완료되면 응용 프로그램 서비스 계층에서 DB 트랜잭션이 완료된 다음 응용 프로그램 서비스가 도메인 이벤트를 반복하고 이벤트 디스패처를 호출하여 해당 메시지를 처리합니다.

제 질문은 지금 거래를 처리하는 방식에 관한 것입니다. 이벤트 발송자가 처리하는 각 이벤트에 대해 새 트랜잭션을 관리해야합니까? 또는 응용 프로그램 서비스가 도메인 이벤트 디스패처를 호출하는 도메인 이벤트 반복 내에서 트랜잭션을 관리해야합니까? Dispatcher가 RabbitMQ와 같은 인프라 메카니즘을 사용할 때는 문제가 발생하지 않지만 도메인 이벤트가 진행중인 경우 처리됩니다.

내 질문과 관련된 하위 질문. ORM 훅 (예 : IPostInsertEventListener, IPostDeleteEventListener, IPiberUpdateEventListener from NHibernate)을 사용하여 집계 루트에서 도메인 이벤트 반복을 실행하는 방법에 대한 귀하의 의견은 응용 프로그램 서비스에서 수동으로 수행하는 대신 무엇입니까? 너무 많은 커플 링을 추가합니까? 각 사용 사례 (집계에 도메인 이벤트가 반복되고 디스패처 내에 있지 않은 경우 새 트랜잭션 생성이 될 수 있음)마다 동일한 코드가 작성되지 않아도되기 때문에 더 좋습니다.

+0

당신은 https://blog.jayway.com/2013/06/20/dont-publish-domain-events-return-them/을 언급하고 있습니까? – guillaume31

답변

2

제 질문은 지금 거래를 처리하는 방식에 관한 것입니다. 이벤트 발송자가 처리하는 각 이벤트에 대해 새 트랜잭션을 관리해야합니까? 또는 응용 프로그램 서비스가 도메인 이벤트 디스패처를 호출하는 도메인 이벤트 반복 내에서 트랜잭션을 관리해야합니까?

여기서 묻는 것은이 질문에 대한 전문화 된 버전입니다. 단일 트랜잭션에서 둘 이상의 집계를 업데이트해야합니까?

답변이 "아니오"라는 주장을 많이 볼 수 있습니다. 예를 들어, Vaughn Vernon (2014)

적절하게 고안된 집계는 비즈니스에서 불규칙성이 단일 트랜잭션 내에서 완전히 일치하도록 요구되는 방식으로 수정할 수있는 집계입니다. 그리고 올바르게 설계된 바운드 컨텍스트는 모든 경우에 트랜잭션 당 하나의 집계 인스턴스 만 수정합니다.

그렉 영은이 규칙을 준수하면 집계 ID별로 데이터를 분할 할 수 있다는 점을 지적합니다. 즉, 집계 경계는 데이터를 구성하는 방법을 명시 적으로 표현한 것입니다.

따라서 가장 복잡한 방법은 각 집계가 자체 트랜잭션에서 업데이트되도록보다 복잡한 오케스트레이션을 조정하는 것입니다.

내 질문은 초기 트랜잭션이 완료된 후 초기 집계가 변경된 후 전송 된 이벤트 트랜잭션을 처리하는 방식과 관련이 있습니다. 도메인 이벤트를 처리해야하며 해당 프로세스에서 다른 집계를 변경해야 할 수 있습니다. 우리가 다른 집계를 변경하는거야 그래서 경우

오른쪽, 다음 (위의 조언에 따라) 집계에 변화를위한 새로운 트랜잭션이 있어야합니다.즉, 다른 트랜잭션이 필요한지 여부를 결정하는 것이 도메인 이벤트의 라우팅이 아닙니다. 이벤트 처리기를 선택하면 다른 트랜잭션이 필요한지 여부가 결정됩니다.

+1

여기서 거래 당 하나 이상의 집계를 수정하는 것에 대해 왜 설명하고 있는지 잘 모르겠습니다. 내 질문은 초기 트랜잭션이 완료된 후 초기 집계가 변경된 후에 보낸 이벤트 트랜잭션을 처리하는 방식과 관련됩니다. 도메인 이벤트를 처리해야하며 해당 프로세스에서 다른 집계를 변경해야 할 수 있습니다. 다른 바운드 컨텍스트에서 처리되는 도메인 이벤트를 보낼 때 메시징 시스템을 사용하면 다른 프로세스에서 새 트랜잭션을 강제 실행하지만 도메인 이벤트가 메시징 시스템없이 동일한 제한된 컨텍스트 내에서 처리 될 때 그렇지 않습니다. –

2

이벤트 처리가 진행중인 경우에도 원래 응용 프로그램 서비스가 이벤트의 결과로 발생하는 모든 트랜잭션을 조정해야한다는 것을 의미하지는 않습니다.

예를 들어 Observable 패턴을 통해 프로세스 내 이벤트 처리를 수행하는 경우 각 Observer는 필요할 경우 자체 트랜잭션을 생성해야합니다.

ORM 후크를 사용하는 방법에 대한 당신의 의견은 (즉 : IPostInsertEventListener, IPostDeleteEventListener, NHibernate에의 IPostUpdateEventListener)가 응용 프로그램 서비스에서 그 일을 수동으로 집계 루트 도메인 이벤트 반복에서 킥 대신 할 무엇

?

원래 DB 트랜잭션 중에 발생하지 않아도 모든 것을 사실상 일관성있게 처리합니다 (처리 중에 이벤트가 처리되는 경우)?

+0

질문을 이해할 수 없습니까? NHibernate를 사용하면 트랜잭션이 완료되면 "통지"를받을 수 있으며, IPostInsertEventListener, IPostDeleteEventListener, IPostUpdateEventListener 인터페이스를 구현할 수 있습니다. 이것이 제가 후크라고 부르는 것입니다. 하나의 옵션은 해당 후크를 사용하여 이벤트 발송을 개시하는 것입니다. 다른 옵션은 ORM 훅에 의존하지 않고 트랜잭션을 닫고 처리 한 후 순차적으로 서비스에서 이벤트를 시작하는 것입니다. –

+0

또한, 핸들러 내부에 새 트랜 션 션을 걸기에 동의합니다. 이런 식으로 하루 동안 전체 메시징 시스템 (out-of-process)이 도메인 이벤트에 사용되면 처리기가 이미 이벤트 처리를 올바르게 관리 할 준비가됩니다. –

+0

아, 트랜잭션이 완료되기 전에 Post ... 후크가 트리거되어 SQL 명령과 최종 커밋간에 몰래 들어가도록했습니다. 내 잘못이야. – guillaume31