Apache Kafka ‐ Kafka 기본 개념 - dnwls16071/Backend_Summary GitHub Wiki

📚 Kafka의 기본 구성(Topic, Consumer, Producer)

image
  • 프로듀서(Producer) : 카프카에 메시지를 전달하는 주체
  • 컨슈머(Consumer) : 카프카의 메시지를 처리하는 주체
  • 토픽(Topic) : 카프카에 넣을 메시지의 종류를 구분하는 개념

프로듀서는 Kafka로 메시지(데이터)를 전달한다. 그러면 Kafka는 메시지 큐에 토픽 별로 구분해 전달받은 메시지를 저장해둔다. 컨슈머는 Kafka에 새로운 메시지가 생겼는지 주기적으로 체크하다가, 새로운 메시지가 있다는 걸 발견하면 그 메시지를 조회해와서 처리한다.

📚 토픽(Topic) 생성/조회/삭제

image
// 토픽 생성하기
// bin/kafka-topics.sh --bootstrap-server <kakfa 주소> --create --topic <토픽명> 

$ bin/kafka-topics.sh --bootstrap-server localhost:9092 --create --topic email.send
// 토픽 전체 조회하기
// bin/kafka-topics.sh --bootstrap-server <kakfa 주소> --list

$ bin/kafka-topics.sh --bootstrap-server localhost:9092 --list
// 특정 토픽 세부 정보 조회
// bin/kafka-topics.sh --bootstrap-server <kakfa 주소> --describe --topic <토픽명>

$ bin/kafka-topics.sh --bootstrap-server localhost:9092 --describe --topic email.send
// 토픽 삭제
// bin/kafka-topics.sh --bootstrap-server <kafka 주소> --delete --topic <토픽명>

$ bin/kafka-topics.sh --bootstrap-server localhost:9092 --delete --topic email.send

📚 Kafka에 메시지 넣기 / 메시지 소비하기

// email.send라는 토픽에 메시지 넣기

$ bin/kafka-console-producer.sh --bootstrap-server localhost:9092 --topic email.send
image
  • 전통적인 메시지 큐(RabbitMQ, SQS)는 메시지를 꺼내서 읽으면 해당 메시지를 큐에서 제거하는 구조를 취한다.
  • 허나 Kafka는 메시지를 읽고 제거하는 방식이 아니라 저장된 메시지를 읽기만 하고 제거하지 않는 방식으로 동작한다.
  • 이런 구조 덕분에 Kafka는 같은 메시지를 여러 번 읽는 것이 가능하다.
// email.send라는 토픽에 존재하는 메시지 꺼내기

$ bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic email.send --from-beginning

📚 메시지를 어디까지 읽었는지 기억하고 그 다음 메시지를 처리하는 카프카의 방법

  • Kafka에서 컨슈머 그룹(Consumer Group)이라는 개념을 활용하면 각 컨슈머 그룹이 어디까지 메시지를 읽었는가에 대해 오프셋(Offset)이라는 번호로 기록해둔다.
  • 이 덕분에 컨슈머 그룹에 속해있는 컨슈머들은 안 읽은 메시지부터 순차적으로 메시지를 읽을 수 있게 된다.
    • 오프셋(Offset) : 메시지 순서를 나타내는 고유 번호(Sequence, 0부터 시작)
    • 컨슈머 : 카프카 메시지 처리 주체
    • 컨슈머 그룹 : 1개 이상의 컨슈머를 하나의 그룹으로 묶은 단위
image
  • 토픽에 저장된 메시지는 메시지 순서를 나타내기 위해 고유 번호인 오프셋(Offset)을 가지고 있다.
  • 오프셋(Offset) 번호는 0부터 시작한다.
  • 컨슈머 그룹은 최소 1개 이상의 컨슈머를 가진다.
  • 컨슈머 그룹은 어디까지 메시지를 읽었는지에 대한 정보(CURRENT-OFFSET)를 알고 있다.
    • CURRENT-OFFSET -> 결론적으로 다음에 읽을 시작 메시지 오프셋 번호가 된다.
$ bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic email.send --from-beginning --group email-send-group
// 컨슈머 그룹 전체 조회하기

$ bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 --list
// 컨슈머 그룹 세부 정보 조회하기

$ bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 --group email-send-group --describe
스크린샷 2025-08-11 오후 10 14 41

❗CURRENT-OFFSET 값이 3로 되어있다. -> 결국 0~2번까지의 메시지를 읽었다는 의미가 되고 그 다음으로 읽을 메시지의 오프셋이 3번이라는 것을 알 수 있다.
❗실제로는 똑같은 요청을 중복해서 처리하면 안 된다. 그래서 반드시 컨슈머 그룹을 통해서 메시지를 읽어야 한다. 그래야 컨슈머 그룹이 어느 메시지까지를 읽었는지에 대해 오프셋 값으로 기억해두었다가 아직 처리하지 않은 그 다음 메시지부터 처리할 수 있다.

📚 토픽과 컨슈머의 이름 잘 짓는 법

⚠️ **GitHub.com Fallback** ⚠️