๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Kafka

Partitioner & Partition

by Soono991 2023. 4. 8.
๐Ÿ’ก ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” Partitioner & Partition์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

Topic์„ ์ƒ์„ฑํ•  ๋•Œ ํŒŒํ‹ฐ์…˜์„ ์ง€์ •ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•ด๋‹น ํ† ํ”ฝ์— ๋Œ€ํ•œ 1๊ฐœ์˜ ํŒŒํ‹ฐ์…˜์ด ์ƒ์„ฑ์ด ๋ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ํ† ํ”ฝ์€ 1๊ฐœ ์ด์ƒ์˜ ํŒŒํ‹ฐ์…˜์œผ๋กœ ๊ตฌ์„ฑ์ด ๋œ๋‹ค๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํŒŒํ‹ฐ์…˜์˜ ๊ทธ๋ฃน์ด๋ผ๊ณ  ๋งํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ถœ์ฒ˜: https://jyeonth.tistory.com/30

 

์œ„์™€ ๊ฐ™์ด ํ•˜๋‚˜์˜ ํ† ํ”ฝ์— ๋Œ€ํ•ด ํŒŒํ‹ฐ์…˜์ด ์—ฌ๋Ÿฌ ๊ฐœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์„ ๊ฒฝ์šฐ, ๊ฐ ํŒŒํ‹ฐ์…˜์€ 0๋ฒˆ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ ์ˆœ์ฐจ์ ์œผ๋กœ ์ด๋ฆ„์ด ์ง€์ •๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ด ํŒŒํ‹ฐ์…˜์— producer๊ฐ€ ๋ณด๋‚ผ ๋ฉ”์‹œ์ง€๊ฐ€ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

 

์•ž์„œ Producer ์ •๋ฆฌ ํฌ์ŠคํŒ…์—์„œ Producer๊ฐ€ kafka๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ผ ๋•Œ ํŠน์ • ํ† ํ”ฝ์œผ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ธ๋‹ค๊ณ  ํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์กฐ๊ธˆ ๋” ์ •ํ™•ํ•˜๊ฒŒ ๋งํ•˜์ž๋ฉด ํŠน์ • ํ† ํ”ฝ์œผ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํŠน์ • ํ† ํ”ฝ์˜ ํŠน์ • ํŒŒํ‹ฐ์…˜์œผ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿฐ๋ฐ ์œ„์™€ ๊ฐ™์ด ํŒŒํ‹ฐ์…˜์ด ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ์„ ๊ฒฝ์šฐ ํ”„๋กœ๋“€์„œ๊ฐ€ ์–ด๋Š ํŒŒํ‹ฐ์…˜์œผ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด์•ผ ํ• ์ง€ ๊ธฐ์ค€์„ ์ •ํ•ด์•ผ ํ•˜๋Š”๋ฐ, ์นดํ”„์นด์—์„œ๋Š” ๋ผ์šด๋“œ ๋กœ๋นˆ ๋ฐฉ์‹, ์Šคํ‹ฐํ‚ค ํŒŒํ‹ฐ์…”๋‹ ์ด 2๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋จผ์ € ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ผ ๋•Œ key๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ ํ•ด๋‹น key์˜ hash๊ฐ’์„ ํ†ตํ•ด ํŒŒํ‹ฐ์…˜์„ ํ• ๋‹นํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ key๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ์ฆ‰, key๊ฐ€ null์ผ ๊ฒฝ์šฐ์—๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด kafka ๋ฒ„์ „์— ๋”ฐ๋ผ ๊ธฐ๋ณธ ํŒŒํ‹ฐ์…”๋‹ ๋ฐฉ๋ฒ•์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

ใ†kafka 2.4 ๋ฒ„์ „ ์ด์ „ : Round Robin (๋ผ์šด๋“œ ๋กœ๋นˆ)
ใ†kafka 2.4 ๋ฒ„์ „ ์ดํ›„ : Sticky Partitioning (์Šคํ‹ฐํ‚ค ํŒŒํ‹ฐ์…”๋‹)

 

 

 

์ถœ์ฒ˜: https://www.confluent.io/blog/apache-kafka-producer-improvements-sticky-partitioner

์œ„ ๊ทธ๋ฆผ์˜ ์™ผ์ชฝ์ด ๋ผ์šด๋“œ ๋กœ๋นˆ ๋ฐฉ์‹์ด๊ณ  ์˜ค๋ฅธ์ชฝ์€ ์Šคํ‹ฐํ‚ค ํŒŒํ‹ฐ์…”๋‹ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

 

