[E-commerce App] Apache Kafka 설치 및 사용(Producer/Consumer)
개요
Kafka 사용 이전
- End-to-End 연결 방식의 아키텍처
- 데이터 연동의 복잡성 증가 (HW, 운영체제, 장애 등)
- 서로 다른 데이터 Pipeline 연결 구조
- 확장이 어려운 구조
Kafka의 도입
Apache Kafka를 사용함으로써 메시지를 보내는 쪽(Producer)은 누가 받는 지에 대해 신경쓰지 않고,
메시지를 받는 쪽(Consumer)은 누가 보냈는 지에 대해 전혀 신경쓰지 않고 메시지를 주고 받을 수 있다.
- Producer/Consumer 분리
- 메시지를 여러 Consumer에게 허용
- 높은 처리량을 위한 메시지 최적화
- Scale-out 가능 (Kafka가 clustering 구조이기 때문)
- Eco-system
Kafka Broker
- 실행된 Kafka 애플리케이션 서버
- 3대 이상의 Broker Cluster 구성
- Zookeeper 연동
- 역할: 메타데이터 (Broker ID, Controller ID 등) 저장
- Controller 정보 저장 - n개 Broker 중 1대는 Controller 기능 수행
Controller의 역할?
- 각 Broker에게 담당 파티션 할당 수행
- Broker 정상 동작 모니터링 관리
Apache Kafka 설치
Kafka 홈페이지
http://kafka.apache.org
나는 아래 버전을 다운했다. (Windows와 MacOS 상관없이 다운 받아도 된다고 한다.)
압축 파일을 다운 받은 후, 원하는 곳으로 옮겨 압축을 해제하면 아래와 같은 디렉토리들을 확인할 수 있다.
설정
압축을 푼 폴더에 가서 /config/server.properties
파일을 vim혹은 vscode로 연다.
$ cd config
$ code server.properties # 설정 변경
그리고 listenres
, advertised-listener
, listenr.security
부분을 활성화 시켜주고 아래와 같이 설정한다.
참고로 아래 첫 번째 블로그에서는 vi ~/.zshrc
커맨드로 환경변수도 추가했는데, 나는 하지 않았다.
참고
Apache Kafka 사용
Ecosystem - 1. Kafka Client
- Kafka와 데이터를 주고받기 위해 사용하는 Java Library
- https://mvnrepository.com/artifact/org.apache.kafka/kafka-clients - Producer, Consumer, Admin, Stream 등 Kafka 관련 API 제공
- 다양한 3rd party library 존재: C/C++, Node.js, Python, .NET 등
- https://cwiki.apache.org/confluence/display/KAFKA/Clients
Kafka 서버 구동 및 Topic 생성
압축 푼 폴더로 이동 후 아래 커맨드를 실행한다.
zookeeper 서버를 먼저 구동한 뒤에 kafka 서버를 구동하고, 새로운 topic을 생성해보자.
# Zookeeper 서버 구동
$ ./bin/zookeeper-server-start.sh ./config/zookeeper.properties
# Kafka 서버 구동
$ ./bin/kafka-server-start.sh ./config/server.properties
# Topic 생성
$ ./bin/kafka-topics.sh --bootstrap-server localhost:9092 --create -topic quickstart-events --partitions 1
# Topic 목록 확인
$ ./bin/kafka-topics.sh --bootstrap-server localhost:9092 --list
# Topic 정보 확인
$ ./bin/kafka-topics.sh --bootstrap-server localhost:9092 --describe --topic quickstart-events
quickstart-events
라는 이름으로 토픽을 생성한 뒤, 이를 확인해보자.
kafka는 producer 쪽에서 메시지를 보내면, 그 메시지는 Topic 이라는 곳에 저장된다.
해당 Topic을 구독한 consumer는 Topic에 새로운 메시지가 들어올 때, 일괄적으로 전달받을 수 있다.
따라서, 보내는 쪽(producer)과 받는 쪽(consumer)은 상대가 누구인지 신경쓰지 않고, Topic을 상대로 한다.
메시지 생산 및 소비
압축 푼 폴더로 이동 후 아래 커맨드를 실행한다.
# 메시지 생산(produce)
$ ./bin/kafka-console-producer.sh --broker-list localhost:9092 --topic quickstart-events
# 메시지 소비(consume)
$ ./bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic quickstart-events --from-beginning
--from-beginning
은 모든 메시지를 처음부터 얻어오겠다는 의미이다.
두 개의 콘솔로 테스트해보자.
producer가 메시지를 전달하면, consumer 쪽에서 바로바로 받아오는 것을 확인할 수 있다.
이번에는 하나의 콘솔창을 추가로 열어서,
이전과 같이 ./bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic quickstart-events --from-beginning
커맨드로 두 번째 consumer를 등록해보자.
맨 아래에 보이는게 두 번째로 만든 consumer인데, --from-beginning
옵션 때문에 처음 메시지부터 가져오는 것을 확인할 수 있다.
그리고 producer가 hello second consumer
라는 메시지를 토픽에 전달하니, 두 개의 consumer에서 동시에 받아오는 것을 확인할 수 있다.
💛 개인 공부 기록용 블로그입니다. 👻