Consumer

Kafka ์ปจ์Šˆ๋จธ๋ž€?

Kafka ์ปจ์Šˆ๋จธ๋Š” Kafka ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ํ† ํ”ฝ์˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ฝ๊ณ  ์ฒ˜๋ฆฌํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ์ž…๋‹ˆ๋‹ค. ์ปจ์Šˆ๋จธ๋Š” ํ”„๋กœ๋“€์„œ๊ฐ€ ์ „์†กํ•œ ๋ฉ”์‹œ์ง€๋ฅผ ํ† ํ”ฝ์˜ ํŒŒํ‹ฐ์…˜์—์„œ ์ฝ์–ด์™€ ๋‹ค์–‘ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ์ง์— ๋งž์ถฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

Kafka๋Š” ๊ณ ์„ฑ๋Šฅ ๋น„๋™๊ธฐ ์ŠคํŠธ๋ฆฌ๋ฐ์„ ์ง€์›ํ•˜๋ฉฐ, ์ปจ์Šˆ๋จธ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ์†Œ๋น„ํ•  ์ˆ˜ ์žˆ๋Š” ์ฃผ์š” ๊ตฌ์„ฑ ์š”์†Œ์ž…๋‹ˆ๋‹ค.

Drawing

๊ฐœ๋…

์ปจ์Šˆ๋จธ๋Š” Kafka์˜ ํ† ํ”ฝ์œผ๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์˜ค๋ฉฐ, ์—ฌ๋Ÿฌ ์ปจ์Šˆ๋จธ๊ฐ€ ์ปจ์Šˆ๋จธ ๊ทธ๋ฃน์„ ํ˜•์„ฑํ•ด ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

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

์ด๋ฅผ ํ†ตํ•ด ์ค‘๋‹จ๋˜๊ฑฐ๋‚˜ ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜๋”๋ผ๋„ ์ด์–ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋™์ž‘ ์›๋ฆฌ

์ปจ์Šˆ๋จธ๊ฐ€ Kafka ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์†Œ๋น„ํ•˜๋Š” ๊ณผ์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ์ปจ์Šˆ๋จธ๋Š” ํ† ํ”ฝ์„ ๊ตฌ๋…ํ•˜์—ฌ ํ•ด๋‹น ํ† ํ”ฝ์˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.

  • Kafka๋Š” ์ปจ์Šˆ๋จธ ๊ทธ๋ฃน ๋‚ด์—์„œ ํŒŒํ‹ฐ์…˜์„ ํ• ๋‹นํ•˜๋ฉฐ, ๊ฐ ์ปจ์Šˆ๋จธ๊ฐ€ ๋…๋ฆฝ์ ์œผ๋กœ ํŒŒํ‹ฐ์…˜์„ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

  • ์ปจ์Šˆ๋จธ๊ฐ€ ํŒŒํ‹ฐ์…˜์—์„œ ๋ฉ”์‹œ์ง€๋ฅผ ์ฝ์„ ๋•Œ, Kafka๋Š” ๊ทธ ์œ„์น˜๋ฅผ ์˜คํ”„์…‹์œผ๋กœ ์ถ”์ ํ•ฉ๋‹ˆ๋‹ค.

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

์ƒ์„ธ ์„ค๋ช…

Kafka ์ปจ์Šˆ๋จธ๋Š” ๋ฆฌ๋ฐธ๋Ÿฐ์‹ฑ์ด๋ผ๋Š” ๊ฐœ๋…์„ ์‚ฌ์šฉํ•ด ๊ทธ๋ฃน ๋‚ด์˜ ์ปจ์Šˆ๋จธ๊ฐ€ ์ถ”๊ฐ€๋˜๊ฑฐ๋‚˜ ์ œ๊ฑฐ๋  ๋•Œ ์ž๋™์œผ๋กœ ํŒŒํ‹ฐ์…˜์„ ์žฌ๋ถ„๋ฐฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ปจ์Šˆ๋จธ๊ฐ€ ๋™์ ์œผ๋กœ ํด๋Ÿฌ์Šคํ„ฐ์— ์ถ”๊ฐ€๋˜๊ฑฐ๋‚˜ ์ œ๊ฑฐ๋˜์–ด๋„ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ์— ์˜ํ–ฅ์ด ์—†๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

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

์˜ต์…˜

