2022.10.26 - [Message Queue/Kafka] - [Kafka] Kafka Command-Line Tool(2) - kafka.topics.sh
[Kafka] Kafka Command-Line Tool(2) - kafka.topics.sh
kafka-topics.sh 이 커맨드 라인 툴을 통해 토픽(topic)과 관련된 명령을 실행할 수 있다. 토픽이란 카프카에서 데이터를 구분하는 가장 기본적인 개념이다. 마치 RDBMS에서 사용하는 테이블과 유사하다
ryeojin.tistory.com
지난번에 작성한 글에 이어서 실습한다.
생성된 hello.kafka 토픽에 데이터를 넣을 수 있는 kafka-console-producer.sh 명령어를 실행해 보자. 토픽에 넣는 데이터는 '레코드(record)'라고 부르며 메시지 키(key)와 메시지 값(value)으로 이루어져 있다.
메시지 키 없이 메시지 값 보내기
1
2
3
4
5
6
7
8
9
10
|
$ bin/kafka-console-producer.sh --bootstrap-server my-kafka:9092 --topic hello.kafka
>hello
>kafka
>0
>1
>2
>3
>4
>5
|
cs |
메시지 키는 자바의 null로 기본 설정되어 브로커로 전송된다.
키보드로 문자를 작성하고 엔터 키를 누르면 별다른 응답 없이 메시지 값이 전송된다. 주의할 점은 kafka-console-producer.sh로 전송되는 레코드 값은 UTF-8을 기반으로 Byte로 변환되고 ByteArraySerializer로만 직렬화된다는 점이다.
즉, String이 아닌 타입으로 직렬화하여 전송할 수 없다. 그러므로 텍스트 목적으로 문자열만 전송할 수 있고, 다른 타입으로 직렬화하여 데이터를 브로커로 전송하고 싶다면 카프카 프로듀서 애플리케이션을 직접 개발해야 한다.
키를 가지는 레코드를 전송
1
2
3
4
5
6
7
|
$ bin/kafka-console-producer.sh --bootstrap-server my-kafka:9092 \
--topic hello.kafka \
--property "parse.key=ture" \
--property "key.separator=:"
>key1:no1
>key2:no2
>key3:no3
|
cs |
1. parse.key를 true로 두면 레코드를 전송할 때 메시지 키를 추가할 수 있다.
2. 메시지 키와 메시지 값을 구분하는 구분자를 선언한다.
key.separator를 선언하지 않으면 기본 설정은 Tab delimiter(\t)이다. 그러므로 key.separator를 선언하지 않고 메시지를 보내려면 메시지 키를 작성하고 탭 키를 누른 뒤 메시지 값을 작성하고 엔터를 누른다. 여기서는 명시적으로 확인하기 위해 콜론(:)을 구분자로 선언했다. 만약 key.separator로 사용하는 구분자를 넣지 않고 엔터를 누르면 KafkaException과 함께 종료된다.
메시지 키와 메시지 값을 함께 전송한 레코드는 토픽의 파티션에 저장된다. 메시지 키가 null인 경우에는 프로듀서가 파티션으로 전송할 때 레코드 배치 단위(레코드 전송 묶음)로 라운드 로빈으로 전송된다. 메시지 키가 존재하는 경우에는 키의 해시값을 작성하여 존재하는 파티션 중 한 개에 할당된다. 이로 인해 메시지 키가 동일한 경우에는 동일한 파티션으로 전송된다. 다만, 이런 메시지 키와 파티션 할당은 프로듀서에서 설정된 파티셔너에 의해 결정되는데, 기본 파티셔너의 경우 이와 같은 동작은 보장한다. 커스텀 파티셔너를 사용할 경우에는 메시지 키에 따른 파티션 할당이 다르게 동작할 수도 있으니 참고하는 것이 좋다.
메시지 키를 가진 레코드의 경우 파티션이 추가되면 파티션과 메시지 키의 일관성이 보장되지 않는다. 즉, 이전에 메시지 키가 파티션 0번에 들어갔었다면 파티션을 늘린 뒤에는 파티션 0번으로 간다는 보장이 없다. 만약 파티션을 추가하더라도 이전에 사용하던 메시지 키의 일관성을 보장하고 싶다면 커스텀 파티셔너를 만들어서 운영해야 한다.
'Message Queue > Kafka' 카테고리의 다른 글
[Kafka] Kafka Command-Line Tool(5) - kafka-consumer-groups.sh (0) | 2022.10.26 |
---|---|
[Kafka] Kafka Command-Line Tool(4) - kafka-console-consumer.sh (0) | 2022.10.26 |
[Kafka] Kafka Command-Line Tool(2) - kafka.topics.sh (0) | 2022.10.26 |
[Kafka] Kafka Command-Line Tool(1) - 설정 (0) | 2022.10.26 |