목차
이벤트 기반 아키텍처(Event-Driven Architecture, EDA)
: 시스템의 컴포넌트가 이벤트를 통해 상호 작용하는 소프트웨어 설계 패턴
1) 핵심 개념
- 이벤트
- 상태의 변경. 즉, 데이터의 변경, 생성, 삭제를 통해 발생하는 서비스의 의미있는 변화를 뜻함
- 발행(Publish)과 구독(Subscribe)
- EDA에서 메시지를 전달하고 수신하는 방식의 핵심 개념 → 느슨한 결합(loose coupling)
- 발행: 특정 이벤트가 발생했음을 알리는 역할 (누가 수신할지 알 필요x)
- 수신: 특정 유형의 이벤트를 수신하고 처리하는 역할, 이벤트가 발행되면 브로커가 이를 구독자에게 전달
- 비동기 처리
- 이벤트는 실시간을 전송되지만, 이를 처리하는 컴포넌트는 독립적으로 실행되므로 느슨한 결합 유지
- 중앙 메시지 브로커(Message Broker)
- 메시지 브로커를 사용해 이벤트를 관리하고 전달
2) 주요 구성 요소
- 이벤트 발행자 (Event Producer): 이벤트를 생성하고 브로커로 전송함
- 이벤트 소비자 (Event Consumer): 이벤트를 수신하고, 필요한 비즈니스 로직을 실행
- 이벤트 스트림 (Event Stream): 이벤트가 브로커를 통해 소비자에게 전달되는 데이터 흐름
- 메시지 브로커: 이벤트의 전달을 관리하는 중앙 허브 역할
메시지: 브로커를 통해 전달되는 데이터의 일반적인 표현
이벤트: 메시지의 한 유형, 특정 상태 변화 또는 행위 발생을 알림
메시지 브로커(Message Broker) 종류
1. Apache Kafka
목표: 대규모 스트리밍 데이터 처리 (실시간으로 지속적으로 생성되는 대량의 데이터를 처리하고 분석하는 것)
사용 사례: 실시간 데이터 스트리밍, 로그 분석, 이벤트 소싱
특징: 메시지를 디스크에 저장해 데이터 재처리(replay)와 복구 가능
2. RabbitMQ
목표: 신뢰성있는 메시지 큐
사용 사례: 마이크로서비스 간 메시지 큐잉, 작업 분산, 알림 전송
특징: AMQP(Adbanced Message Queuing Protocol) 기반으로 설계되어 메시지의 신뢰성있는 전달 보장, 다양한 라우팅 전략 지원 (Direct, Topic, Fanout, Header 등)
3. Amazon SQS (Simple Queue Service)
목표: 클라우드 서버리스 큐
사용 사례: AWS 애플리케이션 간 통신, 비동기 작업 처리
특징: 서버리스로 작동, 무제한 확장성과 높은 가용성
4. Redis (Pub/ Sub 기능)
목표: 빠르고(초고속) 단순한 실시간 메시징
사용 사례: 실시간 채팅, 알림, 게임 데이터 동기화
특징: 메시지를 디스크에 저장하지 않아 매우 빠름, 복구 불가능
메시지 브로커를 이용한 데이터 동기화 전략
데이터 동기화
: 여러 시스템(ex) 서비스, 데이터베이스) 간에 데이터를 동일하게 유지하는 작업
1) 이벤트 기반 동기화
정의: 데이터 변경이 발생할 때 이벤트를 발행하고 이를 다른 시스템이 구독하여 데이터 변경 내용을 반영한다
장점: 실시간 동기화 가능, 느슨한 결합구조로 시스템 간 의존성 줄임
단점: 데이터가 최종 일관성을 가지나 즉시 일관성을 보장하지 않음, 이벤트 순서 보장 어려움, 오류로 인한 메시지 중복 처리 등
2) SAGA 패턴 (분산 트랜잭션 방지와 보상 트랜잭션)
정의: 마이크로 서비스들끼리 이벤트를 주고 받아 특정 마이크로서비스에서의 작업이 실패하면 이전까지의 작업이 완료된 마이크로서비스들에게 보상 이벤트를 소싱함으로써 분산 환경에서 원자성을 보장하는 패턴
장점: 시스템 확장 용이, 비동기 처리로 성능 향상, 서비스 독립성 유지, 트랜잭션 복잡성 감소
단점: 구현 복잡함, 최종 일관성만 보장(즉시 일관성 보장x)
<SAGA 패턴에서 메시지 브로커의 역할>
메시지 브로커는 각 서비스 간의 메시지를 전달하는 역할을 수행한다.
구체적으로 각 서비스 간의 이벤트나 명령을 전달하는 데 사용되며, SAGA의 각 단계를 연결하고 보상 트랜잭션을 처리하는 데 도움을 준다.
[성공시]
[실패시]
3) 메시지 저장 및 재처리
정의: 메시지 브로커가 메시지를 디스크에 저장하고, 실패한 작업은 다시 처리(retry)하거나 누락된 메시지는 재전송
장점: 데이터 손실 방지, 시스템 중단 후에도 동기화 가능
메시지 브로커를 이용한 데이터 일관성 유지 전략
데이터 일관성
: 동기화된 데이터를 읽거나 쓸 때 항상 정확하고 신뢰할 수 있는 상태를 보장하는 것
1) 메시지 순서 보장
문제 상황: 메시지가 비동기로 처리되면 순서가 어긋날 수 있음
해결 방법
- kafka → 파티셔닝과 키 기반 메시징으로 특정 데이터가 항상 동일한 파티션에서 처리되도록 설정 (같은 파티션에 속한 메시지들은 항상 같은 처리 순서로 처리된다)
- RabbitMQ → FIFO큐 활용
2) 멱등성 처리
멱등성
: 동일한 작업을 여러 번 실행하더라도 결과가 변하지않고 동일하게 유지된다는 속성을 의미
문제 상황: 메세지가 중복 처리될 경우 데이터 불일치 발생
해결 방법
- 각 메시지에 고유 ID를 부여해 중복 메시지 무시 (메시지 브로커가 해당 고유 ID를 부여)
- 데이터베이스 수준에서 중복 확인 및 업데이트 수행 (메시지 브로커는 중복된 데이터 처리 관련 로직을 지원)
3) 트랜잭션 보장
문제 상황: 메시지 발행과 데이터 업데이트가 원자적으로 이루어지지 않으면 불일치 발생
해결 방법
- kafka → 트랜잭션 API로 메시지 발행과 데이터 업데이트를 원자적으로 수행
- RabbitMQ → 메시지 확인(Acknowledgment)으로 처리 상태 관리
'이론' 카테고리의 다른 글
증분 백업 (0) | 2024.11.22 |
---|---|
ORM과 트랜잭션 (0) | 2024.11.21 |
분산 시스템과 CAP 이론 (0) | 2024.11.19 |
캐시 (Cache Consistency Management VS TTL(Time To Live)) (0) | 2024.11.18 |
API Gateway (0) | 2024.11.17 |