Kafka ์ปจ์Šˆ๋จธ๋Š” ๋‹ค์–‘ํ•œ ์„ค์ • ์˜ต์…˜์„ ์ œ๊ณตํ•˜์—ฌ ์„ฑ๋Šฅ๊ณผ ์•ˆ์ •์„ฑ์„ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • enable.auto.commit: ์ž๋™ ์ปค๋ฐ‹ ์—ฌ๋ถ€๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ true๋กœ, ์ผ์ • ๊ฐ„๊ฒฉ๋งˆ๋‹ค Kafka๊ฐ€ ์˜คํ”„์…‹์„ ์ž๋™์œผ๋กœ ์ปค๋ฐ‹ํ•ฉ๋‹ˆ๋‹ค.

  • auto.offset.reset: ์ปจ์Šˆ๋จธ๊ฐ€ ์ฝ๊ธฐ ์‹œ์ž‘ํ•  ์˜คํ”„์…‹์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํ† ํ”ฝ์— ์ฒ˜์Œ ์—ฐ๊ฒฐ๋  ๋•Œ ๋˜๋Š” ๋งˆ์ง€๋ง‰ ์ปค๋ฐ‹๋œ ์˜คํ”„์…‹์ด ์—†์„ ๋•Œ, earliest๋ฅผ ์„ค์ •ํ•˜๋ฉด ๊ฐ€์žฅ ์˜ค๋ž˜๋œ ๋ฉ”์‹œ์ง€๋ถ€ํ„ฐ ์ฝ๊ณ , latest๋ฅผ ์„ค์ •ํ•˜๋ฉด ์ตœ์‹  ๋ฉ”์‹œ์ง€๋ถ€ํ„ฐ ์ฝ์Šต๋‹ˆ๋‹ค.

  • max.poll.records: ํ•œ ๋ฒˆ์˜ ์š”์ฒญ์œผ๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ๋ ˆ์ฝ”๋“œ ์ˆ˜๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฐ’์„ ์กฐ์ •ํ•˜๋ฉด ์ฒ˜๋ฆฌ ์†๋„์™€ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • session.timeout.ms: ์ปจ์Šˆ๋จธ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ ์ค‘์ธ์ง€ Kafka์— ์‹ ํ˜ธ๋ฅผ ๋ณด๋‚ด๋Š” ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ์ž…๋‹ˆ๋‹ค. ์ง€์ •๋œ ์‹œ๊ฐ„ ๋™์•ˆ ์ปจ์Šˆ๋จธ๊ฐ€ ์‘๋‹ตํ•˜์ง€ ์•Š์œผ๋ฉด Kafka๋Š” ํ•ด๋‹น ์ปจ์Šˆ๋จธ๊ฐ€ ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•˜๊ณ  ๋ฆฌ๋ฐธ๋Ÿฐ์‹ฑ์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

Kafka ์ปจ์Šˆ๋จธ์˜ ํ• ๋‹น ๋ฐฉ์‹

Kafka ์ปจ์Šˆ๋จธ๋Š” ํŒŒํ‹ฐ์…˜ ํ• ๋‹น์„ ํ†ตํ•ด ๋ฉ”์‹œ์ง€๋ฅผ ์†Œ๋น„ํ•ฉ๋‹ˆ๋‹ค. Kafka๋Š” ์ปจ์Šˆ๋จธ๊ฐ€ ์–ด๋–ค ํŒŒํ‹ฐ์…˜์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„์ง€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค

subscribe(): Kafka๊ฐ€ ์ž๋™์œผ๋กœ ํŒŒํ‹ฐ์…˜์„ ํ• ๋‹นํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์ปจ์Šˆ๋จธ ๊ทธ๋ฃน ๋‚ด์—์„œ ํŒŒํ‹ฐ์…˜์ด ์ž๋™์œผ๋กœ ๋ถ„๋ฐฐ๋˜๋ฉฐ, Kafka๊ฐ€ ์ด๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

assign(): ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ํŠน์ • ํŒŒํ‹ฐ์…˜์„ ์ปจ์Šˆ๋จธ์— ํ• ๋‹นํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋” ์„ธ๋ฐ€ํ•˜๊ฒŒ ํŒŒํ‹ฐ์…˜์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


subscribe() ๋ž€?

subscribe()๋Š” Kafka ์ปจ์Šˆ๋จธ๊ฐ€ ํ•˜๋‚˜ ์ด์ƒ์˜ ํ† ํ”ฝ์„ ๊ตฌ๋…ํ•˜๊ณ , Kafka ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์—์„œ ์ž๋™์œผ๋กœ ํŒŒํ‹ฐ์…˜์„ ํ• ๋‹น๋ฐ›์•„ ๋ฉ”์‹œ์ง€๋ฅผ ์†Œ๋น„ํ•˜๋Š” ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค. subscribe()๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Kafka๊ฐ€ ์ปจ์Šˆ๋จธ ๊ทธ๋ฃน์„ ํ†ตํ•ด ์ž๋™์œผ๋กœ ํŒŒํ‹ฐ์…˜์„ ๋ถ„๋ฐฐํ•˜๊ณ , ํŒŒํ‹ฐ์…˜์˜ ๋ฆฌ๋ฐธ๋Ÿฐ์‹ฑ(์žฌํ• ๋‹น)๋„ ์ž๋™์œผ๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

