Event Driven Architecture
Event Driven Architecture
이벤트(Event) : 컴퓨터 회로를 구동시키기 위해 발생하는 일 , 시스템 내, 외부에서 주목할 만한 상태의 변화
Event Driven Architecture ( EDA ) : 이벤트를 기반으로 하는 아키텍쳐 설계 방식
등장 배경
EDA 가 등장한 배경에는 마이크로서비스 아키텍처(MSA)로 적용된 시스템의 단점을 보완하고 대책을 마련하기 위함이다.
마이크로서비스 아키텍처는 독립적으로 배포 및 확장 될 수 있는 서비스(Loosely Coupled)들을 조합하여 하나의 애플리케이션을 완성하는 아키텍처이다.
마이크로서비스를 적용하면 빠른 배포 주기와 장애 확산 차단, 대용량 분산환경 시스템 구축, 폴리그랏 프로그래밍 적용 등의 장점을 얻을 수 있으며, 현재 빠르게 Enterprise IT시장을 잠식해 나가고 있는 핫한 아키텍처라 할 수 있다.
마이크로서비스 아키텍처를 통해 분해된 서비스는 경량화 기반 민첩성/유연성을 보장하고, 확장성을 제공하며, 장애 탄력성을 통한 복구전략을 수립하는 등 많은 주목을 받고있다.
다만 마이크로서비스 아키텍처는 많은 요소에서 문제점이 나타나고 있다.
세분화 된 서비스는 가볍고 빠르고 민첩하지만, 장애 추적 포인트가 분산되고, 장애 분석에 소요되는 시간이 늘어나게 됐다. 기술요소의 어려움은 둘째치고, 장애가 발생한 위치를 찾아내는 것 부터 어려움이 있으며, 찾아 내더라도 세분화된 서비스 간 트랜잭션의 관계를 분석하고, 원인을 찾아 내야 하는 요소들이 너무나 많다보니 어려움을 겪을 수 있다.
그리고 3Tier 아키텍처에 비해 다양한 기술 요소의 확장을 통해 편의성과 민첩성을 제공하지만 , 이는 숙련되지 않은 사람이라면 다루기 힘든 부분이다.
*Client Tier : 사용자 인터페이스를 지원 , 웹 서버를 뜻함 ( HTML , JavaScript , CSS) / Front-End
*Application Tier : 비즈니스 로직 계층 , 어플리케이션 서버를 뜻함 (Java EE , PHP ) / Back-End
*Data Tier : 데이터 계층 , 데이터베이스를 뜻함 (MySQL , Oracle ) / Back-End
또한 마이크로서비스 아키텍처는 Loosley Coupled 라는 분산 트랜잭션 관리에 대한 엄격한 원칙이 존재한다.
Loosley Coupled 란 , 각 서비스간 결합을 최소화 또는 없애는 방법을 찾는 것이다.
이를 위해서 기술의 어려움도 존재하고 , DB 분리에 들어가는 비용, 시간 등 많은 노력이 필요하다.
그렇다면 이를 해결하기 위해 나타난 EDA(Event Driven Architecture) 는 무엇인가 ?
EDA
EDA는 복잡성과 역동성에 가장 효율적으로 대응할 수 있는 모델로 평가된다. 시시각각 발생하는 이벤트의 생성과 감지, 반응을 중심으로 구축되는 디자인 유형이기 때문이다. 실제로 EDA에선 고정된 구조가 없다. 심지어 구조 자체가 없을 때도 있다. 이벤트 발생으로 데이터와 데이터가 느슨하게 연결되며(coupling) 없던 구조가 생겨나기도 한다.
알기 쉽게 , 프로그램이 어떤 유저액션(이벤트)에 대한 반응으로 동작하는 패턴이라고 생각할 수 있다.
예를 들어 , 공연을 예매하고자 하는 경우
고객 A : K-1 좌석 결제요청 -> 예매 가능한 좌석인지 확인 -> 결제
고객 B : K-1 좌석 결제요청 -> 예매 가능한 좌석인지 확인 -> 예매진행 -> 결제불가 (RollBack)-> 데이터 무결성
- Event Emitters : 시스템 내에서 발생하는 이벤트를 수집, 이벤트를 받아 채널로 전달
- Event channels : 특정 소비자에게 이벤트를 전달, 일정 수준의 전처리 수행 후 소비자에게 전달
- Event Consumers : 소비
생산자는 이벤트를 발행하고, 소비자는 누가 이벤트를 발행했는지 알 필요 없이, 이벤트를 소비한다.
중간의 채널은 두 이벤트가 적절히 연결될 수 있도록 해준다.
정리하자면 Event-Driven Architecture란 다음과 같다.
Event Driven MicroService(EDM)는 MSA가 적용된 시스템에서 이벤트 발생시 해당 이벤트 로그를 보관하고 이를 기반으로 동작하며, 비동기 통신을 통해 시스템 내 통합(integration)을 수행하는 Architecture이다.