Partition이란?
- 큐(메시지를 임시로 저장할 수 있는 공간)를 여러개로 늘려서 병렬 처리를 가능하게 하는 기본 단위이다.
- 즉, Topic을 여러개의 물리적 단위로 분할한 것.
이러한 Partition이라는 개념이 Kafka에서 주는 장점은 다음과 같다.
- 여러개의 Consumer가 각각의 파티션을 병렬적으로 읽기 때문에 처리 속도가 향상된다.
- 파티션 수와 Consumer 수를 늘려서 데이터 처리량 향상
- 수평적 확장 가능
Partition 수는 토픽을 생성할 때 설정할 수 있다.
$ bin/kafka-topics.sh \
--bootstrap-server <kafka 주소> \
--create \
--topic <토픽명> \
--partitions <파티션 수>
나는 email.send라는 Topic에 Partition을 3개 생성했고, Partition이 잘 생성된 것을 명령어를 통해 확인 가능했다.
파티션 수를 늘리는 명령어는 다음과 같다.
$ bin/kafka-topics.sh \
--bootstrap-server <kafka 주소> \
--alter \
--topic <토픽명> \
--partitions <변경할 최종 파티션 수>
※ 여기서 주의할 점은 파티션의 수를 늘릴 수는 있지만 줄이는 명령어는 존재하지 않는다.※
따라서 Topic의 Partition수를 정할때 신중하게 결정할 필요가 있다.
Consumer에서 병렬처리 테스트
여러 Consumer에서 Topic의 메시지를 병렬적으로 처리하는 것을 확인하기 위해서 Consumer 서버를 두개 실행시켜서 확인해봤다.
두개의 Consumer 서버를 실행시키면 로그를 통해 해당 Topic의 어떤 Partition을 각 Consumer가 할당 받았는지 확인 가능하다.
Consumer - 0 (email.send Topic의 0번,1번 Partition을 할당받음)
email-send-group: partitions assigned: [email.send-0, email.send-1]
Consumer - 1 (email.send Topic의 2번 Partition을 할당받음)
email-send-group: partitions assigned: [email.send-2]
메시지가 Partition에 분산되는 방식
key가 포함되지 않은 메시지를 넣을 경우
- Kafka 2.4 Ver 이전 : Round Robin 방식으로 메시지를 차례대로 하나씩 분산했다.
- Kafka 2.4 Ver 이후 : 스티키 파티셔닝(배치 단위로 처리하기 위해 하나의 파티션에 메시지가 일정량이 채워져야만 그 다음 파티션에 메시지를 저장) 방식으로 메시지를 분산
key가 포함된 메시지를 넣을 경우
- key의 해시 값을 기반으로 파티션을 결정해서 메시지를 분배한다.
나는 Key가 포함되지 않은 메시지를 넣었고 별다른 설정을 안했기 때문에 스티키 파티셔닝에 의해 메시지가 Partition에 분산되고 있을 것이다.
명령어를 통해 확인해보면 Partition 1에 메시지가 우선적으로 할당되는 것을 확인할 수 있었다.
bin/kafka-console-consumer.sh \
--bootstrap-server localhost:9092 \
--topic email.send \
--from-beginning \
--property print.partition=true
그런데 대규모 데이터를 전송할 경우 데이터를 여러곳에 흩뿌리는 방식이 아닌 한 Partition에 모아서 보내는 스티키 파티셔닝이 전송횟수가 줄어들어 좀더 효율적일 수 있지만,
작은 규모의 데이터를 처리할때는 하나의 파티션에 메시지가 몰려서 비효율적일 수 있다.
그래서 Round Robin방식으로 변경해서 처리해야하는 경우도 있다.
메시지를 Round Robin 방식으로 Partition에 할당하기 위해서는 Producer의 application.yml을 수정해주면 된다.
<application.yml>
spring:
kafka:
bootstrap-servers: 43.200.43.104:9092
producer:
key-serializer: org.apache.kafka.common.serialization.StringSerializer
value-serializer: org.apache.kafka.common.serialization.StringSerializer
properties:
partitioner.class: org.apache.kafka.clients.producer.RoundRobinPartitioner
이렇게 변경후 메시지를 전송하면 Partition 0,1,2를 돌아가면서 할당되는 것을 확인 가능하다.
'BackEnd > Kafka' 카테고리의 다른 글
[Kafka] Dead Letter Topic (2) | 2025.08.14 |
---|---|
Spring Boot + Kafka 메시지 테스트 (2) | 2025.08.14 |
Kafka란? (1) | 2025.08.12 |