Skip to content

Latest commit

ย 

History

History
369 lines (191 loc) ยท 12.6 KB

Kafka_Consumer.md

File metadata and controls

369 lines (191 loc) ยท 12.6 KB

Kafka Consumer



Properties ์„ค์ •

Properties ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ Kafka ์„œ๋ฒ„์™€ ๊ด€๋ จ๋œ ์„ค์ •์„ ํ•œ๋‹ค.


bootstrap.servers

Kafka ํด๋Ÿฌ์Šคํ„ฐ์— ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์ฃผ์†Œ๋‹ค.

์—ฌ๊ธฐ์„œ๋Š” "localhost:9092"๋กœ ๋กœ์ปฌ์—์„œ ์‹คํ–‰ ์ค‘์ธ Kafka ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•œ๋‹ค.


group.id

Consumer Group์˜ ID๋ฅผ ์„ค์ •ํ•œ๋‹ค.

Consumer Group์€ ์—ฌ๋Ÿฌ Consumer ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฌถ์–ด ์ฒ˜๋ฆฌ๋Ÿ‰์„ ํ™•์žฅํ•˜๊ฑฐ๋‚˜ ๋ฉ”์‹œ์ง€๋ฅผ ๋ถ„๋ฐฐํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.


key.deserializer์™€ value.deserializer

Kafka ๋ฉ”์‹œ์ง€๋Š” ํ‚ค์™€ ๊ฐ’์˜ ์Œ์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

์ด๋“ค์€ Kafka๋กœ๋ถ€ํ„ฐ ๋ฉ”์‹œ์ง€๋ฅผ ์ˆ˜์‹ ํ•  ๋•Œ ์–ด๋–ป๊ฒŒ ์ง๋ ฌํ™” ํ•ด์ œํ• ์ง€ ๊ฒฐ์ •.

์œ„์—์„œ๋Š” ๋ฌธ์ž์—ด๋กœ ์ง๋ ฌํ™” ํ•ด์ œํ•˜๋Š” StringDeserializer๋ฅผ ์‚ฌ์šฉ.



KafkaConsumer ์ƒ์„ฑ

์œ„์—์„œ ์ •์˜ํ•œ properties๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ KafkaConsumer ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.


consumer.subscribe()

Consumer๊ฐ€ ๋ฉ”์‹œ์ง€๋ฅผ ์ˆ˜์‹ ํ•  ํ† ํ”ฝ์„ ๊ตฌ๋…ํ•œ๋‹ค. ์œ„ ์˜ˆ์ œ์—์„œ๋Š” "simple"์ด๋ผ๋Š” ํ† ํ”ฝ์„ ๊ตฌ๋…ํ•œ๋‹ค.


๋ฉ”์‹œ์ง€ ์ˆ˜์‹ 

while ๋ฃจํ”„ ๋‚ด์—์„œ consumer.poll() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Kafka๋กœ๋ถ€ํ„ฐ ๋ฉ”์‹œ์ง€๋ฅผ ์ˆ˜์‹ ํ•œ๋‹ค.

poll() ๋ฉ”์„œ๋“œ๋Š” ์ง€์ •๋œ ์‹œ๊ฐ„ ๋™์•ˆ ๋ฉ”์‹œ์ง€๋ฅผ ๋Œ€๊ธฐํ•˜๋ฉฐ, ์—ฌ๊ธฐ์„œ๋Š” 100๋ฐ€๋ฆฌ์ดˆ ๋™์•ˆ ๋Œ€๊ธฐํ•œ๋‹ค.

์ˆ˜์‹ ๋œ ๊ฐ ๋ฉ”์‹œ์ง€(๋ ˆ์ฝ”๋“œ)์— ๋Œ€ํ•ด, ๊ทธ ๋‚ด์šฉ์„ ์ถœ๋ ฅํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ๋ฉ”์‹œ์ง€์˜ ๊ฐ’, ํ† ํ”ฝ, ํŒŒํ‹ฐ์…˜ ๋ฒˆํ˜ธ, ์˜คํ”„์…‹์„ ์ถœ๋ ฅํ•œ๋‹ค.