subscribe()๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆฌ๋ฐ์—์„œ ๋งŽ์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ์—ฌ๋Ÿฌ ์ปจ์Šˆ๋จธ๊ฐ€ ์ปจ์Šˆ๋จธ ๊ทธ๋ฃน์„ ํ˜•์„ฑํ•˜์—ฌ ๋ณ‘๋ ฌ๋กœ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ํ•  ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • ๋‹ค์ˆ˜์˜ ์ปจ์Šˆ๋จธ๊ฐ€ ํ•˜๋‚˜์˜ ํ† ํ”ฝ์„ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•  ๋•Œ, Kafka๊ฐ€ ํŒŒํ‹ฐ์…˜์„ ์ž๋™์œผ๋กœ ๋ถ„๋ฐฐํ•˜๋„๋ก ํ•˜๊ณ  ์‹ถ์„ ๋•Œ

  • ์ž๋™ ๋ฆฌ๋ฐธ๋Ÿฐ์‹ฑ์„ ํ†ตํ•ด ์ปจ์Šˆ๋จธ ๊ทธ๋ฃน ๋‚ด์—์„œ ์ปจ์Šˆ๋จธ ์ถ”๊ฐ€/์ œ๊ฑฐ ์‹œ ํŒŒํ‹ฐ์…˜์„ ์ž๋™์œผ๋กœ ์กฐ์ •ํ•˜๊ณ  ์‹ถ์„ ๋•Œ

  • ๋™์ ์œผ๋กœ ํ† ํ”ฝ์„ ๊ด€๋ฆฌํ•˜๊ณ , ํŠน์ • ์ปจ์Šˆ๋จธ๊ฐ€ ์—ฌ๋Ÿฌ ํ† ํ”ฝ์„ ๊ตฌ๋…ํ•˜๊ฒŒ ํ•˜๊ณ  ์‹ถ์„ ๋•Œ

assign() ๋ž€?

assign() ๋ฉ”์„œ๋“œ๋Š” Kafka ์ปจ์Šˆ๋จธ๊ฐ€ ํŠน์ • ํŒŒํ‹ฐ์…˜์„ ์ง์ ‘ ํ• ๋‹น๋ฐ›์•„ ๋ฉ”์‹œ์ง€๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ปจ์Šˆ๋จธ ๊ทธ๋ฃน์˜ ์ž๋™ ๋ฆฌ๋ฐธ๋Ÿฐ์‹ฑ์„ ํ”ผํ•˜๊ณ , ํŠน์ • ํŒŒํ‹ฐ์…˜์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜๋™์œผ๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

assign()์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒํ™ฉ์—์„œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค

  • ํŠน์ • ํŒŒํ‹ฐ์…˜๋งŒ ์†Œ๋น„ํ•˜๊ณ  ์‹ถ์„ ๋•Œ: ํŠน์ • ์‚ฌ์šฉ์ž์˜ ๋ฐ์ดํ„ฐ๋‚˜ ํŠน์ • ์ง€์—ญ์— ํ•ด๋‹นํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ์‹ถ์„ ๋•Œ, ์ง์ ‘ ํŒŒํ‹ฐ์…˜์„ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ฆฌ๋ฐธ๋Ÿฐ์‹ฑ์„ ํ”ผํ•˜๊ณ  ์‹ถ์„ ๋•Œ: ์ปจ์Šˆ๋จธ ๊ทธ๋ฃน ๋‚ด์—์„œ ๋ฆฌ๋ฐธ๋Ÿฐ์‹ฑ์ด ์ž์ฃผ ๋ฐœ์ƒํ•˜๋ฉด ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. assign()์„ ์‚ฌ์šฉํ•˜๋ฉด Kafka์˜ ์ž๋™ ๋ฆฌ๋ฐธ๋Ÿฐ์‹ฑ ์—†์ด ํŒŒํ‹ฐ์…˜์„ ๊ณ ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ปจ์Šˆ๋จธ ๊ทธ๋ฃน ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๋•Œ: ์ปจ์Šˆ๋จธ ๊ทธ๋ฃน ์—†์ด, ๋‹จ์ผ ์ปจ์Šˆ๋จธ๊ฐ€ ์—ฌ๋Ÿฌ ํŒŒํ‹ฐ์…˜์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  ๊ฒฝ์šฐ์—๋„ assign()์„ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜๋™์œผ๋กœ ํŒŒํ‹ฐ์…˜์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

assign() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŠน์ • ํŒŒํ‹ฐ์…˜์„ ์ง์ ‘ ์ง€์ •ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

