카프카를 공부하면서 메세지큐의 정의를 공부하다가 메세지브로커와 이벤트브로커로 나뉜다는것을 알았습니다.
그러면서 프로젝트를 진행하면서 어떤 메세지큐를 써야할지 고민하면서 공부했던 내용을 작성합니다.
🦧 메세지 큐
RabbitMQ, Redis, Kafka 같은 기술을 메시지 플랫폼이라고 한다.
메시지 플랫폼은 2가지 종류로 나뉘어진다.
- 메시지 브로커
- 이벤트 브로커
Kafka와 RabbitMQ는 모두 메세지 큐 안에서 정의가 됩니다.
메세지 큐
메시지 큐는 메시지 기반의 통신 프로토콜에서 사용되는 방식으로, 프로세스나 스레드 간에 메시지를 교환하는데 사용됩니다. 이러한 메시지 큐는 비동기적인 통신을 가능하게 하며, 시스템 간의 결합도를 낮추고 확장성을 높이는데 도움이 됩니다.
구성
- 프로듀서 : 메세지를 생성하고 보내는 역할을 합니다.
- 큐 : 메세지를 저장하는 저장소의 개념으로 대기하는 공간입니다. 일반적으로 FIFO으로 처리됩니다.
- 컨슈머 : 큐에서 메세지를 가져와 소비하는 역할을 합니다.
작동 패턴
1️⃣ Point-to-Point (P2P)
- 각 메시지가 하나의 컨슈머에게 전달됩니다.
- 만약 여러 컨슈머가 있으면, 그들 중 하나만 해당 메시지를 받게 됩니다.
- JMS (Java Message Service) API에서 지원하는 Queue가 이 패턴에 해당합니다.
2️⃣Publish/Subscribe (Pub/Sub)
- 발행된 모든 메시징이 모든 구독자에게 전달됩니다.
- 한 번 발행된 메세징은 여러 컨슈머에게 동일하게 전달될 수 있습니다.
- JMS API에서 지원하는 Topic이 이 패턴에 해당합니다.
장점
- 비동기 처리: 비동기적으로 데이터를 전달할 수 있습니다. 이는 서비스가 다른 서비스의 처리를 기다리지 않아도 됩니다.
- 분산처리 : 메시지 큐는 여러 컨슈머가 동일한 큐에서 작업을 가져와 동시에 처리할 수 있도록 지원합니다.
- 탄력성: 메시지 큐는 프로듀서와 컨슈머 사이의 중간 계층 역할을 하므로, 한쪽이 실패해도 전체 시스템에 영향을 미치는 것을 최소화합니다.
- 메세징 보증: "At least once" 또는 "Exactly once" 같은 메세징 전달 보증 방식을 제공하면서 메세징이 정확하게 전달되거나 소실되거나 중복될 가능성 없이 안전하게 처리됩니다.
- 순서 보장: 일부 메세징 시스템(예: Apache Kafka)은 특정 조건 하에서 메세징 순서를 보장하는 기능을 제공합니다.
- 디커플링 (Decoupling): 프로듀서와 컨슈머 사이에 의존성 없이 개발 및 운영 가능함으로써 유연한 아키텍처 설계가 가능합니다.
- 백로그 관리: 만약 소비자가 일정량 이상의 데이터 처리에 문제가 생겼다면, 해당 데이터들은 자동으로 Queue 내부에 저장되어 나중에 다시 처리될 수 있습니다.
🦧 메세지브로커
- 메시지를 받아서 처리하면 메세지가 삭제됩니다.
- 손실되면 안되는 요청을 처리할 때에는 주의해야합니다.
대표적인 메세지 브로커는 RabbitMQ가 있습니다.
RabbitMQ
- RabbitMQ는 AMQP 프로토콜을 구현한 메시지 브로커이다
- 구성이 쉽고 안정적입니다.
- 프로젝트의 규모가 작고 확장의 계획이 없다면 RabbitMQ가 적당하다.
- AMQP 프로토콜
Client와 Middleware broker간의 메시지를 주고받기 위한 프로토콜
🦦 구성
- 생산자(Producer) : 요청을 보내는 역할을 합니다
- 소비자(Consumer) : Producer로부터 메세지를 받아 처리하는 역할을 합니다
- exchange : 메세지를 전달하고자 하는 목적지(큐)에 전달하는 역할을 합니다
- 큐(queue) : 메세지를 쌓는 역할을 합니다
카프카와 다른점은 바로 queue로 들어가기 전, exchange라는 하나의 단계를 더 거친다는 것입니다.
RabbitMQ에서 메시지는 곧바로 queue에 들어가지 않고 exchage에게 전달하면 exchange가 queue에 메시지를 넣는 역할을 수행한다.
🦦 RabbitMQ는 AMQP를 구현합니다.
AMQP(Advanced Message Queuing Protocol, 어드밴스트 메시지 큐잉 프로토콜)는 메시지 지향 미들웨어를 위한 개방형 표준 응용 계층 프로토콜입니다.
🦦 차별점
- Broker 중심적인 형태로 publisher와 consumer간의 보장되는 메시지 전달에 초점
- 클러스터 구성이 쉽고 Manage UI가 제공되며 플러그인도 제공되어 확장성 뛰어남
- 데이터 처리보단, 관리적 측면이나 다양한 기능 구현을 위한 서비스를 구축할 때 사용
🦧 이벤트브로커
- 메시지 브로커와 다르게 이벤트가 삭제되지 않는다는 특징이 있다.
- 서비스에서 발생하는 이벤트를 DB에 저장하듯이 이벤트 브로커의 큐에 저장한다.
대표적인 이벤트브로커로 Kafka가 있습니다.
Kafka
- 오픈 소스 프로젝트로 운영되고 있는 분산 이벤트 스트리밍 플랫폼입니다.
- 이벤트 브로커의 역할을 수행하며, 대용량 데이터를 실시간으로 신뢰성 있게 처리하도록 설계되었습니다.
- 대부분 3개 이상의 브로커로 클러스터를 구축하며 주키퍼와 함께 구축한다.
- 서비스의 규모가 크고 규모를 확장할 계획이 있다면 Kafka가 적합하다.
위의 특징들 때문에 로그 수집, 실시간 분석, 스트림 처리 등 다양한 분야에서 활용되며, 복잡한 분산 시스템에서도 고성능과 확장성을 유지할 수 있습니다.
🦦 구성
- Producer: 데이터를 생성하여 브로커에 데이터를 적재합니다.
- Consumer: 브로커에서 데이터를 가져와 소비합니다.
- Broker: Kafka 시스템에서 서버를 말하고, 메시지(또는 이벤트)를 저장하고 전달합니다.
- Topic: 메시지가 저장되는 카테고리 또는 버킷입니다. 각 토픽은 하나 이상의 파티션으로 나뉘어집니다.
- Partition: 토픽을 나누는 하위 단위로, 각 파티션 내에서 메시지 순서가 보장됩니다.