작업하는 프로젝트에서 CQRS 패턴을 이용하고자 EDA를 고민하던 차에, Axon Server를 두지 않고 기존에 운용하던 Kafka를 통해 이벤트를 전달하도록 하기 위해 axon-kafka를 공부했다.
Axon Server는 메시지 브로커로 CQRS 패턴이나 이벤트 소싱 기반 아키텍처 구현을 지원하는 플랫폼이다. 얼핏 보면 Kafka와 비슷한 역할로 보이는데, 이벤트 소싱(Event Sourcing)을 중심으로 알아보자.
Event-Driven Architecture
이벤트 생성 및 처리를 중심으로 애플리케이션 구축을 지지한다. 이는 주로 실시간, 분산 및 확장성에서 반응성이 있어야 하는 최신 서비스에 따라 주도되어 왔다.
Event Sourcing
DDD(Domain-Driven Design)에서 시작된 이벤트 소싱은 프로그램을 시스템 상태가 아니라 이벤트로 취급하여 설계 및 개발을 지지한다.

- Naturalized Audit Trail
- Data Mining / Analytics
- Design Flexibility
- Temporal Reporting
이벤트 소싱은 거의 항상 CQRS 패턴과 함께 사용되며, 애플리케이션 상태를 변경하기 위한 명령(Command)를 수신하는 명령 모델과 명령(Query), 현태 상태의 특정 표현을 검색한다.
이벤트 소싱은 이러한 명령 모델이 의존하여 집계(Aggregation)에서 발생하는 이벤트를 처리하고 저장한다.
다시금, Axon은 이벤트 기반 아키텍처를 구현하기 위해 독점적으로 구축된 선도적 플랫폼이다.
확장성이 뛰어난 이벤트 저장소를 제공하는 것 이외에 모든 작업(Command, Query, Event 등)을 메시지로 처리하여 기존의 이벤트 소싱 개념을 향상시킨다.
그럼 Kafka는? - 이벤트 소싱이 아닌 이벤트 스트리밍(Event Streaming)
LinkedIn에서 처음 개발하여 Apache 재단에서 채택한 Kafka는 이벤트 스트리밍을 사용한다.

Kakfa로 이벤트 소싱을 구현하려면 이벤트 저장소 역할을 설계할 필요가 있다. 이로 인해 집계 유형 및 인스턴스 전체 데이터 셋을 스캔해야해서 읽기 작업이 매우 느려질 수 있다.
데이터베이스를 추가해서 보완할 수 있지만 여전히 분산 트랜잭션 문제가 발생하며, 이를 해결하기 위해 Kafka Streams를 사용할 수 있다.
- Streams는 이벤트 스트림을 state sotres로 제공해서 분산 저장소 문제를 해결하지만, 스냅샷만 저장함
Kafka로 이벤트 소싱을 구현할려면 다양한 기반 플랫폼을 구축해야하지만 이를 한계로 치부할 순 없다.
애초에 소싱 목적이 아니라 스트리밍 목적으로 만들어졌고, 그 역할을 완벽하게 해내고 있기 때문이다.

Axon-Kafka (Kafka Connector)
Axon은 Kafka와의 통합을 위해 Axon Framework의 일부로 Kafka Connector를 제공하고 있다. Axon Framework는 Axon Server를 필수적으로 필요로 하지 않고 여러 메시지 브로커를 이용할 수 있도록 플러그인을 제공하고 있다.
Redirect Notice
docs.axoniq.io
Kafka를 사용하는 다운스트림 시스템에 이벤트 전달 책임을 위임하면서 목적에 맞게 구축된 이벤트 소싱 기능 및 명령/쿼리 메시지 처리를 위해 두 플랫폼의 장점을 활용하는 데 도움을 준다.

Axon Framework는 Kafka와의 통합을 지원하므로 무조건 Axon Server를 사용하지 않아도 된다.
- axon-kafka 의존성 추가
implementation 'org.axonframework.extensions.kafka:axon-kafka:4.6.0'
근데 난 webflux 기반이라 Axon에서 reactiveKafka를 지원하지 않는다. 따라서 직접 구현했고 조만간 새로운 글로 오겠당
출처 및 인용.
https://www.osckorea.com/post/axoneun-apache-kafkawa-eoddeohge-dareulgga
'backend' 카테고리의 다른 글
성능 테스트와 개선을 위한 시도와 실패들 (0) | 2024.12.17 |
---|---|
Spring의 비동기 프로그래밍 @Async에 대해 알아보자 (1) | 2024.11.23 |
토이프로젝트 - 트랜잭션 관리를 통한 베타락(Exclusive Lock) 구현 (0) | 2024.11.22 |
토이프로젝트 - Redis를 이용한 분산 락(Distributed Lock) (0) | 2024.11.22 |
HTTP multipart/form-data 파일 업로드 문제 해결 (0) | 2024.11.21 |