val consumer = KafkaConsumer<String, String>(ClientConfiguration().config())

// ํŠน์ • ํ† ํ”ฝ์˜ ํŒŒํ‹ฐ์…˜์„ ์ง์ ‘ ํ• ๋‹น
val partition = TopicPartition("my-topic", 0)
consumer.assign(listOf(partition))

while (true) {
    val records = consumer.poll(Duration.ofMillis(100))
    records.forEach { record ->
        println("Consumed message: ${record.value()} from partition ${record.partition()}")
    }
}

์œ„ ์˜ˆ์‹œ์—์„œ TopicPartition์„ ํ†ตํ•ด ํ† ํ”ฝ ์ด๋ฆ„๊ณผ ํŒŒํ‹ฐ์…˜ ๋ฒˆํ˜ธ๋ฅผ ์ง€์ •ํ•˜๊ณ , ๊ทธ ํŒŒํ‹ฐ์…˜๋งŒ ์†Œ๋น„ํ•˜๋„๋ก assign()์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ฆฌ๋ฐธ๋Ÿฐ์‹ฑ ์—†์ด ํŠน์ • ํŒŒํ‹ฐ์…˜์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์†Œ๋น„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


assign()๊ณผ subscribe()์˜ ์ฐจ์ด์ 

subscribe()์™€ assign()์€ ๊ฐ๊ฐ ํŒŒํ‹ฐ์…˜ ํ• ๋‹น์˜ ์ž๋™ํ™”์™€ ์ˆ˜๋™ํ™”๋ฅผ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ๋‘ ๋ฐฉ์‹์˜ ์ฃผ์š” ์ฐจ์ด์ ์ž…๋‹ˆ๋‹ค

subscribe(): ์ปจ์Šˆ๋จธ๋Š” Kafka ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์—์„œ ์ปจ์Šˆ๋จธ ๊ทธ๋ฃน์˜ ์ผ๋ถ€๋กœ์„œ ๋™์ž‘ํ•˜๋ฉฐ, Kafka๋Š” ์ž๋™์œผ๋กœ ํŒŒํ‹ฐ์…˜์„ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฐฉ์‹์€ ๋ฆฌ๋ฐธ๋Ÿฐ์‹ฑ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์—ฌ๋Ÿฌ ์ปจ์Šˆ๋จธ๊ฐ€ ๋™์‹œ์— ํ•˜๋‚˜์˜ ํ† ํ”ฝ์„ ์†Œ๋น„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์žฅ์ : ์—ฌ๋Ÿฌ ์ปจ์Šˆ๋จธ๊ฐ€ ํŒŒํ‹ฐ์…˜์„ ๋‚˜๋ˆ„์–ด ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, Kafka๊ฐ€ ํŒŒํ‹ฐ์…˜์„ ์ž๋™์œผ๋กœ ๋ถ„๋ฐฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ด€๋ฆฌ๊ฐ€ ์‰ฝ์Šต๋‹ˆ๋‹ค.

  • ๋‹จ์ : ๋ฆฌ๋ฐธ๋Ÿฐ์‹ฑ์ด ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ฐœ์ƒํ•˜๋ฉด ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

assign(): ์ปจ์Šˆ๋จธ๊ฐ€ ํŠน์ • ํŒŒํ‹ฐ์…˜์„ ์ง์ ‘ ์ง€์ •ํ•˜์—ฌ ์†Œ๋น„ํ•ฉ๋‹ˆ๋‹ค. ์ปจ์Šˆ๋จธ ๊ทธ๋ฃน ์—†์ด๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ฆฌ๋ฐธ๋Ÿฐ์‹ฑ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • ์žฅ์ : ํŒŒํ‹ฐ์…˜์„ ์ง์ ‘ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๊ณ , ์ž๋™ ๋ฆฌ๋ฐธ๋Ÿฐ์‹ฑ ์—†์ด ํŠน์ • ํŒŒํ‹ฐ์…˜์„ ์†Œ๋น„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋‹จ์ : ์—ฌ๋Ÿฌ ์ปจ์Šˆ๋จธ๊ฐ€ ์žˆ์„ ๋•Œ ํŒŒํ‹ฐ์…˜์„ ์ง์ ‘ ๋‚˜๋ˆ„์–ด ํ• ๋‹นํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๊ด€๋ฆฌ๊ฐ€ ๋ณต์žกํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


