메시지큐의 기본 개념에 대해 설명한 뒤, 아래 나열한 통합 기술들에 대해 설명합니다.
각 상황에 맞는 기술들이 있으니 선택할 때, 고려해야 할 사항들을 보시길 바랍니다.
- Spring Integration
- RabbitMQ
- Apache Kafka
- Apache ActiveMQ
- Apache Pulsar
- Apache Camel
- AWS SQS
RabbitMQ, Apache Kafka, Apache ActiveMQ의 경우 예시 코드가 있습니다.
모든 예제 코드는 Github Repository에서 확인하실 수 있습니다.
엔터프라이즈 통합 패턴(Enterprise Integration Patterns, EIP)
- 엔터프라이즈 시스템 간의 통합을 설계하고 구현하기 위한 공통된 문제 해결 방법을 정의한 패턴
- 시스템 간의 통합은 주로 메시지를 통해 이루어 지며, 메시지 기반의 아키텍처에서 특히 유용
rabbitmqctl
)RabbitMQ를 예시로 비교하였습니다.
가장 큰 차이점
메시지 브로커의 동작 방식
- 발행자가 Message Exchange에 메시지를 보내면, 정해진 규칙에 따라 큐에 라우팅
- 컨슈머들은 메시지를 구독하여 처리
- 이후, 컨슈머가 메시지를 가져가면 큐에는 더 이상 남지 않고 사라짐
메시지 브로커의 단점
- 소비자와 메시지 브로커의 결합력이 높아져, 트래픽이 증가했을 때 수평적 확장이 어렵다.
- 이벤트 메시지가 성공적으로 전달되었다고 판단될 경우, 큐에서 메시지가 삭제된다.
- → 후에 다시 이벤트를 받기가 어렵다.
카프카(이벤트 스트리밍 플랫폼)의 동작 방식
- 메시지 브로커와 다르게 토픽이라는 것이 Event Streamer에 저장됨
- 발행자가 이벤트를 생성하면, 토픽이라고 불리는 이벤트의 레코드 로그를 Streamer에 순서대로 기록
- 그 후, 해당 토픽을 구독한 컨슈머에게 전달됨
- 컨슈머가 토픽을 가져간 후에도, 이벤트 스트림에서 토픽을 계속 유지하여 추후 다시 발행할 수 있음.
RabbitMQ와 Kafka 비교
RabbitMQ | Kafka | |
---|---|---|
성능 | 초당 4,000 ~ 10,000개의 메시지 처리 가능 | 초당 1,000,000 개의 메시지 처리 가능 |
메시지 생명주기 | 소비되는 순간 삭제 | 정책 기반(설정 한 기간만큼) |
트랜잭션 데이터 | 중복 메시지 발송 및 메시지 손실 가능성 존재 | 순서 보장 및 메시지 유실 가능성이 적음 |
운영 데이터 | 라우팅, 클러스터링, 메시지 확인 등의 운영 데이터 처리에 강점 | 대량의 실시간 로그 또는 스트림 데이터 처리에 강점 |
클러스터링 | 클러스터링 지원, 노드 간 메시지 복제로 고가용성 제공 | 클러스터링 지원, 자동 복제와 파티셔닝을 통해 고가용성 및 장애 복구 기능 제공 |
메시지 모델 | Queue와 Topic 모델 지원 | Topic 모델만 지원 |
스케일링 | 스케일 업에 적합 | 스케일 아웃에 적합, 대량의 데이터를 처리할 수 있는 높은 확장성 |