ETC
EDA(Event Driven Architecture)
D_Helloper
2023. 6. 14. 22:37
Event Driven Architecture
Event Driven이라는 용어는 programming, architecture와 연결되어 다양한 정의로 표현
💡 EDA (Event-driven architecture)
분산된 시스템 간에 이벤트를 생성, 발행 (publishing)하고 발행된 이벤트를 필요로하는 수신자에게 전송
이벤트를 수신한 수신자가 이벤트를 처리하는 형태의 시스템 아키텍쳐
- Event Driven Pattern - 특정 행동이 자동으로/순서에 따라 발생하는 것이 아닌 어떤 일에 대한 반응으로 동작하는 디자인 패턴
- IO Event - 컴퓨터 회로를 구동시키기 위해 발생하는 일 ( ex) 마우스 클릭, 키보드 타이핑, 모바일 터치 등)
- IoT 기기 등의 센서로부터 유입되는 데이터 스트리밍 기반의 동작
- 시스템 내 외부에 발생한 주목할 만한 상태의 변화에 기반한 동작
EDA의 구성 요소
- Event Generator (Publisher, Producer, Creater)
- 표준화된 형식의 이벤트를 생성
- 생성된 이벤트는 Event Channel로 전송
- Event Channel (Bus)
- Event Generator에서 Event Processing Engine으로 수집된 데이터를 전파하는 메커니즘
- 이벤트를 필요로 하는 시스템까지 발송하는 역할
- Event Processing Engine (Consumer, Processor)
- 수신한 이벤트를 식별/처리하는 역할
- 처리 결과에 따라 새로운 이벤트를 생성할 수 있음
- Consumer는 이벤트의 송신자에 대한 정보를 알 필요가 없음
장점
- Decoupling - 시스템 간의 느슨한 결합이 가능 하므로 분산 시스템, Microservice 환경에서 시스템 간 의존성을 배제 가능
- 시스템은 Event Channel인 Message Broker에 대한 의존성만 가짐
- 다른 시스템의 정보를 알 필요가 없음
- 약속된 Event message를 가지고 상호 정보를 교환
- Micro service 단위로 시스템을 분리하기 쉽기 때문에 확장성, 탄력성을 고려하기 쉬움
단점
- Broker Dependency
- Event를 전송하기 위한 Message Broker에 대한 의존성이 커지기 때문에Message Broker에 문제가 생길 경우, 모든 곳으로 문제가 전파될 수 있음
- Transaction 단위가 격리되기 때문에 서비스에 장애 발생 시 retry/rollback을 고려해야 함
- 시스템 전체 Flow를 파악하기 어려움
- 명확한 Flow를 보기 위해서는 모니터링을 구축하고 이를 확인하여야 함
- 디버깅이 어려울 수 있음
Event Driven MicroService
- MSA가 적용된 시스템에서 이벤트 발생 시 해당 이벤트 로그를 보관하고 이를 기반으로 동작하며, 비동기 통신을 통해 시스템 내 통합을 수행하는 아키텍쳐
이벤트
- IT 영역에서 이벤트는 다양한 정의를 갖지만, 이 곳에서 언급하는 이벤트는 상태의 변경. 즉, 데이터의 생성,변경,삭제(CUD)를 통해 발생하는 서비스의 의미 있는 변화를 뜻함
이벤트 로그를 보관
- 현재의 데이터는 상태 변경의 누적이라는 생각에서 시작
- 상태 변경은 이벤트를 뜻하고 이를 누적하는 행위는 이벤트 로그를 보관하는 것
- EDM 에서 생성된 이벤트는 반드시 보관되어야 함
- 보관된 이벤트는 데이터의 현재 상태를 구성하는 근간이 됨
- 보관된 이벤트를 바탕으로 장애 발생 또는 특정 요구사항에 따라 지정된 시점으로 복원을 수행
- 이벤트 로그를 보관하는 장소를 이벤트 스토어라 칭합니다.
비동기 통신
- AMQP, MQTT, JMS 등 메세징 프로토콜을 통한 메세지 큐 방식이 자주 사용됨
- 서비스에서 데이터의 생성,변경,삭제(CUD)를 통해 이벤트가 발생하면 발행 서비스는 메세지의 형태로 이벤트를 발행하고, 해당 이벤트에 관심이 있는 서비스에서 구독
- 메세지 큐를 사용함으로 requeue/dlq 등의 기능 활용 가능
시스템 내 통합(integration)
이상적으로 구현된 MSA는 서비스 간 데이터 참조를 위한 내부 통신이 필요없지만, 현실적으로 서비스 간 내부 통신이 전혀 없는 시스템을 구현하기란 불가능에 가깝습니다. 다양한 사유로 여러 서비스 간 통신을 통해 연동이 발생합니다.
이벤트를 데이터의 생성, 변경, 삭제로 정의했기 때문에 MSA의 데이터 관리와 밀접한 연관성을 가짐
데이터는 현재의 상태를 나타내고 이는 보관된 데이터 변경, 생성, 삭제 기록 즉, 이벤트 로그에 기반
동작 원리
- 특정 서비스에서 기능을 수행
- 이벤트가 발생(데이터의 생성,변경,삭제)하면 해당 도메인 객체를 기반으로 이벤트 생성
- 생성된 이벤트는 저장 공간에 보관되고 비동기 메세지 큐로 해당 이벤트에 관심이 있는 서비스들에게 전달
- 이벤트를 구독한 서비스는 biz. logic을 수행
- 수행 도중 오류가 발생하면 저장된 이벤트 로그를 기반으로 retry/rollback을 수행
서비스 별 각자 데이터베이스를 적용한 시스템에서 데이터의 무결성을 보장할 수 없지만 EDM을 통해 데이터의 최종적인 일관성을 유지할 수는 있음