개요

Eventuate는 오픈소스 마이크로서비스 개발 플랫폼으로, MSA가 가지고 있는 고유한 분산 데이터 관리 문제에 대한 문제를 해결하므로써 개발자가 비즈니스 로직에 집중할 수 있도록 한다.

MSA는 개발 속도를 상승시키고, 비즈니스가 빠르게 혁신할 수 있도록 하여 서비스 경쟁에서 앞서 나갈 수 있도록 해준다. 하지만 MSA의 고질적인 문제점 중 하나는 분산 데이터에 대한 관리가 어렵다는 것이다. 각각의 마이크로서비스는 고유한 DB를 가지고 있으며, 각각의 비즈니스 트랜잭션이 복수의 서비스에 대해 데이터 정합성을 유지하도록 구현하는 것은 쉽지 않으며, 복수 서비스로부터 데이터를 조회하는 쿼리를 작성하는 것 또한 쉽지 않다.


Eventuate 종류

Eventuate는 다음과 같은 2가지로 구성되어 있다.

Eventuate Tram

전통적인 JPA./JDBC, Entity Framework와 같은 Persistence를 사용하는 서비스를 위한 프레임워크이다. Eventuate를 Spring Boot, Micronaut, .NET 마이크로 서비스에 추가하여 비즈니스 로직을 수정하지 않고도 쉽게 사용할 수 있다.

Eventuate Local

이벤트 소싱 프레임워크이다. 이벤트소싱은 이벤트 중심의 비즈니스 로직이자 퍼시스턴스 프로그래밍 모델로서, 데이터가 변경되는 상황에서 이벤트를 자동으로 발행하고, 이벤트 저장소로 구성된 Eventuate Local에서 임시 쿼리를 사용할 수 있도록 지원하며, Java와 Sacala, Micronaut 프레임워크 등 다양한 언어와 프레임워크에 대한 클라이언트 라이브러리를 지원한다.


Eventuate 특징

Sagas를 활용한 데이터 정합성 유지

메시지를 통해 구성되는 로컬 트랜잭션 순서인 Sagas를 이용하여 복수 마이크로서비스에 데이터를 업데이트하는 명령을 구성할 수 있다.

CQRS를 활용한 쿼리 구성

복수의 서비스로부터 데이터를 조회할 때 CQRS 뷰를 활용하여 조회하도록 구현할 수 있으며, 이벤트를 활용하여 유지되는 쿼리 가능한 복제본으로부터 손쉽게 조회할 수 있다.

트랜잭셔널 메시징을 통한 통신

Transactional Outbox 또는 이벤트 소싱 패턴을 통해 데이터베이스 트랜잭션의 일부로서 메시지와 이벤트를 안정적으로 송수신 할 수 있다.

검증된 기술들에 대한 레버리지

새로 개발하는 것 보다, MySQL과 Kafka와 같은 익숙하고 검증되었으며 견고한 기술들을 베이스로 Eventuate를 사용할 수 있다.

다중 언어와 프레임워크 지원

Eventuate는 Java Spring Boot와 Micronaut, .NET core와 같은 다양한 언어와 프레임워크에서 사용 가능하며, 향후 지원 가능한 대상이 추가될 예정이다.

마이크로서비스 맞춤형 디자인

Eventuate는 마이크로서비스에 맞게 설계되어, 마이크로서비스를 지원하기 위한 불필요하고 오래된 프레임워크를 사용해야 하는 등의 추가적인 개발 부담을 덜 수 있다.


Eventuate Tram

Eventuate Tram을 활용한 트랜잭셔널 메시징

Eventuate Tram은 MSA에서 분산 데이터를 관리하는 플랫폼이며, Transactional Outbox 패턴을 활용하여 DB트랜잭션의 일부로서 메시지를 송수신하며, 애플리케이션이 원자성을 가지고 DB를 업데이트하고 메시지를 발행할 수 있도록 한다. 이 패턴은 Saga, CQRS 패턴에서도 활용된다.

현재 MySQL과 Postgres DB를 지원하며, Apache Kafka를 메시징 브로커로 지원하고 있다.

Eventuate Tram은 다음과 같은 메시징 추상화를 제공한다.

  • 메시징: 이름이 지정된 채널을 통한 메시지 송수신
  • 이벤트: 도메인 이벤트 발행/소비(구독)
  • 커맨드: 커멘드 메시지와 응답 메시지를 송/수신 하여 비동기 서비스 호출

Eventuate Tram 애플리케이션 아키텍처

아래 그림은 다음 링크에 구성된 서비스에 대한 아키텍처를 보여준다.

https://github.com/eventuate-tram/eventuate-tram-examples-customers-and-orders

위의 애플리케이션은 세개의 서비스로 구성되어 있다.

  • Customer Service
    - 고객 관리를 위해 REST API르 구현되어 있다. MySQL/Postgres DB 상의 Customer JPA 엔티티를 소유하고 있다. Eventuate Tram을 활용하여 Customer 도메인에 이벤트를 발행하며, Order Service와 Order History Service에서 해당 이벤트를 사용한다.
  • Order Service
    - 주문을 관리하기 위해 REST API로 구현되어 있다. MySQL/Postgres DB 상의 Order JPA 엔티티를 소유하고 있다. Eventuate Tram을 활용하여 Order 도메인에 메시지를 발행하며, Customer 서비스와 Order History 서비스에서 해당 메시지가 소모된다. Order Service는 Choreography Saga를 사용하며 Order 서비스와 Customer 서비스 사이에서 이벤트 교환이 일어난다.
  • Order History Service
    - REST API로 고객의 주문 현황을 조회한다. 이 서비스는 Order와 Customer 서비스가 발행하는 이벤트를 구독하며 MongoDB 바탕의 CQRS 뷰로 주문 현황을 저장한다.

Eventuate Tram CDC(Change Data Capture) 서비스는 MESSAGE 테이블에 저장되는 메시지를 Transaction Log Tailing 또는 Polliing을 사용하여 읽고 Apache Kafka와 같은 메시지 브로커에 발행한다.

Eventuate Local

Eventuate Local은 Eventuate의 온프레미스, 오픈소스 버전으로서, MSA를 차용하는 트랜잭셔널 비즈니스 애플리케이션을 개발하기 위한 플랫폼이다. Eventuate는 이벤트 소싱과 CQRS기반의 마이크로서비스에 대한 이벤트-드리븐 프로그래밍 모델을 제공한다.

Eventuate Local은 다음과 같이 구성되어 있다.

  • MSA 기반의 애플리케이션 개발 플랫폼
  • RDB(현재 MySQL 지원)와 Kafka로 구성된 이벤트 저장소

프레임워크는 이벤트를 SQL DB의 EVENTS 테이블에 저장하며 Kafka 이벤트를 구독한다. 데이터 변경 감지 컴포넌트는 DB의 트랜잭션 로그를 추적하며, 각각의 이벤트를 Kafka로 발행한다. 각각의 집계성 타입에 따라 Kafka 토픽이 존재한다.

CDC(Change Data Capture) 컴포넌트는 MySQL 트랜잭션 로그를 추적하며 EVENTS 테이블에 입력된 각각의 이벤트를 Kafka 토픽으로 발행하여 이벤트 집계가 가능하도록 한다.

CDC 컴포넌트는 각각의 서비스에 내장하여 동작하거나 별도의 cdcservice로 구성되어 동작한다.