환경구축
$ git clone https://github.com/wurstmeister/kafka-docker
$ cd [git clone한 위치]
$ vim docker-compose-single-broker.yml
$ docker-compose -f docker-compose-single-broker.yml up -d
- docker-compose-single-broker.yml에서
KAFKA_ADVERTISED_HOST_NAME: 127.0.0.1
로 변경
- 2개 컨테이너(kafka-docker_kafka_1, kafka-docker_zookeeper_1) 띄워진거 확인

(참고) docker-compose-single-broker.yml 최종상태
version: '2'
services:
zookeeper:
image: wurstmeister/zookeeper
ports:
- "2181:2181"
kafka:
build: .
ports:
- "9092:9092"
environment:
KAFKA_ADVERTISED_HOST_NAME: 127.0.0.1
KAFKA_CREATE_TOPICS: "test:1:1"
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
volumes:
- /var/run/docker.sock:/var/run/docker.sock
프로듀서/컨슈머 simple 테스트
$ cd ~/kafka_practice/temp/kafka_2.13-2.7.0/bin
$ ./kafka-console-producer.sh --bootstrap-server localhost:9092 --topic test
$ ./kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test
(Practice1) 프로듀서 띄운 상태에서 java파일 simple-kafka-consumer 테스트
$ ./kafka-console-producer.sh --bootstrap-server localhost:9092 --topic test
- 인텔리제이로
SimpleConsumer.java
실행
- 경로 : ~/kafka_practice/practice_dvwy/tacademy-kafka/simple-kafka-consumer
- 실행되서 레코드 가져오는 모습

(Practice2) kafka-consumer-auto-commit 실습
- Practice1과 동일한 상태에서 이클립스에서 run해서 실습하면 됨
- 커맨드쉘에서 띄운 프로듀서에서 데이터 넣고 ⇒ 인텔리제이로 띄운
kafka-consumer-auto-commit
프로듀서에 잘 찍히는지 확인
- 60초 되기전에 이클립스에서 돌아가고있는 consumer 꺼버리고 재실행시키면 ⇒ commit이 된게 아니기때문에 이클립스 화면에 보냈던 레코드들이 다시 찍히는 것을 확인할 수 있음 ⇒ 이건 중복처리되는거나 마찬가지
- 그렇다면 중복 or 유실을 방지하기 위해서는 어떤식으로 세팅해야할까?
- 데이터에 timestamp값을 실어서 보내면 최종 적재단계에서 distinct 하게 넣으면 됨 ⇒ 이렇게 해서 리밸런스(에러 발생시 파티션<>컨슈머 재배치)할때, 유실/중복을 방지해줄 수 있음
(Practice3) kafka-consumer-auto-commit 실습
- Practice2에서 발생한 중복
- 인텔리제이로 kafka-consumer-sync-commit 파일 실행키고 ⇒ 커맨드쉘에서 띄운 프로듀서에서 데이터 넣고 ⇒ 다시 끄고 실행했을때 ⇒ 방금 집어넣은 데이터가 print안되면 정상적으로 잘 commit이 된 것을 확인해 볼 수 있음
(Practice4) kafka-consumer-multi-thread 실습
- 이전 파일과 다르게 ConsumerWithMultiThread, ConsumerWorker 이렇게 파일이 2개 있음

- 실습할때 아래 스샷처렴 thread-2만 떳는데 partition이 하나밖에 없어서 그랬음
- 따라서 실습전에 파티션이 3개 맞는지 확인해보고 할 것
