Redis와 Kafka를 활용한 대규모 트래픽 처리 시스템 설계하기

Topic을 만들고 Producer와 Consumer 사용해보기

Topic을 만들고 Producer와 Consumer 사용해보기


Kafka Topic을 만들고 Producer와 Consumer 사용해보기

Kafka Cluster를 Docker Compose로 실행했다면, 이제 실제로 Topic을 만들고 메시지를 발행하고 소비하는 과정을 실습해볼 수 있다.

Kafka에서 메시지는 Topic이라는 단위로 분류되어 저장된다.

Producer는 Topic에 메시지를 보내고, Consumer는 Topic을 구독하여 메시지를 읽는다.

이번 실습의 흐름은 다음과 같다.

flowchart LR
    Producer[Producer]

    Topic[test-topic]

    Consumer[Consumer]

    Producer --> Topic
    Topic --> Consumer

Kafka 컨테이너 접속

먼저 실행 중인 Kafka Broker 컨테이너에 접속한다.

docker exec -it kafka00 bash

여기서 kafka00은 Docker Compose로 실행한 Kafka Broker 컨테이너 이름이다.

컨테이너에 접속한 뒤 Kafka 명령어가 있는 경로로 이동한다.

cd /bin

이제 Kafka CLI 명령어를 사용할 준비가 되었다.


Kafka Topic 생성하기

Kafka Topic은 메시지가 저장되는 논리적인 단위이다.

예를 들어 주문 이벤트를 저장하려면 order-topic, 결제 이벤트를 저장하려면 payment-topic처럼 목적에 따라 Topic을 나눌 수 있다.

이번 실습에서는 test-topic이라는 Topic을 생성한다.

kafka-topics.sh --create \
  --bootstrap-server localhost:9092 \
  --replication-factor 3 \
  --partitions 1 \
  --topic test-topic

Topic 생성 명령어 구조

위 명령어는 다음 옵션들로 구성된다.


–create

--create

새로운 Topic을 생성하겠다는 의미이다.


–bootstrap-server

--bootstrap-server localhost:9092

Kafka Cluster와 통신할 Broker 주소를 지정한다.

현재 명령어는 kafka00 컨테이너 내부에서 실행하고 있기 때문에 localhost:9092로 Broker에 접근할 수 있다.


–replication-factor

--replication-factor 3

Topic 데이터의 복제본 개수를 지정한다.

Replication Factor가 3이라는 것은 동일한 Topic 데이터가 3개의 Broker에 복제된다는 의미이다.

이번 구성에서는 Broker가 3개이므로 복제 계수를 3으로 설정할 수 있다.

kafka00
kafka01
kafka02

복제본을 여러 Broker에 저장하면 특정 Broker에 장애가 발생해도 데이터를 잃지 않고 서비스를 계속 운영할 수 있다.

다만 Replication Factor는 Kafka Cluster의 Broker 수를 초과할 수 없다.


–partitions

--partitions 1

Topic의 Partition 개수를 지정한다.

Partition은 Topic을 물리적으로 나누어 저장하는 단위이다.

Partition 수가 많으면 Consumer가 병렬로 메시지를 처리하기 유리하다.

하지만 Partition은 한 번 생성하면 줄이기 어렵고, 너무 많이 만들면 관리 복잡도가 증가할 수 있다.

이번 실습에서는 기본 흐름을 이해하기 위해 Partition을 1개로 설정한다.


–topic

--topic test-topic

생성할 Topic 이름을 지정한다.

Topic 이름은 Kafka Cluster 안에서 유일해야 한다.


생성된 Topic 확인하기

Topic이 정상적으로 생성되었는지 확인하려면 다음 명령어를 실행한다.

kafka-topics.sh --list --bootstrap-server localhost:9092

정상적으로 생성되었다면 다음과 같이 test-topic이 출력된다.

test-topic

Producer 실행하기

이제 test-topic에 메시지를 발행해보자.

Producer는 Kafka Topic에 메시지를 보내는 역할을 한다.

다음 명령어를 실행한다.

kafka-console-producer.sh --broker-list localhost:9092 --topic test-topic

명령어 실행 후 입력 대기 상태가 되면 메시지를 입력할 수 있다.

예를 들어 다음과 같이 입력한다.

hello

이 메시지는 test-topic으로 발행된다.


Producer 동작 흐름

Producer는 다음과 같은 흐름으로 동작한다.

sequenceDiagram
    participant Producer
    participant Broker as Kafka Broker
    participant Topic as test-topic

    Producer->>Broker: 메시지 전송
    Broker->>Topic: 메시지 저장

즉, Producer가 메시지를 보내면 Kafka Broker가 이를 받아 Topic에 저장한다.


Consumer 실행하기

이제 Topic에 발행된 메시지를 읽어보자.

Consumer는 Kafka Topic을 구독하고 메시지를 읽는 역할을 한다.

새 터미널을 열고 다시 Kafka 컨테이너에 접속한다.

docker exec -it kafka00 bash

명령어 경로로 이동한다.

cd /bin

Consumer를 실행한다.

kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test-topic --from-beginning

–from-beginning 옵션

--from-beginning

이 옵션은 Topic의 처음 메시지부터 읽겠다는 의미이다.

만약 이 옵션을 사용하지 않으면 Consumer 실행 이후 새로 들어오는 메시지만 읽을 수 있다.

실습에서는 이미 Producer가 보낸 메시지까지 확인하기 위해 --from-beginning 옵션을 사용하는 것이 좋다.


Consumer 실행 결과

Producer에서 다음 메시지를 보냈다면:

hello

Consumer에서는 다음과 같이 메시지를 확인할 수 있다.

hello

즉, Producer가 발행한 메시지가 Kafka Topic에 저장되고, Consumer가 이를 정상적으로 읽은 것이다.


Producer와 Consumer 전체 흐름

전체 흐름은 다음과 같이 정리할 수 있다.

sequenceDiagram
    participant Producer
    participant Kafka as Kafka Broker
    participant Topic as test-topic
    participant Consumer

    Producer->>Kafka: hello 메시지 발행
    Kafka->>Topic: 메시지 저장
    Consumer->>Kafka: test-topic 구독
    Kafka-->>Consumer: hello 메시지 전달

실습 명령어 전체 정리

전체 실습 명령어를 정리하면 다음과 같다.

Kafka 컨테이너 접속

docker exec -it kafka00 bash
cd /bin

Topic 생성

kafka-topics.sh --create \
  --bootstrap-server localhost:9092 \
  --replication-factor 3 \
  --partitions 1 \
  --topic test-topic

Topic 목록 확인

kafka-topics.sh --list --bootstrap-server localhost:9092

Producer 실행

kafka-console-producer.sh --broker-list localhost:9092 --topic test-topic

Consumer 실행

kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test-topic --from-beginning

정리

이번 실습에서는 Kafka Topic을 생성하고, Producer와 Consumer를 사용하여 메시지를 발행하고 소비하는 과정을 확인했다.

Kafka의 기본 흐름은 단순하다.

Producer → Topic → Consumer

Producer는 메시지를 Topic에 발행하고, Consumer는 Topic을 구독하여 메시지를 읽는다.

이 구조를 기반으로 Kafka는 대규모 이벤트 처리, 비동기 메시징, 로그 수집, 이벤트 기반 아키텍처 등 다양한 시스템에 활용된다.


한 줄 요약

Kafka Topic은 메시지가 저장되는 논리적 단위이며, Producer는 Topic에 메시지를 발행하고 Consumer는 Topic을 구독하여 메시지를 읽는다.


© 2020. All rights reserved.

SIKSIK