consumer.close()

์ž‘์—…์ด ๋๋‚˜๋ฉด Consumer๋ฅผ ์ข…๋ฃŒํ•œ๋‹ค.


์ด ์ฝ”๋“œ๋Š” Kafka์—์„œ ๋ฉ”์‹œ์ง€๋ฅผ ์ˆ˜์‹ ํ•˜๋Š” ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค€๋‹ค.





1๏ธโƒฃ

Consumer Group A ๋‚ด์—๋Š” Consumer1 ํ•˜๋‚˜๋งŒ ์กด์žฌํ•˜๋ฉฐ, ์ด Consumer๋Š” ๋‘ ๊ฐœ์˜ ํŒŒํ‹ฐ์…˜ ๋ชจ๋‘์—์„œ ๋ฉ”์‹œ์ง€๋ฅผ ์ˆ˜์‹ ํ•˜๊ณ  ์žˆ๋‹ค.


2๏ธโƒฃ

ํŒŒํ‹ฐ์…˜์€ ์ด์ œ ๋‘ Consumer ์‚ฌ์ด์— ๊ท ๋“ฑํ•˜๊ฒŒ ๋ถ„๋ฐฐ๋œ๋‹ค. Consumer1์€ topic1 - p0 ํŒŒํ‹ฐ์…˜์—์„œ, Consumer2๋Š” topic1 - p1 ํŒŒํ‹ฐ์…˜์—์„œ ๋ฉ”์‹œ์ง€๋ฅผ ์ˆ˜์‹ ํ•œ๋‹ค.


3๏ธโƒฃ

์ฃผ์˜ํ•  ์ ์€ ํ˜„์žฌ ํ† ํ”ฝ topic1์—๋Š” ํŒŒํ‹ฐ์…˜์ด 2๊ฐœ๋งŒ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ํ•œ Consumer๋Š” ํŒŒํ‹ฐ์…˜์„ ํ• ๋‹น๋ฐ›์ง€ ๋ชปํ•œ๋‹ค. ๋”ฐ๋ผ์„œ Consumer1๊ณผ Consumer2๋Š” ๊ฐ๊ฐ ํ•˜๋‚˜์˜ ํŒŒํ‹ฐ์…˜์—์„œ ๋ฉ”์‹œ์ง€๋ฅผ ๊ณ„์† ์ˆ˜์‹ ํ•˜๋ฉฐ, Consumer3๋Š” ํŒŒํ‹ฐ์…˜์„ ํ• ๋‹น๋ฐ›์ง€ ๋ชปํ•ด ๋ฉ”์‹œ์ง€๋ฅผ ์ˆ˜์‹ ํ•˜์ง€ ์•Š๋Š”๋‹ค.





์œ„ ์ด๋ฏธ์ง€๋Š” ์นดํ”„์นด Consumer์˜ ๋™์ž‘ ์›๋ฆฌ ์ค‘, ์˜คํ”„์…‹ ๊ด€๋ฆฌ์™€ ๋ฉ”์‹œ์ง€ ๊ฐ€์ ธ์˜ค๊ธฐ์˜ ๊ณผ์ •์„ ๊ฐ„๋žตํžˆ ๋‚˜ํƒ€๋‚ด๊ณ  ์žˆ๋‹ค.

poll ํ˜ธ์ถœ์„ ํ†ตํ•ด ๋ฉ”์‹œ์ง€๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ๋งˆ๋‹ค, Consumer๋Š” ์–ด๋””๊นŒ์ง€ ๋ฉ”์‹œ์ง€๋ฅผ ์ฝ์—ˆ๋Š”์ง€(์ด์ „ ์ปค๋ฐ‹ ์˜คํ”„์…‹), ๊ทธ๋ฆฌ๊ณ  ์–ด๋””๊นŒ์ง€ ๋ฉ”์‹œ์ง€๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ๋Š”์ง€(์˜คํ”„์…‹ ์ปค๋ฐ‹)๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋ฉฐ ๋™์ž‘ํ•œ๋‹ค.