๋ผ์šด๋“œ ๋กœ๋นˆ์€ ๋ง ๊ทธ๋Œ€๋กœ ์ˆœ์ฐจ์ ์œผ๋กœ ๋Œ์•„๊ฐ€๋ฉฐ ๋ฉ”์‹œ์ง€๋ฅผ ์ „์†กํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด, ์Šคํ‹ฐํ‚ค ํŒŒํ‹ฐ์…”๋‹์€ ์ฒ˜์Œ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๋Š” ํŒŒํ‹ฐ์…˜์— ๊ณ„์† ๋ฉ”์‹œ์ง€๋ฅผ ๋ˆ„์ ํ•˜์—ฌ ๋จผ์ € batch๋ฅผ ์ฑ„์šฐ๋Š” ์ „๋žต์ž…๋‹ˆ๋‹ค.

 

์ด๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋จผ์ € kafka์˜ ๋ฐฐ์น˜ ์ „์†ก์ด๋ผ๋Š” ๊ฐœ๋…์„ ์ดํ•ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ๋Š” Producer ํฌ์ŠคํŒ…์—์„œ ์ •๋ฆฌํ•ด๋‘์—ˆ์œผ๋‹ˆ ์ฐธ๊ณ ํ•˜์‹œ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

kafka๋Š” ํ† ํ”ฝ์— ๋ฉ”์‹œ์ง€๋ฅผ ์ €์žฅํ–ˆ๋‹ค๊ณ  ํ•ด์„œ ์ฆ‰์‹œ kafka ์„œ๋ฒ„๋กœ ๋ณด๋‚ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํŒŒํ‹ฐ์…˜์— ๋ฉ”์‹œ์ง€๊ฐ€ ์ €์žฅ๋  ๋•Œ batch ๋˜๋Š” accumulator๋ผ๋Š” ์˜์—ญ์— ์ €์žฅ์ด ๋˜๋Š”๋ฐ ์ด ์˜์—ญ์ด ๊ฐ€๋“ ์ฐจ๊ฑฐ๋‚˜ ๋˜๋Š” ์ผ์ • ์‹œ๊ฐ„ ๋™์•ˆ ๊ธฐ๋‹ค๋ฆฐ ํ›„์— ๊ทธ๋•Œ๊นŒ์ง€ ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ํ•œ๊บผ๋ฒˆ์— ์ „์†กํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์œ„์™€ ๊ฐ™์ด ๋ผ์šด๋“œ ๋กœ๋นˆ ๋ฐฉ์‹์œผ๋กœ ํŒŒํ‹ฐ์…”๋‹์„ ํ•˜๊ฒŒ ๋˜๋ฉด ๋ฉ”์‹œ์ง€๋Š” ์ด 6๊ฐœ๊ฐ€ ์ €์žฅ๋˜์—ˆ์ง€๋งŒ ์•„์ง ์–ด๋Š ๊ณณ๋„ batch, accumulator ์˜์—ญ์ด ๊ฐ€๋“ ์ฐจ์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— kafka ์„œ๋ฒ„๋กœ ๋ฉ”์‹œ์ง€๊ฐ€ ์ „์†ก๋˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์Šคํ‹ฐํ‚ค ํŒŒํ‹ฐ์…”๋‹์€ ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ฒ˜์Œ ์ €์žฅ๋˜๋Š” ํŒŒํ‹ฐ์…˜์˜ batch๋ฅผ ๋จผ์ € ์ฑ„์›Œ ๋ฉ”์‹œ์ง€๊ฐ€ kafka ์„œ๋ฒ„๋กœ ์ „์†ก๋  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

 

์ด๋ฅผ ์ฝ”๋“œ๋กœ ํ™•์ธํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

๋ฉ”์‹œ์ง€๋ฅผ ํŠน์ • ํŒŒํ‹ฐ์…˜์— ์ €์žฅํ•˜๋„๋ก ํ•˜๋ ค๋ฉด ํ•ด๋‹น ๊ฐ์ฒด๋Š” Partitioner ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๊ตฌํ˜„์ฒด์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Kafka์—์„œ๋Š” ๋ผ์šด๋“œ ๋กœ๋นˆ ๋ฐฉ์‹, ์Šคํ‹ฐํ‚ค ํŒŒํ‹ฐ์…”๋‹ ๊ทธ๋ฆฌ๊ณ  ๊ธฐ๋ณธ ํŒŒํ‹ฐ์…”๋„ˆ๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

ใ†RoundRobinPartitioner: ๋ผ์šด๋“œ ๋กœ๋นˆ ๋ฐฉ์‹
ใ†UniformStickyPartitioner: ์Šคํ‹ฐํ‚ค ํŒŒํ‹ฐ์…”๋‹ ๋ฐฉ์‹
ใ†DefaultPartitioner: ๊ธฐ๋ณธ ํŒŒํ‹ฐ์…”๋„ˆ

 

