본문 바로가기

SpringBoot

카프카를 활용한 메세지 큐

0. 카프카와 주키퍼의 관계

주키퍼 서버를 두고 하위에 명령을 받는 카프카 노드를 여러개 받는 형식입니다.

->주키퍼는 하둡에서 나온 용어입니다.

 

하나의 컨테이너 내부에서 주키퍼, 카프카 최소 2개 이상의 컨테이너를 실행하기 위해  도커 컴포즈로 여러개의 컨테이너를 하나의 서비스로 정의하여 처리할 필요가 있습니다.

 

1. 도커 컴포즈(docker-compose.yml) 생성

version: '3' # docker-compose 버전 지정
services:  # docker-compose의 경우 docker 컨테이너로 수행될 서비스들은 services 하위에 기술
    zookeeper: # 서비스 이름. service 하위에 작성하면 해당 이름으로 동작
        image: wurstmeister/zookeeper # 도커 이미지
        container_name: zookeeper
        ports: # 외부포트:컨테이너내부포트
            - "2181:2181"
    kafka:
        image: wurstmeister/kafka
        container_name: kafka
        ports: # 외부포트:컨테이너내부포트
            - "9092:9092"
        environment: # kafka 브로터를 위한 환경 변수 지정
            KAFKA_ADVERTISED_HOST_NAME: 127.0.0.1
            KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 # kafka가 zookeeper에 커넥션하기 위한 대상을 지정
        volumes:
            - /var/run/docker.sock:/var/run/docker.sock

주키퍼와 카프카를 따로 만든 후 연동하는 작업 없이 생성할 수 있어 도커 컴포즈를 사용합니다.

 

docker-compose 실행은  위에 생성한 docker-compose.yml 파일 위치로 이동 후, 도커 컴포즈는 업,다운으로 실행합니다.

docker-compose up -d

실행 완료 화면입니다.

도커 컴포즈가 docker run 명령어를 대체했기에 이미지 2개와 실행중인 컨테이너를 확인할 수 있습니다.

 

docker-compose 실행이 안될 경우에는 아래를 참고하세요

더보기

윈도우는 WSL을 통해 우분투를 열고 명령어를 입력합니다.
$ sudo apt-get update
$ sudo apt-get install docker-compose-plugin

 

2. 카프카 

프로듀서는 토픽이라는 곳에 발송하고, 카프카 클러스터 내부에서 토픽을 지정하여 컨슈머는 구독 중인 토픽이 갱신되는지 기다렸다가 갱신되면 등록된 메시지를 가져옵니다. 사진처럼 여러개 컨슈머가 토픽을 구독할 수 있습니다.

 

2.1 터미널로 카프카 토피그 퍼블리셔, 컨슈머 확인

*# kafka 접속*
docker exec -it kafka bash

*# kafka 버전확인*
// 스프링부트와 연결 시 버전 정보가 매우 중요합니다
kafka-topics.sh --version

*# 토픽 생성*
//sample_topic_1은 토픽 이름, 서버 주소는 카프카 9092, replication-factor는 1개의 아파치 카프카 클러스터 
kafka-topics.sh --create --topic sample_topic_1 --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1

*# 토픽 목록 조회*
kafka-topics.sh --list --bootstrap-server localhost:9092
# 프로듀스 실행(토픽명: test_topic)
kafka-console-producer.sh --broker-list localhost:9092 --topic sample_topic_1
> 토픽 메세제 발행
>
# 컨슈머 실행
# --from-beginning 옵션은 해당 토픽의 맨 처음 메시지부터 확인 가능
kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic sample_topic_1

아래 퍼블리셔에서 메세지를 보내면 위 컨슈머에서 해당 메세지가 들어오는것을 확인할 수 있습니다.

3. 스프링부트 연동

gradle에서 kafka 의존성 설정을 진행한다. kafka 버전은 도커컴포즈로 생성한 버전과 맞춰야합니다.

카프카 버전이 위와 같다면 의존성 설정은 아래처럼 버전을 입력해주세요.
# kafka 버전 맞춰서 의존성 설정
implementation ('org.springframework.kafka:spring-kafka:2.8.1')