assign() ๋ฉ”์„œ๋“œ์˜ ์žฅ์ 

  1. ๋ฆฌ๋ฐธ๋Ÿฐ์‹ฑ ์—†์ด ์•ˆ์ •์ ์ธ ๋ฐ์ดํ„ฐ ์†Œ๋น„: assign()์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฆฌ๋ฐธ๋Ÿฐ์‹ฑ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ปจ์Šˆ๋จธ๊ฐ€ ํ• ๋‹น๋œ ํŒŒํ‹ฐ์…˜์—์„œ ์•ˆ์ •์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์†Œ๋น„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋ฆฌ๋ฐธ๋Ÿฐ์‹ฑ์œผ๋กœ ์ธํ•œ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ํ”ผํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  2. ํŠน์ • ํŒŒํ‹ฐ์…˜์— ๋Œ€ํ•œ ์ œ์–ด: ํŠน์ • ํŒŒํ‹ฐ์…˜์—์„œ๋งŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ, assign()์„ ์‚ฌ์šฉํ•˜์—ฌ ์„ธ๋ฐ€ํ•œ ํŒŒํ‹ฐ์…˜ ์ œ์–ด๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํŠน์ • ์‚ฌ์šฉ์ž์˜ ๋ฐ์ดํ„ฐ๋งŒ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๊ฑฐ๋‚˜, ํŠน์ • ์ด๋ฒคํŠธ ์œ ํ˜•์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์†Œ๋น„ํ•  ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

  3. ๋‹จ์ผ ์ปจ์Šˆ๋จธ์—์„œ ์—ฌ๋Ÿฌ ํŒŒํ‹ฐ์…˜ ๊ด€๋ฆฌ: ์ปจ์Šˆ๋จธ ๊ทธ๋ฃน์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ฑฐ๋‚˜, ์—ฌ๋Ÿฌ ํŒŒํ‹ฐ์…˜์„ ๋‹จ์ผ ์ปจ์Šˆ๋จธ์—์„œ ์ฒ˜๋ฆฌํ•  ๋•Œ assign()์„ ํ†ตํ•ด ์ด๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ํŒŒํ‹ฐ์…˜์— ๋Œ€ํ•ด ๊ฐœ๋ณ„์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์†Œ๋น„ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ปจ์Šˆ๋จธ ๊ทธ๋ฃน์˜ ์ž๋™ ๋ถ„๋ฐฐ ์—†์ด๋„ ํŒŒํ‹ฐ์…˜ ๊ฐ„์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


assign() ๊ด€๋ จ ์„ค์ • ์˜ต์…˜

assign() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ค‘์š”ํ•œ ๋ช‡ ๊ฐ€์ง€ ์„ค์ • ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • auto.offset.reset: ์ปจ์Šˆ๋จธ๊ฐ€ ์ฒ˜์Œ ์‹œ์ž‘๋˜๊ฑฐ๋‚˜ ์˜คํ”„์…‹์ด ์กด์žฌํ•˜์ง€ ์•Š์„ ๋•Œ, ์–ด๋””์„œ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„์ง€ ๊ฒฐ์ •ํ•˜๋Š” ์„ค์ •์ž…๋‹ˆ๋‹ค. assign()์„ ์‚ฌ์šฉํ•  ๋•Œ๋„ ์ด ์„ค์ •์€ ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค.

    • earliest: ๊ฐ€์žฅ ์˜ค๋ž˜๋œ ๋ฉ”์‹œ์ง€๋ถ€ํ„ฐ ์ฝ์Šต๋‹ˆ๋‹ค.

    • latest: ๊ฐ€์žฅ ์ตœ๊ทผ์˜ ๋ฉ”์‹œ์ง€๋ถ€ํ„ฐ ์ฝ์Šต๋‹ˆ๋‹ค.

  • enable.auto.commit: ์ž๋™์œผ๋กœ ์˜คํ”„์…‹์„ ์ปค๋ฐ‹ํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜๋™์œผ๋กœ ํŒŒํ‹ฐ์…˜์„ ํ• ๋‹นํ•˜๋Š” ๊ฒฝ์šฐ, ์ˆ˜๋™ ์ปค๋ฐ‹ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

enable.auto.commit=false

์ด๋ฅผ ํ†ตํ•ด ์ปจ์Šˆ๋จธ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ •ํ™•ํžˆ ์ฒ˜๋ฆฌํ•œ ํ›„์—๋งŒ ์˜คํ”„์…‹์„ ์ปค๋ฐ‹ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

wakeup() ๋ž€?

wakeup() ๋ฉ”์„œ๋“œ๋Š” Kafka ์ปจ์Šˆ๋จธ์˜ ์•ˆ์ „ํ•œ ์ค‘๋‹จ์„ ์œ„ํ•œ ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ Kafka ์ปจ์Šˆ๋จธ๋Š” poll() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๋ธ”๋กœํ‚น ์ƒํƒœ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ์ด๋•Œ ์™ธ๋ถ€์—์„œ ์ปจ์Šˆ๋จธ๋ฅผ ์ค‘๋‹จํ•ด์•ผ ํ•  ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•˜๋ฉด, ๋ฐ”๋กœ ์ข…๋ฃŒํ•  ์ˆ˜ ์—†๊ณ  ํ˜„์žฌ ์ง„ํ–‰ ์ค‘์ธ poll()์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋•Œ wakeup() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด, ํ˜„์žฌ ์ง„ํ–‰ ์ค‘์ธ poll()์„ ์ฆ‰์‹œ ์ค‘๋‹จ์‹œํ‚ค๊ณ WakeupException์„ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ์ด ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•˜์—ฌ ์ปจ์Šˆ๋จธ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ข…๋ฃŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