์œ„ ์ด๋ฏธ์ง€๋Š” ์นดํ”„์นด(Kafka)์—์„œ์˜ Consumer ๋™์ž‘ ๋ฐฉ์‹ ์ค‘ ์˜คํ”„์…‹ ์ดˆ๊ธฐํ™” ์ „๋žต(auto.offset.reset ์†์„ฑ)์— ๊ด€ํ•œ ๋‚ด์šฉ์„ ์„ค๋ช….


auto.offset.reset ์„ค์ • ์˜ต์…˜


earliest

๊ฐ€์žฅ ์ดˆ๊ธฐ์˜ ์˜คํ”„์…‹๋ถ€ํ„ฐ ๋ฉ”์‹œ์ง€๋ฅผ ์‹œ์ž‘ํ•˜์—ฌ ๊ฐ€์ ธ์˜จ๋‹ค. ์œ„ ์ด๋ฏธ์ง€์—์„œ๋Š” 0์ด๋ผ๋Š” ์œ„์น˜๋กœ ํ‘œ์‹œ๋˜์–ด ์žˆ๋‹ค. ์ด ์„ค์ •์€ Consumer๊ฐ€ ์ฒ˜์Œ ์‹œ์ž‘๋  ๋•Œ๋‚˜, ์ €์žฅ๋œ ์˜คํ”„์…‹์ด ๋” ์ด์ƒ ์œ ํšจํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ(์˜ˆ: ํ•ด๋‹น ์˜คํ”„์…‹์˜ ๋ฉ”์‹œ์ง€๊ฐ€ ์ด๋ฏธ ์‚ญ์ œ๋œ ๊ฒฝ์šฐ) ์‚ฌ์šฉ๋œ๋‹ค.


latest

๊ฐ€์žฅ ์ตœ๊ทผ์˜ ์˜คํ”„์…‹๋ถ€ํ„ฐ ๋ฉ”์‹œ์ง€๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค. ์ด๋Š” Consumer๊ฐ€ ๋™์ž‘ ์ค‘์ผ ๋•Œ ์ƒˆ๋กœ์šด ๋ฉ”์‹œ์ง€๋งŒ ๊ฐ€์ ธ์˜ค๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.


none

์ด ์„ค์ •์€ ์ €์žฅ๋œ ์˜คํ”„์…‹์ด ์—†์„ ๋•Œ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ค. ์ฆ‰, ์ €์žฅ๋œ ์˜คํ”„์…‹ ์ •๋ณด๊ฐ€ ์—†๊ฑฐ๋‚˜ ์œ ํšจํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ Consumer๋Š” ๋™์ž‘์„ ์ค‘์ง€ํ•˜๊ฒŒ ๋œ๋‹ค.



์œ„ ์„ค์ •์€ Consumer๊ฐ€ ๋ฉ”์‹œ์ง€๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์‹œ์ž‘ํ•˜๋Š” ์œ„์น˜๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, earliest๋ฅผ ์„ค์ •ํ•˜๋ฉด Consumer๋Š” ํ† ํ”ฝ์˜ ์‹œ์ž‘๋ถ€ํ„ฐ ๋ชจ๋“  ๋ฉ”์‹œ์ง€๋ฅผ ๊ฐ€์ ธ์˜ค๊ฒŒ ๋˜๋ฉฐ, latest๋ฅผ ์„ค์ •ํ•˜๋ฉด Consumer๋Š” ๊ฐ€์žฅ ์ตœ๊ทผ์— ์ถ”๊ฐ€๋œ ๋ฉ”์‹œ์ง€๋งŒ ๊ฐ€์ ธ์˜ค๊ฒŒ ๋œ๋‹ค.

์ด๋Ÿฌํ•œ ์„ ํƒ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์š”๊ตฌ์‚ฌํ•ญ๊ณผ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์ „๋žต์— ๋”ฐ๋ผ ๊ฒฐ์ •๋œ๋‹ค.