๊ทธ๋ฆฌ๊ณ  ๊ธฐ๋ณธ ํŒŒํ‹ฐ์…”๋„ˆ์ธ DefaultPartitioner์˜ partition() ๋ฉ”์„œ๋“œ๋ฅผ ํ™•์ธํ•ด ๋ณด๋ฉด key๊ฐ€ null์ผ ๊ฒฝ์šฐ ์Šคํ‹ฐํ‚ค ํŒŒํ‹ฐ์…”๋‹ ๋ฐฉ์‹์„ ์ ์šฉํ•˜๋„๋ก ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

๋ผ์šด๋“œ ๋กœ๋นˆ ๋ฐฉ์‹์ด๋“ , ์Šคํ‹ฐํ‚ค ํŒŒํ‹ฐ์…”๋‹ ๋ฐฉ์‹์ด๋“  ๊ฒฐ๊ตญ ํ•ด๋‹น ํŒŒํ‹ฐ์…˜์˜ batch๊ฐ€ ๊ฐ€๋“ ์ฐจ๊ฒŒ ๋˜๋ฉด ๋‹ค์Œ ํŒŒํ‹ฐ์…˜์„ ์ง€์ •ํ•ด์•ผ ํ•˜๋Š”๋ฐ ์ด ๋ถ€๋ถ„์ด ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

KafkaProducer์—์„œ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๋Š” doSend() ๋ฉ”์„œ๋“œ๋ฅผ ํ™•์ธํ•ด ๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ๋กœ์ง์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

์ฒ˜์Œ ๋ฉ”์‹œ์ง€๋ฅผ ์ €์žฅํ•  ๋•Œ๋Š” accumulator์˜ append() ๋ฉ”์„œ๋“œ์— abortOnNewBatch๋ฅผ true๋กœ ์ „๋‹ฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

abortOnNewBatch๊ฐ€ true๋กœ ์ „๋‹ฌ๋  ๊ฒฝ์šฐ RecordAppendResult ๊ฐ์ฒด๋ฅผ ์ƒˆ๋กœ ์ƒ์„ฑํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•˜๋Š”๋ฐ ์ด๋•Œ abortForNewBatch ๊ฐ’์„ true๋กœ ์„ค์ •ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ฐ’์ด true๋กœ ์„ค์ •๋˜๋ฉด partitioner.onNewBatch() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๋ฉ”์‹œ์ง€๋ฅผ ์ €์žฅํ•  ๋‹ค์Œ ํŒŒํ‹ฐ์…˜์„ ๊ฐ€์ ธ์˜ค๋„๋ก ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ฒ˜์Œ ๋ฉ”์‹œ์ง€๋ฅผ ์ €์žฅํ•  ๋•Œ๋Š” ๋‹น์—ฐํžˆ ํŒŒํ‹ฐ์…˜์„ ์ง€์ •ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— abortOnNewBatch ๊ฐ’์„ true๋กœ ์„ค์ •ํ•˜์—ฌ ํŒŒํ‹ฐ์…˜์„ ๊ฐ€์ ธ์˜ค๋„๋ก ํ–ˆ์œผ๋ฉฐ, ์ดํ›„ ์—๋Š” abortOnNewBatch ๊ฐ’์„ false๋กœ ์ง€์ •ํ•˜์—ฌ ๊ฐ€์ ธ์˜จ ํŒŒํ‹ฐ์…˜์— ๊ณ„์†ํ•ด์„œ ๋ฉ”์‹œ์ง€๋ฅผ ์ €์žฅํ•˜๋„๋ก ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

Custom Partitioner

partitioner๋ฅผ ์ง์ ‘ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ์œ„์—์„œ ์„ค๋ช…ํ•œ Partitoner ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๊ตฌํ˜„์ฒด๋ฅผ ๋งŒ๋“ค๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  Producer property ์„ค์ •์— ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑํ•œ Partitioner์˜ class path๋ฅผ ์ž…๋ ฅํ•ด ์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

 

 

์ฐธ๊ณ  ์ž๋ฃŒ

'Kafka' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Consumer - 1  (0) 2023.04.16
Producer - 2  (0) 2023.04.09
kafka CLI ์‚ฌ์šฉํ•˜๊ธฐ - kafka-configs.(sh | bat)  (0) 2023.04.08
kafka CLI ์‚ฌ์šฉํ•˜๊ธฐ - kafka-consumer-group.(sh | bat)  (0) 2023.04.08
kafka CLI ์‚ฌ์šฉํ•˜๊ธฐ - kafka-dump-log  (0) 2023.04.04

๋Œ“๊ธ€