대용량 메시지 처리 큐 시스템인 아파치 카프카를 설치해 보고, 간단하게 메시지 전달과 수신에 대해서 테스트를 진행해 본다.
1. 아파치 카프카는 무엇인가?
대용량, 대규모 메시지 데이터를 빠르게 처리할 수 있도록 개발된 메시지 큐잉 플랫폼이라고 간단하게 정의할 수 있다.
대용량 처리를 위해 ZooKeeper 기반 분산 서버 운영 환경을 지원한다.
처음 링크드인에서 내부 서비스를 위해 개발하여 사용하다가 2011년 초에 아파치 공식 오픈 소스로 세상에 공개되었다.
아파치 카프카는 기업에서 필요한 모든 데이터 시스템 및 서비스의 중앙 플랫폼 역할로 서비스 기반 아키텍처(SOA, Service Oriented Architecture)를 위한 핵심 구성 요소인 엔터프라이즈 서비스 버스(ESB, Enterprise Service Bus)를 쉽게 구현할 수 있도록 한다.
2. 카프카 동작 방식은?
카프카는 기본적으로 메시징 서버로 동작하며, 메시지 보내느 메커니즘 중에 PUB/SUB 모델을 기반으로 하하고 있다.
보내는 측인 Producer, 받는 측인 Consumer로 구성하여 메시지를 전달하고 받는 구조를 제공한다.
동작 방식에 대한 도식화된 그림은 아래와 같다.
3.설치 환경
- OS: Mac OS High Sierra 10.13.4
- PC: MacBook Pro (Retina, 13-inch, Mid 2014)
4. 카프카 다운로드
아래의 사이트에서 다운로드 할 수 있다.
https://kafka.apache.org/downloads
카프카 설치를 위해 카프카 1.1.0 버전의 패키지 중에 Scala 2.12 기반 버전을 다운 받았다.
다운로드 후에 압축을 풀면 kafka_2.12-1.1.0 디렉토리를 확인할 수 있다.
5. JDK 설치
카프카는 Scala 언어로 개발되어 카프카 실행을 위해서는 JVM이 설치되어야 한다.
JDK 8 버전을 설치하자.
아래 다운로드 페이지에서 다운로드하여 설치하도록 한다.
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
※ 혹시 JDK 8 이상 버전을 사용하시면 JDK 8을 설치하여 사용하는게 정신 건강에 이롭다.
상위버전을 사용하면 ZooKeeper 실행 시 아래와 같은 오류 메시지를 확인할 수 있다.
bin/zookeeper-server-start.sh config/zookeeper.properties
Unrecognized VM option 'PrintGCDateStamps'
6. ZooKeeper 설정 및 실행
카프카 다운받고 압축해제 한 후 카프카 디렉토리로 이동하면 아래와 같은 폴더로 되어 있다.
~/kafka_2.12-1.1.0 » ls
LICENSE bin
NOTICE config libs logs site-docs
~/kafka_2.12-1.1.0
카프카 설치 디렉토리에서 아래와 같이 입력하면 ZooKeeper가 실행된다.
bin/zookeeper-server-start.sh config/zookeeper.properties
정상적으로 실행되면 아래와 같은 메시지가 출력된다.
[2018-05-16 11:48:48,523] INFO binding to port 0.0.0.0/0.0.0.0:2181 (org.apache.zookeeper.server.NIOServerCnxnFactory)
※ 여러 대의 서버로 ZooKeeper를 구성하고자 한다면 아래의 링크를 참조하여 구성하면 된다.
http://programist.tistory.com/entry/Apache-Kafka-%ED%81%B4%EB%9F%AC%EC%8A%A4%ED%84%B0%EB%A7%81-%EA%B5%AC%EC%B6%95-%EB%B0%8F-%ED%85%8C%EC%8A%A4%ED%8A%B8
7. 카프카 실행
카프카 설치 디렉토리에서 아래와 같이 입력하면 아파치 카프카가 실행된다.
bin/kafka-server-start.sh config/server.properties
정상적으로 실행되면 아래와 같은 메시지가 출력된다.
[2018-05-16 11:59:58,654] INFO Kafka version : 1.1.0 (org.apache.kafka.common.utils.AppInfoParser)
[2018-05-16 11:59:58,654] INFO Kafka commitId : fdcf75ea326b8e07 (org.apache.kafka.common.utils.AppInfoParser)
[2018-05-16 11:59:58,658] INFO [KafkaServer id=0] started (kafka.server.KafkaServer)
[2018-05-16 11:59:58,706] INFO [ReplicaAlterLogDirsManager on broker 0] Added fetcher for partitions List() (kafka.server.ReplicaAlterLogDirsManager)
※ 여러 대의 서버로 카프카를 구성하고자 한다면 아래의 링크를 참조하여 구성하면 된다.
http://programist.tistory.com/entry/Apache-Kafka-%ED%81%B4%EB%9F%AC%EC%8A%A4%ED%84%B0%EB%A7%81-%EA%B5%AC%EC%B6%95-%EB%B0%8F-%ED%85%8C%EC%8A%A4%ED%8A%B8
8. 토픽 관리
토픽 생성
아래의 명령어를 입력하여 토픽을 생성할 수 있다.
~/kafka_2.12-1.1.0 » bin/kafka-topics.sh -create -zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test
Created topic "test".
토픽 확인
아래의 명령어를 입력하면 생성된 토픽 리스트를 확인 할 수 있다.
~/kafka_2.12-1.1.0 » bin/kafka-topics.sh --list --zookeeper localhost:2181
test
토픽 삭제
아래의 명령어를 입력하면 원하는 토픽을 삭제할 수 있다.
~/kafka_2.12-1.1.0 » bin/kafka-topics.sh --delete --zookeeper localhost:2181 --topic test
9. 메시지 송신 및 수신
Producer 실행
Producer는 아래와 같이 실행할수 있다.
test라는 토픽을 구독하는 Consumer에게 보내겠다고 브로커에게 메시지를 보내는 것이다.
bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test
Consumer 실행
Consumer는 아래와 같이 실행할 수 있다.
test라는 토픽에 메시지가 들어오면 받겠다는 것이다.
bin/kafka-console-consumer.sh -zookeeper localhost:2181 --topic test --from-beginning
메시지 전송
Producer 콘솔창에 보내고자 하는 메시지를 입력하면 아래와 같이 Consumer 콘솔창에 메시지가 수신되어 나타난다.
Using the ConsoleConsumer with old consumer is deprecated and will be removed in a future major release. Consider using the new consumer by passing [bootstrap-server] instead of [zookeeper].
msg 1