์œ„ ์ด๋ฏธ์ง€๋Š” ์นดํ”„์นด(Kafka) Consumer์˜ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ(fetch) ๊ด€๋ จ ์„ค์ •์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๊ณ  ์žˆ๋‹ค.


fetch.min.bytes

Consumer๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์‹œ์ž‘ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ์ตœ์†Œ ๋ฐ”์ดํŠธ ์ˆ˜๋‹ค.

๊ธฐ๋ณธ๊ฐ’: 1 : ์ด๋Š” Consumer๊ฐ€ ์ตœ์†Œ 1๋ฐ”์ดํŠธ์˜ ๋ฐ์ดํ„ฐ๋งŒ ์žˆ์–ด๋„ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

์ฃผ์š” ํฌ์ธํŠธ: ๊ธฐ๋ณธ๊ฐ’ ์„ค์ •์„ ๋†’๊ฒŒ ํ•˜๋ฉด, Consumer๋Š” ๋” ํฐ ์–‘์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์Œ“์ผ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ ๋‹ค์Œ ๊ฐ€์ ธ์˜ค๊ฒŒ ๋œ๋‹ค. ์ด๊ฐ™์€ ๋ฐฉ๋ฒ•์€ ๋„คํŠธ์›Œํฌ I/O๋ฅผ ์ค„์ด๊ณ  ํšจ์œจ์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•œ ์ „๋žต์œผ๋กœ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค.


fetch.max.wait.ms

Consumer๊ฐ€ fetch.min.bytes ์„ค์ •์— ๋”ฐ๋ฅธ ์ตœ์†Œ ๋ฐ”์ดํŠธ ์ˆ˜๋ฅผ ์ถฉ์กฑํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ตœ๋Œ€ ์‹œ๊ฐ„์ด๋‹ค.

๊ธฐ๋ณธ๊ฐ’: 500 ๋ฐ€๋ฆฌ์ดˆ(ms)

์ฃผ์š” ํฌ์ธํŠธ: ๋งŒ์•ฝ ์„ค์ •๋œ ์‹œ๊ฐ„ ๋™์•ˆ fetch.min.bytes์— ์ง€์ •๋œ ๋ฐ”์ดํŠธ ์ˆ˜๊ฐ€ ์ถฉ์กฑ๋˜์ง€ ์•Š๋”๋ผ๋„, ํ•ด๋‹น ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด Consumer๋Š” ํ˜„์žฌ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ฒŒ ๋œ๋‹ค.


max.partition.fetch.bytes

Consumer๊ฐ€ ํ•œ ๋ฒˆ์˜ poll() ์š”์ฒญ์œผ๋กœ ๊ฐ ํŒŒํ‹ฐ์…˜์—์„œ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ๋ฐ”์ดํŠธ ์ˆ˜๋‹ค.

๊ธฐ๋ณธ๊ฐ’: 1048576 ๋ฐ”์ดํŠธ, ์ฆ‰ 1MB

์ฃผ์š” ํฌ์ธํŠธ : ์ด ์„ค์ •์€ ๊ฐ ํŒŒํ‹ฐ์…˜์—์„œ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ๋ฅผ ์ œํ•œํ•œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด Consumer๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ๋ฒˆ์— ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๋ฉฐ, ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.


์ด ์„ค์ •๋“ค์€ ์นดํ”„์นด Consumer์˜ ์„ฑ๋Šฅ๊ณผ ํšจ์œจ์„ฑ์„ ์ตœ์ ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์ค‘์š”ํ•˜๋‹ค.





poll(), close()

์ด ๋‘ ๋ฉ”์„œ๋“œ๋Š” offset ์ปค๋ฐ‹๊ณผ ๊ด€๋ จ๋œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

poll(): Consumer๊ฐ€ ์นดํ”„์นด์—์„œ ์ƒˆ๋กœ์šด ๋ฉ”์‹œ์ง€๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋™์•ˆ, ์„ค์ •๋œ auto.commit.interval.ms ์ฃผ๊ธฐ์— ๋”ฐ๋ผ offset์„ ์ž๋™ ์ปค๋ฐ‹ํ•  ์ˆ˜ ์žˆ๋‹ค.

