명령이나 이벤트를 사용해야합니까?


14

버스 통신에서 명령과 이벤트의 차이점은 약간 모호한 것 같습니다. 이벤트를 여러 번 처리 할 수 ​​있지만 명령을 한 번만 실행해야한다는 것을 알고 있지만 여전히 명령이나 이벤트를 언제 사용 해야하는지 잘 모르겠습니다.

예를 보자.

새로운 사용자가 웹 애플리케이션에 등록 할 때 계정을 생성하고 확인 이메일을 보내야합니다.

계정 만들기 -이것은 CreateUserCommand버스 로 보내고 특수 구성 요소가 처리 할 수있는 적절한 장소 인 것 같습니다 .

아니면 비동기 버스 통신으로 구현해서는 안됩니까? 우리는 사용자가 즉시 응용 프로그램에 로그인 할 수 있기를 원합니다. 버스를 사용하면 명령 실행시기를 보장 할 수 없습니다.

이메일 보내기 -구성 요소가 계정을 만든 후 두 가지 가능성을 볼 수 있습니다.

  1. 버스에 다른 명령을 보내십시오 SendConfirmationEmailCommand
  2. 이벤트 게시 UserAccountCreatedEvent

그리고 이메일 발신자 구성 요소가 그것을 잡고 작업하게하십시오.

한편으로는 확인 전자 메일을 한 번만 보내고 (명령 사용) 다른 한편으로는 새로 등록한 사용자에게 관심이있는 여러 구성 요소가있을 수 있다고 생각합니다. 로거 또는 SMS 발신자

어떻게 구현하겠습니까?

답변:


16

원칙적으로 명령 은 실행될 요청을 설명하는 반면 이벤트발생한 문제를 설명합니다.

  • 명령을 수행하려면 프로세서에서 일부 작업을 수행해야하며이 작업은이 프로세서에서 한 번만 수행해야합니다.

  • 이벤트는 이미 실행되었거나 외부에서 발생한 일부 작업에 대한 알림입니다. 여러 프로세서 / 에이전트가 이벤트에 대해 알고 싶어 할 수 있습니다. 그들 중 몇몇은 그들의 책임 영역에서이 통보에 필요한 명령이나 행동을 추가로 발행 할 수 있습니다.

귀하의 시나리오에서 나는 다음을 이해합니다.

  • CreateUserCommand 명령이다
  • UserAccountCreatedEventCreateUserCommand계정 관리 서비스에서 성공적으로 완료되면 발행되어야하는 이벤트입니다.

이제 두 가지 가능성이 있습니다.

  1. 계정 관리 서비스 SendConfirmationEmailCommand는이 명령이보다 전문적인 서비스에 의해 실행될 것으로 예상하기 때문에 자체적으로 버스에서 발행됩니다 .
  2. 계정 관리 서비스는 완료시 이벤트 알림을 보내는 것 이상을 수행하지 않으며 다른 서비스 (예 : 통신 서비스, 가입 서비스 등)로 전자 메일 / SMS / 등에 대한 여부에 대한 결정을 내립니다. SendConfirmationEmailCommand일부 게이트웨이에서 수행 할 명령을 실행 하는 데 필요 합니다.

서비스 버스 접근 방식을 선택한 경우 옵션 2를 선호하는 유연성을 사용하는 것이 좋습니다.


고마워요. 옵션 2에 대한 두 가지 질문이 더 있습니다. 1. 계정 관리 서비스는 명령 완료에 대해 어떻게 알 수 있습니까? 계정 관리 서비스의 실제 목적보다 업무가 완료되면 전문 서비스가 게시 한 이벤트를 듣는 것이라 생각합니다. 이벤트를 다시 게시하려면? 중복되는 것 같습니다. 2. 또한 SendConfirmationEmailCommand를 발행 할 사람을 이해하지 못했습니다. 계정 관리 서비스 또는 "다른 서비스"?
Andrzej Gis

1) 계정 관리 서비스가 스스로 작업을 수행하고 성공적으로 완료되면 이벤트를 보냅니다 (예 : 오류가 없음). 그러나 귀하는 옳습니다. 계정 관리 서비스가 자체적으로 지속성 / 데이터베이스 서비스로 명령을 전송하고 작업 완료 이벤트 (예 : 비동기 응답)를 모니터링해야 할 수도 있습니다.
Christophe

@gisek 2) 서비스 버스에서, 당신은 매우 제한된 서비스를 가진 매우 전문화 된 서비스를 가지고 있다고 상상할 것입니다. 이 경우 계정 관리는 작성 만 수행하고 관심이있는 사람에게 완료되었음을 알립니다. 그런 다음 일부 다른 서비스는 대응할 사항을 모니터링합니다. 예를 들어, 비즈니스 규칙을 적용하여 사용자에게 이벤트를 전달할시기와 방법을 결정하는 커뮤니케이션 관리자가있을 수 있습니다. 동일한 서비스에서 1) +2)를 수행하는 경우 서비스 버스가 거의 필요하지 않습니다.
Christophe
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.