1

저는 개발자가 도메인 기반 디자인에서 응용 프로그램을 설계/설계하는 많은 공통적 인 방법을 연구했습니다 (여전히 개념 전체를 이해하려고 노력하고 있음). 내가 본 몇 가지 예제에는 이벤트 수집기를 통한 이벤트 사용이 포함되어 있습니다. 필자는 응용 프로그램의 다른 요소/도메인이 실제로 분리되어 있기 때문에 개념이 마음에 들었습니다.롤백으로 이벤트 수집기 오류 처리

내가 가진 걱정은 다음과 같습니다. 오류가 발생했을 때 어떻게 작업을 롤백합니까? 예를 들어

:

내가 데이터베이스에 주문을 저장하고 또한 CMS에 PDF로 순서의 복사본을 저장하는 주문 응용 프로그램을 말한다. 응용 프로그램은 새 주문이 만들어지고이 이벤트를 구독하는 pdf 서비스에서 pdf를 저장하는 이벤트를 시작합니다. 한편 주문 변경 사항을 데이터베이스에 적용하면 예외가 발생합니다. 문제는 pdf가 저장되었지만 일치하는 데이터베이스 레코드가 아닌 것입니다.

이전에 처리 한 이벤트를 캐시하고 "실행 취소"작업을 캐시에서 찾는 새로운 오류 이벤트를 발생시켜야합니까? 이것을 위해 명령 패턴과 같은 것을 사용 하시겠습니까?

또는 이벤트 수집기가이 패턴에 적합하지 않습니다.

나는 어쩌면 이벤트는 이메일 및 로깅 덜 "미션 크리티컬"항목에 사용되어야한다고 생각하기 시작하고

편집.

초기 생각은 이벤트 수집기 패턴을 사용하여 종속성을 제한하는 것이 었습니다.

+0

메모리 내 이벤트도 사용할 수 있습니다. Udi Dahan Domain Events Salvation을 살펴보십시오. – JefClaes

답변

2

데이터베이스의 조작과 동일한 트랜잭션으로 이벤트를 확약하려고합니다.

이 특정 시나리오에서는 트랜잭션이 증가하는 큐에서 이벤트를 밀어 넣을 수 있습니다. 따라서 집계가 지속되지 않으면 이벤트가 절대로 나가지 않습니다. 이렇게하면 궁극적으로 PDF를 만들 수 있습니다. PDF 작성에 실패하면 문제점을 수정하고 자동으로 재 시도하십시오.

아마 내 이전 게시물 중 하나에서 더 많은 영감을 얻을 수 eventual consistent domain events with RavenDB and IronMQ.

2

실제로 발생 (커밋)되기 전에 이벤트를 처리하는 것은 이벤트 처리기가 트랜잭션에 참여하는 경우에만 작동합니다. 이벤트 처리기를 트랜잭션 (예 : PDF를 데이터베이스에 저장)으로 만들거나 트랜잭션을 커밋 한 후에 이벤트를 게시하고 처리하십시오.

+0

PDF 파일을 데이터베이스에 저장하는 방법에 대한 요령을 참조하십시오. 그러나 PDF 생성이 실패 할 경우 레코드 생성 후 이벤트 발생과 함께 두 번째 문제가 발생합니다. – Chris

+0

@Chris 2pc-commit 데이터베이스와 CMS를 원자 적으로 저장해야하지만, 필자는 필요성을 의심한다. – Hippoom

+0

@Chris 같은 문제가 아닙니다. PDF 작성 중 오류는 오류이지만 존재하지 않는 주문에 대해 PDF를 작성하면 불일치가 발생합니다. 이벤트 핸들러가 실패 할 수 있습니다 - 문제를 해결하고 이벤트를 다시 처리하십시오. –