close(): Consumer๊ฐ€ ์ข…๋ฃŒ๋˜๊ธฐ ์ „์— ๋งˆ์ง€๋ง‰์œผ๋กœ ์ฝ์€ ๋ฉ”์‹œ์ง€์˜ offset์„ ์ปค๋ฐ‹ํ•œ๋‹ค.

์ฃผ์š” ํฌ์ธํŠธ: ์˜ฌ๋ฐ”๋ฅธ offset ๊ด€๋ฆฌ๋Š” ๋ฉ”์‹œ์ง€ ์ค‘๋ณต ์ฒ˜๋ฆฌ๋‚˜ ๋ˆ„๋ฝ์„ ๋ฐฉ์ง€ํ•˜๋Š”๋ฐ ์ค‘์š”ํ•˜๋‹ค.






๋™๊ธฐ ์ปค๋ฐ‹ (commitSync)

ConsumerRecords<String, String> records = consumer.poll(Duration.ofSeconds(1));

Kafka์˜ ํ† ํ”ฝ์—์„œ ๋ฉ”์‹œ์ง€๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์ฝ”๋“œ๋‹ค. ์œ„ ์ฝ”๋“œ๋Š” 1์ดˆ ๋™์•ˆ ๋ฉ”์‹œ์ง€๋ฅผ ๊ธฐ๋‹ค๋ฆฐ๋‹ค.


for (ConsumerRecord<String, String> record : records) { ... }: 

๊ฐ€์ ธ์˜จ ๋ฉ”์‹œ์ง€๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฃจํ”„๋‹ค.


consumer.commitSync();

์ฒ˜๋ฆฌํ•œ ๋ฉ”์‹œ์ง€์˜ offset์„ ๋™๊ธฐ์ ์œผ๋กœ ์ปค๋ฐ‹ํ•œ๋‹ค.

commitSync ๋ฉ”์„œ๋“œ๋Š” ์ปค๋ฐ‹ ์š”์ฒญ์ด ์„ฑ๊ณตํ•  ๋•Œ๊นŒ์ง€ ๋ธ”๋กœํ‚น๋œ๋‹ค. ๋งŒ์•ฝ ์ปค๋ฐ‹์ด ์‹คํŒจํ•˜๋ฉด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

๋™๊ธฐ ์ปค๋ฐ‹์€ ์ฒ˜๋ฆฌ๊ฐ€ ํ™•์‹คํ•˜๊ณ  ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ์ปค๋ฐ‹์— ์‹คํŒจํ•  ๊ฒฝ์šฐ ๋ฆฌํŠธ๋ผ์ด ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค.


๋น„๋™๊ธฐ ์ปค๋ฐ‹ (commitAsync)

ConsumerRecords<String, String> records = consumer.poll(Duration.ofSeconds(1));

์œ„์˜ ์ฝ”๋“œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ Kafka์˜ ํ† ํ”ฝ์—์„œ ๋ฉ”์‹œ์ง€๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์ฝ”๋“œ๋‹ค.


for (ConsumerRecord<String, String> record : records) { ... }

๊ฐ€์ ธ์˜จ ๋ฉ”์‹œ์ง€๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฃจํ”„๋‹ค.


consumer.commitAsync(OffsetCommitCallback callback);

์ฒ˜๋ฆฌํ•œ ๋ฉ”์‹œ์ง€์˜ offset์„ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ปค๋ฐ‹ํ•œ๋‹ค.

commitAsync๋Š” ์ฆ‰์‹œ ๋ฐ˜ํ™˜๋˜๋ฉฐ, ์„ฑ๊ณต ๋˜๋Š” ์‹คํŒจ์— ๋Œ€ํ•œ ์ฝœ๋ฐฑ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

