개발 일기

[Computer Network] 실시간 웹 통신 - 5. 메세지 브로커(Message Broker) RabbitMQ& Kafka 본문

Computer Science/Computer Network

[Computer Network] 실시간 웹 통신 - 5. 메세지 브로커(Message Broker) RabbitMQ& Kafka

개발 일기장 주인 2024. 10. 10. 11:28

채팅 기능을 구현한 것을 보면 WebSocket 그리고 STOMP와 함께 매번 등장하는 RabbitMQ와 Apache Kafka 같은 메세지 브로커에 대해서 정리해봤다.


Message Broker

  •   Message Broker(메시지 브로커)는 Publisher(송신자)로부터 전달받은 메시지를 Subscriber(수신자)로 전달해주는 중간 역할이며 응용 소프트웨어 간에 메시지를 교환할 수 있게 한다.
  • 이 때 메시지가 적재되는 공간을 Message Queue(메세지 큐)라고 하며 메시지의 그룹을 Topic(토픽)이라고 한다.
  • Publisher가 Topic에 맞게 메세지를 가져다 놓기만 하면 각각의 Subscriber는 각자 원하는 Topic의 메세지를 가져갈 수 있는 것이다.
  • Producer와 Consumer가 서로 독립적으로 동작할 수 있도록 돕느다.

(좌) Message Broker 없음 / (우) Message Broker 도입 (https://www.youtube.com/watch?v=0lyrd5FlETQ)

  • 왼쪽 사진처럼 메세지 브로커가 없을때 부터 오른쪽 처럼 메세지 브로커를 도입하게 된다면 Publisher와 Subscriber의 수가 증가하더라도 설계가 훨씬 수월해진다.
  • 보내는 쪽과 받는 쪽을 효과적으로 연결해주며 중계자는 일정시간 메세지를 보유하고 있기 때문에 데이터의 유실을 방지해주며 수평적 확장이 용이하도록 만들어준다.
  • 성능(속도)보다는 안전한 메세지 전달과 노드 간의 독립성 그리고 확장성을 필요한 서비스 들에서 유리한 구조이다.
  • 예를들어 이메일, 로그 수집, 온라인 결제, 이미지 처리, MSA 아키텍처에 사용된다.
1. Producer: 메시지 제공하는 이해관계자 (Consumer가 누구인지 고려X)
2. Consumer: 메시지를 제공받는 이해관계자
3. Message Broker: Producer와 Consumer사이에서 메시지를 중개하는 역할

Message Broker 분류

  • 메세지 브로커는 크게 위와 같이 두가지로 분류할 수 있는데 왼쪽 부류에서 대표적인 제품은 RabbitMQ, 오른쪽에서 대표적인 제품이 Apache Kafka이다.
  • Amazon에서 RabbitMQ와 Kafka를 서비스로 제공하고 있다.
  • Message Broker는 Producer와 Consumer와 별개의 서버에서 구동되지만 프로듀서와 컨슈머에도 RabbitMQ나 Kafka 클라이언트가 설치되어서 가운데의 브로커 서버와 통신하게 되는 것이다.

 

RabbitMQ

  • 주로 비교적 적은 수의 서버에 설치된다.
  • Producer와 Message Broker, Message Broker와 Consumer 사이의 프로토콜: AMQP 프로토콜
  • 메시지가 주로 메모리에 저장되기 때문에 성능은 좋지만 유실의 위험은 있다.
  • 큐(Queue) 형태로 저장한다.
    ➜ 즉, Producer로 부터 받아온 메시지를 저장하고 Consumer가 메시지를 받아갈때 큐에서 제거하는 일도 담당한다.
  • 대신 Consumer는 데이터를 요청하기만하면 된다. 'Smart Broker, Dump Consumer'
  • Work Queue라는 것을 통해 시간이 걸릴 수 있는 작업을 여러 워커들이 분산 처리하도록 한다. Consumer의 위치에 있는 워커들이 작업을 하나씩 가져가고 작업이 완료되는대로 브로커에 신호를 보내 작업이 제거되도록한다.
  • 메시지가 Queue라는 그룹으로 묶이는데 RabbitMQ가 조건에 따라 특정 큐나 모든 큐로 보내기 위한 다양한 방식을 제공하기 때문에 복잡한 메시지 라우팅이 필요한 경우 Kafka보다 유리하다.

Kafka

  • 일반적으로 큰 규모의 클러스터로 운영된다.
  • Producer와 Message Broker, Message Broker와 Consumer 사이의 프로토콜: TCP 기반으로한 자체 프로토콜
  • 메시지를 로그 형태로 디스크에 저장하기 때문에 유실 위험이 상대적으로 적지만 메모리보다 상대적으로 성능이 낮을 것이다. 그러나 Kafka처럼 순차적으로 저장하여 성능을 극대화할 수 있다.
  • 이 메시지들은 Consumer에서 받아가도 로그에서 지워지지 않는다.
  • 로그 안의 메시지들은 배열 안의 요소들이 인덱스를 갖는 것처럼 각각의 오프셋을 갖는데 Consumer들이 자기가 받아간 마지막 메시지의 오프셋을 기억하여 중복을 피한다.  'Dump Broker, Smart Consumer'
  • 즉, Consumer를 구현하는 일이 RabbitMQ보다 까다로울 수 있다. 대신 그만큼 메시지 브로커는 부담이 준다.
  • Batch 처리가 가능해서 메시지를 한번에 여럿 들고 올 수 있다.
  • 클러스터링 운영에 유리하다.(RabbitMQ의 경우 Consumer가 마지막으로 받아간 메시지를 다른 클러스터 내부 브로커들과 동기화하고 있어야하기 때문에 더 까다로운 것이다)
  • 예를들어 대용량 스트리밍, 데이터 파이프라인 그리고 로그 집계 및 분석에 유리하다.
  • 메시지가 Topic으로 묶임

 

각각이 적합한 서비스

채팅기능에서는 RabbitMQ 메시지 브로커를 사용하는 것이 유리한 것을 알았다.