wakeup() ๋ฉ”์„œ๋“œ๋Š” ์™ธ๋ถ€ ์‹ ํ˜ธ(์˜ˆ: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ข…๋ฃŒ ์‹œ๊ทธ๋„)๋ฅผ ๋ฐ›๊ฑฐ๋‚˜ ์ปจ์Šˆ๋จธ๋ฅผ ์ข…๋ฃŒํ•ด์•ผ ํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์Šค๋ ˆ๋“œ๊ฐ€ Kafka ์ปจ์Šˆ๋จธ๋ฅผ ์‹คํ–‰ ์ค‘์ผ ๋•Œ, ๋ณ„๋„์˜ ์Šค๋ ˆ๋“œ์—์„œ wakeup()์„ ํ˜ธ์ถœํ•˜์—ฌ ์ปจ์Šˆ๋จธ ์Šค๋ ˆ๋“œ๋ฅผ ์ค‘๋‹จ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•„๋ž˜๋Š” wakeup()์„ ์‚ฌ์šฉํ•˜์—ฌ Kafka ์ปจ์Šˆ๋จธ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ข…๋ฃŒํ•˜๋Š” ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค:

kotlin์ฝ”๋“œ ๋ณต์‚ฌval consumer = KafkaConsumer<String, String>(ClientConfiguration().config())
consumer.subscribe(listOf("my-topic"))

val thread = Thread {
    try {
        while (true) {
            val records = consumer.poll(Duration.ofMillis(100))
            records.forEach { record ->
                println("Consumed message: ${record.value()} from partition ${record.partition()}")
            }
        }
    } catch (e: WakeupException) {
        println("Consumer woken up and exiting...")
        // ์—ฌ๊ธฐ์„œ ์Šค๋ ˆ๋“œ๋ฅผ ์ข…๋ฃŒํ•˜๊ฑฐ๋‚˜ ์ข…๋ฃŒ ์ฒ˜๋ฆฌ ๋กœ์ง ์‹คํ–‰
    } finally {
        consumer.close()  // ์ปจ์Šˆ๋จธ ๋ฆฌ์†Œ์Šค ํ•ด์ œ
    }
}

thread.start()

// ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ข…๋ฃŒ ์‹œ ๋˜๋Š” ์™ธ๋ถ€ ์‹ ํ˜ธ๋ฅผ ๋ฐ›์„ ๋•Œ ํ˜ธ์ถœ
Runtime.getRuntime().addShutdownHook(Thread {
    consumer.wakeup()  // Wakeup ํ˜ธ์ถœ๋กœ ์•ˆ์ „ํ•˜๊ฒŒ poll ์ค‘๋‹จ
    thread.join()       // ์ปจ์Šˆ๋จธ ์Šค๋ ˆ๋“œ ์ข…๋ฃŒ ๋Œ€๊ธฐ
})
  • Kafka ์ปจ์Šˆ๋จธ๋Š” ๋ณ„๋„์˜ ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰๋˜๋ฉฐ, ๋ฐ์ดํ„ฐ๋ฅผ ์ง€์†์ ์œผ๋กœ ์†Œ๋น„ํ•ฉ๋‹ˆ๋‹ค.

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ข…๋ฃŒ๋˜๋ฉด wakeup() ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜์–ด ์ปจ์Šˆ๋จธ์˜ poll()์„ ์ค‘๋‹จํ•˜๊ณ , WakeupException์„ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

  • finally ๋ธ”๋ก์—์„œ consumer.close()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋ฆฌ์†Œ์Šค๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค.