๋น„๋™๊ธฐ ์ปค๋ฐ‹์€ ๋น ๋ฅด๊ณ , ๋ธ”๋กœํ‚น์ด ์—†์œผ๋ฏ€๋กœ ์ฒ˜๋ฆฌ ์†๋„๊ฐ€ ๋น ๋ฅด๋‹ค. ํ•˜์ง€๋งŒ ์‹คํŒจํ•œ ์ปค๋ฐ‹์— ๋Œ€ํ•ด ์ž๋™์œผ๋กœ ์žฌ์‹œ๋„ํ•˜์ง€ ์•Š๋Š”๋‹ค.





๋ฉฑ๋“ฑ์„ฑ(idempotence)

๋ฉฑ๋“ฑ์„ฑ์€ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ์—์„œ ๋งค์šฐ ์ค‘์š”ํ•œ ๊ฐœ๋…์ด๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ํ•œ ์‚ฌ์šฉ์ž๊ฐ€ ๋ฌผ๊ฑด์„ ๊ตฌ๋งคํ•˜๋Š” ๊ฒฐ์ œ ์š”์ฒญ์„ ๋ณด๋ƒˆ์„ ๋•Œ, ๋„คํŠธ์›Œํฌ ๋ฌธ์ œ๋กœ ์ธํ•ด ๊ฐ™์€ ์š”์ฒญ์„ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ณด๋‚ด๊ฒŒ ๋  ์ˆ˜ ์žˆ๋‹ค. ๋ฉฑ๋“ฑ์„ฑ์ด ๋ณด์žฅ๋˜์ง€ ์•Š์œผ๋ฉด, ์‚ฌ์šฉ์ž๋Š” ๊ฐ™์€ ๋ฌผ๊ฑด์„ ์—ฌ๋Ÿฌ ๋ฒˆ ๊ตฌ๋งคํ•˜๊ฒŒ ๋  ์ˆ˜ ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ, ์‹œ์Šคํ…œ์€ ๊ฐ™์€ ์š”์ฒญ์„ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ฐ›์•„๋„ ํ•œ ๋ฒˆ๋งŒ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜, ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค.


์œ„์˜ ๊ฐœ๋…์€ ๋ฐ์ดํ„ฐ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์ค‘์š”ํ•˜๋ฉฐ, ํŠนํžˆ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ, ๋„คํŠธ์›Œํฌ ํ†ต์‹ , ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋“ฑ์—์„œ ์ž์ฃผ ๋‹ค๋ฃจ์–ด์ง„๋‹ค.





๋ฆฌ๋ฐธ๋Ÿฐ์‹ฑ (Rebalancing)

Kafka์—์„œ ๋ฆฌ๋ฐธ๋Ÿฐ์‹ฑ์€ Consumer Group ๋‚ด์˜ Consumer๋“ค ์‚ฌ์ด์— ํŒŒํ‹ฐ์…˜์„ ์žฌ๋ถ„๋ฐฐํ•˜๋Š” ๊ณผ์ •์„ ๋งํ•œ๋‹ค.


์™œ ๋ฆฌ๋ฐธ๋Ÿฐ์‹ฑ์ด ํ•„์š”ํ•œ๊ฐ€ โ“

Consumer ์ถ”๊ฐ€/์ œ๊ฑฐ: Consumer Group์— ์ƒˆ๋กœ์šด Consumer๊ฐ€ ์ถ”๊ฐ€๋˜๊ฑฐ๋‚˜ ๊ธฐ์กด์˜ Consumer๊ฐ€ ์ œ๊ฑฐ๋  ๋•Œ, ํŒŒํ‹ฐ์…˜์˜ ๋ถ„๋ฐฐ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

ํŒŒํ‹ฐ์…˜ ์ถ”๊ฐ€: ํ† ํ”ฝ์— ์ƒˆ๋กœ์šด ํŒŒํ‹ฐ์…˜์ด ์ถ”๊ฐ€๋  ๊ฒฝ์šฐ, ์ด ์ƒˆ ํŒŒํ‹ฐ์…˜์„ ์†Œ๋น„ํ•˜๊ธฐ ์œ„ํ•ด ํŒŒํ‹ฐ์…˜ ๋ถ„๋ฐฐ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

