-> 도메인 모델에서 어떤 일이 일어났을 때(상태가 변경) 이를 대표하는 이벤트를 도메인 이벤트라고 하고 다른 도메인에 이를 알고 자신의 상태를 변경할 수 있다.
도메인 이벤트를 전파시키면서 자신의 해야할 일을 하고, 그 이벤트를 받은 서비스가 자체적으로 다른 이벤트를 만들어 가는 것을 이벤트 드리븐(Event Driven) 이라고 말한다.
예를 들어, 회원 가입을 하면 "유저가 가입을 했다"라는 이벤트를 발생시킵니다. 가입 이벤트를 다른 서비스에 전파시킬 수 있습니다. 웹 푸쉬 서비스, 이메일을 보내기 서비스, 친구 추천 서비스 등 전파를 시킬 수 있습니다. 또한, 다른 서비스들 또한 전파를 시킬 수 있다.
도메인 이벤트가 아닌 기존의 방식(메소드 콜)으로 처리하고자 한다고 가정해보자.
이벤트(메시지)를 받을 대상이 추가될 때마다 매번 수정을 해야한다.
예를 든 것처럼, 회원 가입시 join 메소드가 호출되면 웹 푸쉬, 이메일 보내기, 친구 추천 각 서비스 메소드를 모두 호출해야 한다. 만약 새로운 메시지를 받을 대상이 추가된다면 매번 join 메소드 상위 UserSerive를 변경해야 한다.
이벤트버스(EventBus, Messae Broker 동일)을 사용하게 되면 매우 강하게 결합된 연관관계를 느슨하게 만들 수 있다. 즉, microservice로 쪼개어 운영이 가능하다.
1) Event Update Command 발생
2) 해당 서비스 DB update
3) EventBus(Message Broker) 발행(Publish)
4) EventBus(Message Broker)로부터 구독(Subscribe)
Eventual consistency between microservices based on event-driven async communication.
(이벤트 드리븐을 기반으로 모든 마이크로서비스 데이터 일관성 비동기화 처리)
이름 | 구분 방법 | Publish/Subscribe 채널 | 저장 방식 |
---|---|---|---|
kafka | Topic | EventBus | file system(재처리가능) |
guava | Class Type | Message Broker | Queue |
publish, subscribe event 처리시 에러가 나서 취소를 해야하는 경우는 어떡하나요?
정합성이 틀어진 경우? 트랜잭션 처리 체크를 해야 한다.
1) Two Phase Commit
2) SAGA Pattern
order가 잘 완료됬는지? 트랜잭션 완료에 대한 신호.
이벤트 기반으로 분산 트랜잭션 처리를 잘 할 수 있다.
복구 로직을 생각하면서 짜야함.
이 서비스 밖에서 처리.. (배치 처리를 하던가.. 주문자가 취소를 하던가.. 운영자가 취소하던가..) DB상태가 봐뀌었나 이런식으로 체크하는게 아니고, 모든 것을 이벤트 기반으로 한다는 것.