wakeup()์˜ ์ฃผ์š” ์—ญํ• 

  1. ๋ธ”๋ก๋œ poll() ์ค‘๋‹จ: Kafka ์ปจ์Šˆ๋จธ๊ฐ€ poll() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด ๋ธ”๋กœํ‚น ์ƒํƒœ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ, wakeup()์„ ํ˜ธ์ถœํ•˜๋ฉด poll()์ด ์ฆ‰์‹œ ์ค‘๋‹จ๋˜๊ณ  WakeupException์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ปจ์Šˆ๋จธ๋Š” ์ฆ‰์‹œ ์ข…๋ฃŒ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  2. ์Šค๋ ˆ๋“œ ์•ˆ์ „์„ฑ: wakeup()์€ ์Šค๋ ˆ๋“œ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์—์„œ ํ˜ธ์ถœํ•ด๋„ ์•ˆ์ „ํ•˜๊ฒŒ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰ ์ค‘์ธ ์ปจ์Šˆ๋จธ ์Šค๋ ˆ๋“œ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ค‘๋‹จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  3. ์ปจ์Šˆ๋จธ์˜ ์•ˆ์ „ํ•œ ์ข…๋ฃŒ: Kafka ์ปจ์Šˆ๋จธ๋Š” ๋ณดํ†ต ๋ฐ์ดํ„ฐ๋ฅผ ์ง€์†์ ์œผ๋กœ ์†Œ๋น„ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ข…๋ฃŒ ์‹œ ์•ˆ์ „ํ•˜๊ฒŒ ์ข…๋ฃŒํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. wakeup()์€ poll() ์ค‘๋‹จ ๋ฐ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ํ†ตํ•ด ์ปจ์Šˆ๋จธ ๋ฆฌ์†Œ์Šค๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•์Šต๋‹ˆ๋‹ค.


wakeup()๊ณผ close()์˜ ์ฐจ์ด์ 

  • wakeup(): ์ฆ‰์‹œ poll()์„ ์ค‘๋‹จํ•˜๊ณ  WakeupException์„ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ปจ์Šˆ๋จธ ์Šค๋ ˆ๋“œ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ค‘๋‹จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • close(): ์ปจ์Šˆ๋จธ๋ฅผ ์™„์ „ํžˆ ์ข…๋ฃŒํ•˜๊ณ  ๋ชจ๋“  ๋ฆฌ์†Œ์Šค๋ฅผ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค. wakeup()์œผ๋กœ poll()์„ ์ค‘๋‹จํ•œ ํ›„, ์ปจ์Šˆ๋จธ๋ฅผ ์™„์ „ํžˆ ์ข…๋ฃŒํ•˜๋ ค๋ฉด ๋ฐ˜๋“œ์‹œ close()๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ wakeup()์€ ํ˜„์žฌ ์ง„ํ–‰ ์ค‘์ธ ์ž‘์—…์„ ์ค‘๋‹จํ•˜๋Š” ์—ญํ• ์„ ํ•˜๊ณ , ๊ทธ ํ›„์— close()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ปจ์Šˆ๋จธ ๋ฆฌ์†Œ์Šค๋ฅผ ํ•ด์ œํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ธ ํŒจํ„ด์ž…๋‹ˆ๋‹ค.

Fetcher ?

Fetcher๋Š” Kafka ์ปจ์Šˆ๋จธ ๋‚ด๋ถ€์—์„œ ๋ฉ”์‹œ์ง€๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์—ญํ• ์„ ๋‹ด๋‹นํ•˜๋Š” ์ค‘์š”ํ•œ ๊ตฌ์„ฑ ์š”์†Œ์ž…๋‹ˆ๋‹ค.

Fetcher๋Š” ํŒŒํ‹ฐ์…˜์˜ ๋ฆฌ๋” ๋ธŒ๋กœ์ปค๋กœ๋ถ€ํ„ฐ ๋ฉ”์‹œ์ง€๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, ์—ฌ๋Ÿฌ ํŒŒํ‹ฐ์…˜์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ‘๋ ฌ๋กœ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์„ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

  • ๋ฉ”์‹œ์ง€ ๊ฐ€์ ธ์˜ค๊ธฐ: Fetcher๋Š” ์ปจ์Šˆ๋จธ๊ฐ€ ๊ตฌ๋…ํ•œ ํ† ํ”ฝ์˜ ๊ฐ ํŒŒํ‹ฐ์…˜์˜ ๋ฆฌ๋” ๋ธŒ๋กœ์ปค์— ์š”์ฒญ์„ ๋ณด๋‚ด ๋ฉ”์‹œ์ง€๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ์ด๋Š” ๊ฐ ๋ธŒ๋กœ์ปค๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ํŒŒํ‹ฐ์…˜์—์„œ ๋ฉ”์‹œ์ง€๋ฅผ ๋น„๋™๊ธฐ๋กœ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ์‹์œผ๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.

  • Fetch ์š”์ฒญ ๊ด€๋ฆฌ: Fetcher๋Š” ๊ฐ ํŒŒํ‹ฐ์…˜์— ๋Œ€ํ•ด fetch ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ , ์˜คํ”„์…‹์„ ๊ธฐ์ค€์œผ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ๊ฐ€์ ธ์˜จ ๋ฉ”์‹œ์ง€๋Š” ์ปจ์Šˆ๋จธ๊ฐ€ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

  • ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ ์œ ์ง€: Fetcher๋Š” ์˜คํ”„์…‹์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ์ฝ์–ด์˜ค๋ฉฐ, Kafka์˜ ์ผ๊ด€์„ฑ ๋ชจ๋ธ์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด, ๋ฐ์ดํ„ฐ๊ฐ€ ์ •ํ™•ํ•˜๊ฒŒ ์ฒ˜๋ฆฌ๋˜๊ณ , ๋ฉ”์‹œ์ง€์˜ ์ˆœ์„œ๊ฐ€ ์œ ์ง€๋  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

  • ํŽ˜์นญ ์„ฑ๋Šฅ ์ตœ์ ํ™”: Kafka ์ปจ์Šˆ๋จธ๋Š” ํ•œ ๋ฒˆ์— ์—ฌ๋Ÿฌ ํŒŒํ‹ฐ์…˜์—์„œ ๋ฉ”์‹œ์ง€๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด ์ตœ์ ํ™”๋œ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Fetcher๋Š” ์ด ๊ณผ์ •์—์„œ ์ตœ์ ์˜ ์„ฑ๋Šฅ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด, ๋ฐฐ์น˜ ํฌ๊ธฐ, ๋„คํŠธ์›Œํฌ ์ƒํƒœ ๋“ฑ์˜ ์š”์†Œ๋ฅผ ๊ณ ๋ คํ•˜์—ฌ ๋ฉ”์‹œ์ง€๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