Consumer ์žฅ์• : ์–ด๋–ค Consumer๊ฐ€ ์žฅ์• ๋กœ ์ธํ•ด ๋™์ž‘ํ•˜์ง€ ์•Š๊ฒŒ ๋˜๋ฉด, ๊ทธ Consumer๊ฐ€ ๋‹ด๋‹นํ•˜๋˜ ํŒŒํ‹ฐ์…˜๋“ค์„ ๋‹ค๋ฅธ Consumer๋“ค์—๊ฒŒ ๋ถ„๋ฐฐํ•ด์•ผ ํ•œ๋‹ค.


์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”๊ฐ€ โ“

๋ฆฌ๋ฐธ๋Ÿฐ์‹ฑ ์‹œ์ž‘ ์‹œ, Consumer Group ๋‚ด์˜ ๋ชจ๋“  Consumer๋Š” ํ˜„์žฌ ์†Œ๋น„ ์ค‘์ธ ํŒŒํ‹ฐ์…˜์—์„œ ๋ถ„๋ฆฌ๋œ๋‹ค.

๊ทธ ํ›„, Group Coordinator๋Š” ์ƒˆ๋กœ์šด ํŒŒํ‹ฐ์…˜ ํ• ๋‹น์„ ๊ฒฐ์ •ํ•˜๊ณ  ๊ฐ Consumer์—๊ฒŒ ์•Œ๋ฆฐ๋‹ค.

๊ฐ Consumer๋Š” ์ƒˆ๋กœ ํ• ๋‹น๋œ ํŒŒํ‹ฐ์…˜๋“ค์„ ์‹œ์ž‘์ (์˜ˆ: ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์œผ๋กœ ์ปค๋ฐ‹๋œ ์˜คํ”„์…‹)๋ถ€ํ„ฐ ์†Œ๋น„ํ•˜๊ธฐ ์‹œ์ž‘ํ•œ๋‹ค.


๋ฆฌ๋ฐธ๋Ÿฐ์‹ฑ์˜ ์˜ํ–ฅ

๋ฆฌ๋ฐธ๋Ÿฐ์‹ฑ์€ ํ•„์š”ํ•œ ์ž‘์—…์ด์ง€๋งŒ, ๊ณผ์ • ์ค‘์—๋Š” ํ•ด๋‹น Consumer Group์˜ ๋ฉ”์‹œ์ง€ ์†Œ๋น„๊ฐ€ ์ผ์‹œ์ ์œผ๋กœ ์ค‘๋‹จ๋  ์ˆ˜ ์žˆ๋‹ค.

๋ฆฌ๋ฐธ๋Ÿฐ์‹ฑ์ด ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ฐœ์ƒํ•˜๋ฉด, ์ „์ฒด ์‹œ์Šคํ…œ์˜ ์ฒ˜๋ฆฌ๋Ÿ‰๊ณผ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ด๋ฅผ ์ตœ์†Œํ™”ํ•˜๋Š” ์„ค์ •๊ณผ ์ „๋žต์ด ํ•„์š”ํ•˜๋‹ค.

์œ„ ์ด๋ฏธ์ง€์—์„œ ์–ธ๊ธ‰๋œ session.timeout.ms ๋ฐ heartbeat.interval.ms๋Š” ๋ฆฌ๋ฐธ๋Ÿฐ์‹ฑ๊ณผ ๊ด€๋ จ๋œ ์„ค์ •๊ฐ’์ด๋‹ค.

heartbeat.interval.ms๋Š” Consumer๊ฐ€ Group Coordinator์—๊ฒŒ "๋‚˜ ์•„์ง ์‚ด์•„์žˆ์–ด!"๋ผ๊ณ  ์•Œ๋ฆฌ๋Š” ์‹ ํ˜ธ๋ฅผ ๋ณด๋‚ด๋Š” ์ฃผ๊ธฐ๋ฅผ ์„ค์ •ํ•˜๋ฉฐ, session.timeout.ms๋Š” ํ•ด๋‹น ์‹ ํ˜ธ๋ฅผ ๋ฐ›์ง€ ๋ชปํ–ˆ์„ ๋•Œ Consumer๋ฅผ ์žฅ์• ๋กœ ํŒ๋‹จํ•˜๊ณ  ๋ฆฌ๋ฐธ๋Ÿฐ์‹ฑ์„ ์‹œ์ž‘ํ•˜๋Š” ์‹œ๊ฐ„์„ ๊ฒฐ์ •ํ•œ๋‹ค.









