Kafka 메시지 생산과 소비

Producer와 Consumer Group

1. 메시지 생산/소비

Producer

  • Producer는 정해진 Topic으로 메시지를 기록
  • Partition이 여러개 있을 경우, 기록될 Partition의 선택은 기본적으로 Round-Robin방식
  • 각 Partition 내에서는 가장 마지막 offset 뒤에 신규 메시지가 저장, Partition 내에서는 순서가 보장되며 기록됨(실제 메시지가 사용되는 순서는 보장되지 않음.)

Consumer Group

  • Consumer Group은 하나의 Topic을 담당(Topic은 여러개의 Consumer Group이 접근할 수 있지만, 하나의 Consumer Group은 하나의 Topic에만 접근)
  1. Partition 접근하는 Consumer 관리
    • Consumer Group 내에서 Consumer 인스턴스들은 Topic내에 Partition에서 다음에 소비할 offset이 어디인지 공유하면서 메시지를 소비합니다. 그렇기 때문에 다음에 소비할 offset을 잘 관리
    • 예를 들어 Consumer Group이 없을 경우, 하나의 Partition에 2개의 Consumer가 동시에 접근한다면 어떤 Consumer가 몇 번의 offset을 소비해야 하는지 알 수 없게 됨
    • Consumer Group을 통해 하나의 Partition에는 하나의 Consumer 인스턴스만 접근할 수 있도록 관리
  2. offset 을 공유하여 고가용성 확보
    • Partition에는 하나의 Consumer 인스턴스만 접근할 수 있기 때문에, 특정 Consumer 인스턴스에 에러가 발생했을 시 다른 Consumer 인스턴스는 에러가 발생한 Consumer 인스턴스가 소비하던 Partition을 소비
    • 즉, Consumer가 다운될 때를 대비해 Consumer Group의 Consumer 인스턴스들은 offset을 공유하고 있으며, 이를 통해 고가용성이 확보

2. Partition과 Consumer의 개수

  • Partition은 하나의 Consumer만 접근이 가능
  • 반대로 Consumer는 여러 개의 Partition을 소비
  • Partition 갯수 >= Consumer 인스턴스 갯수

Consumer Design

  • Consumer가 최대의 효율을 내는 것을 목표로 함

RabbitMQ

  • Message Broker가 Consumer에게 메시지를 push하는 방식
  • Broker는 Consumer의 처리여부에 관계없이 push 하므로, 메시지 소비 속도보다 생산 속도가 빠를 경우 Consumer에 부하를 줌
  • RabbitMQ는 DRAM을 사용하므로 buffer를 사용하지만, DRAM을 다 사용하면 Disk에 저장.
  • 따라서 batch 같이 큰 작업에서는 Disk로 메시지를 읽어올 경우 지연이 발생

Kafka

  • Consumer가 Broker로부터 메시지를 pull하는 방식
  • Consumer가 처리할 수 있을 때 메시지를 가져오므로 자원을 효율적으로 사용
  • Kafka는 애초에 메시지를 Disk에 저장하고, 이미 처리한 과거의 offset으로 자유롭게 움직일 수 있으므로 batch 작업에서 자원의 낭비가 발생하지 않음
  • 메시지를 쌓아두었다가 처리하는 batch Consumer 구현도 가능

Replication

  • Topic을 생성할 때, –replication-factor 옵션을 부여하여 복제본(replication)을 생성
  • Replication이란 Zookeeper가 leader가 되는 Partition을 정하고, Partition을 각 broker마다 복제 하는 것
  • 이 때 leader를 복제하는 partition을 follower
  • leader : 메시지를 생산하고 소비하는 작업은 모두 leader broker에서 이뤄짐
  • follower : 나머지 follower들은 leader를 복제하기만 함
  • leader가 죽었을 경우 follower 중 하나가 leader가 되어야 하기 때문에, follower는 leader와 싱크를 맞추고 있는 것(In-Sync Replica, ISR)

  • 그림은 3대의 Broker Server에 대해 topic-1에 4개의 Partition이 존재할 때, –replication-factor=2로 설정
  • 4개의 Partition이 factor 설정 값만큼 Broker에 분배됨(Zookeeper 역할)
  • Partition1에 메시지를 쓰는 상황일 때, leader partition이 존재하는 Broker2에서 메시지가 생산됨. 그리고 follower인 Broker3에 존재하는 Partition은 leader를 복제함(ISR)
  • 만약 leader가 되는 Broker가 다운되면, follower가 leader로 선출

메시지 보존기간

  • log.retention.hours 를 통해 설정, Default는 7일
  • 데이터 크기에 상관없이 Kafka 성능은 일정하기 때문에 장기간 저장해도 문제가 발생하지 않음
  • Consumer가 메시지를 소비한다고 해서 메시지가 사라지지 않음(Consumer가 과거의 offset에 대한 접근을 할 수 있음)

Categories:

Updated:

Comments