Drawing

๋™์ž‘ ์›๋ฆฌ

ํ† ํ”ฝ ๊ตฌ๋… ๋ฐ ํŒŒํ‹ฐ์…˜ ํ• ๋‹น: Kafka ์ปจ์Šˆ๋จธ๋Š” ํ† ํ”ฝ์„ ๊ตฌ๋…ํ•˜๊ณ , ํ•ด๋‹น ํ† ํ”ฝ์˜ ํŒŒํ‹ฐ์…˜์„ ํ• ๋‹น๋ฐ›์Šต๋‹ˆ๋‹ค. ์ปจ์Šˆ๋จธ ๊ทธ๋ฃน ๋‚ด์—์„œ ํŒŒํ‹ฐ์…˜์€ ์ž๋™์œผ๋กœ ๋ถ„๋ฐฐ๋ฉ๋‹ˆ๋‹ค.

Fetcher๋ฅผ ํ†ตํ•œ ๋ฉ”์‹œ์ง€ ๊ฐ€์ ธ์˜ค๊ธฐ

Fetcher๋Š” ์ปจ์Šˆ๋จธ๊ฐ€ ํ• ๋‹น๋ฐ›์€ ํŒŒํ‹ฐ์…˜์—์„œ ์˜คํ”„์…‹์„ ๊ธฐ์ค€์œผ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

fetch ์š”์ฒญ์ด ํŒŒํ‹ฐ์…˜์˜ ๋ฆฌ๋” ๋ธŒ๋กœ์ปค๋กœ ๋ณด๋‚ด์ง€๋ฉฐ, Fetcher๋Š” ๋ธŒ๋กœ์ปค๋กœ๋ถ€ํ„ฐ ํ•ด๋‹น ์˜คํ”„์…‹ ์ดํ›„์˜ ๋ฉ”์‹œ์ง€๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

์˜คํ”„์…‹ ๊ด€๋ฆฌ ๋ฐ ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ

Fetcher๊ฐ€ ๊ฐ€์ ธ์˜จ ๋ฉ”์‹œ์ง€๋ฅผ ์ปจ์Šˆ๋จธ๋Š” ์˜คํ”„์…‹์„ ๊ธฐ์ค€์œผ๋กœ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๋ฉ”์‹œ์ง€๊ฐ€ ์ฒ˜๋ฆฌ๋˜๋ฉด, ์ปจ์Šˆ๋จธ๋Š” ์˜คํ”„์…‹์„ ์ปค๋ฐ‹ํ•˜์—ฌ ์ฒ˜๋ฆฌ๋œ ๋ฉ”์‹œ์ง€์˜ ์œ„์น˜๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.

๋ฆฌ๋ฐธ๋Ÿฐ์‹ฑ๊ณผ ํŒŒํ‹ฐ์…˜ ์žฌํ• ๋‹น

์ปจ์Šˆ๋จธ ๊ทธ๋ฃน์—์„œ ๋ฆฌ๋ฐธ๋Ÿฐ์‹ฑ์ด ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ, Fetcher๋Š” ์ƒˆ๋กœ์šด ํŒŒํ‹ฐ์…˜์— ๋Œ€ํ•ด fetch ์š”์ฒญ์„ ๋‹ค์‹œ ์„ค์ •ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ด์–ด์„œ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

Last updated