Apache Kafka์—์„œ์˜ Consumer๋Š” ์Šค๋ ˆ๋“œ์— ์•ˆ์ „ํ•˜์ง€ ์•Š๋‹ค. ์ด๋Š” KafkaConsumer์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ์— ์˜ํ•ด ๋™์‹œ์— ์•ก์„ธ์Šค๋  ๋•Œ ์•ˆ์ •์ ์ธ ๋™์ž‘์„ ๋ณด์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.


์™œ KafkaConsumer๋Š” ์Šค๋ ˆ๋“œ์— ์•ˆ์ „ํ•˜์ง€ ์•Š์€๊ฐ€?

KafkaConsumer์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ์™€ ์ƒํƒœ ๊ด€๋ฆฌ ๋ฐฉ์‹์€ ๋‹จ์ผ ์Šค๋ ˆ๋“œ์—์„œ ๋™์ž‘ํ•˜๊ธฐ ์œ„ํ•ด ์„ค๊ณ„๋˜์—ˆ๋‹ค.

์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ์—์„œ ๋™์‹œ์— KafkaConsumer์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ๋˜๋ฉด, ๊ทธ ์ƒํƒœ์™€ ๋™์ž‘์ด ์˜ˆ๊ธฐ์น˜ ์•Š๊ฒŒ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์–ด ๋ฐ์ดํ„ฐ ์†์‹ค ๋˜๋Š” ์ค‘๋ณต ์ฒ˜๋ฆฌ์™€ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.


๊ทธ๋ ‡๋‹ค๋ฉด ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋Š” ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•˜๋‚˜?

๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด์„  ๊ฐ ์Šค๋ ˆ๋“œ๋งˆ๋‹ค ๋ณ„๋„์˜ KafkaConsumer ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๊ฐ ์Šค๋ ˆ๋“œ๋Š” ๋…๋ฆฝ์ ์œผ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ์†Œ๋น„ํ•  ์ˆ˜ ์žˆ๋‹ค.


wakeup() ๋ฉ”์„œ๋“œ๋Š” ๋ฌด์—‡์ธ๊ฐ€?

wakeup()์€ KafkaConsumer๊ฐ€ poll() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœ ์ค‘์ผ ๋•Œ, ์ด๋ฅผ ์ค‘๋‹จ์‹œํ‚ค๊ธฐ ์œ„ํ•œ ๋ฉ”์„œ๋“œ๋‹ค.

๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์—์„œ ์ด ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด poll()์ด ์‹คํ–‰ ์ค‘์ธ ์Šค๋ ˆ๋“œ๋Š” WakeupException์„ ๋ฐœ์ƒ์‹œํ‚ค๊ณ  ์ค‘๋‹จ๋œ๋‹ค.

์ด ๊ธฐ๋Šฅ์€ ์ฃผ๋กœ KafkaConsumer๊ฐ€ ๊ธด poll() ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋™์•ˆ ๊ทธ ์ž‘์—…์„ ๊ฐ•์ œ๋กœ ์ข…๋ฃŒ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ฆ‰๊ฐ์ ์ธ ์ข…๋ฃŒ๊ฐ€ ํ•„์š”ํ•œ ์ƒํ™ฉ์—์„œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.


๊ฒฐ๋ก ์ ์œผ๋กœ, KafkaConsumer๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์Šค๋ ˆ๋“œ์— ์•ˆ์ „ํ•˜๊ฒŒ ๋™์ž‘ํ•˜๋„๋ก ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ, ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๊ฐ ์Šค๋ ˆ๋“œ์— ๋…๋ฆฝ์ ์ธ KafkaConsumer ์ธ์Šคํ„ด์Šค๋ฅผ ํ• ๋‹นํ•ด์•ผ ํ•œ๋‹ค.