PROGRAMMING/Spring cloud

Spring cloud 02.1 - Kafka

Heony 2023. 1. 23. 11:46

๐Ÿ’๐Ÿป Kafka

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

 

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒํ™ฉ์„ ๋งŒ๋“ค์–ด ๋ณด์•˜๋‹ค. ๊ฐ ์‚ฌ๋žŒ์€ ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์„ ํ†ตํ•ด ๊ฐ ์‚ฌ๋žŒ๊ณผ ์—ฐ๊ฒฐ๋œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ข‹์€ ์ ์€ ๋ฌด์—‡์ผ๊นŒ?

์ผ๋‹จ, (๋ฌผ๋ก  ์ฒ˜์Œ์—๋งŒ) ์‰ฝ๊ณ  ์ง๊ด€์ ์ด๋‹ค. ๋ณดํ†ต ์ด๋ ‡๊ฒŒ ๊ฐœ๋ฐœํ•˜๊ณ  ์žˆ์ง€๋Š” ์•Š์€๊ฐ€? ํ•„์ž๋Š” ํ† ์ดํ”„๋กœ์ ํŠธ๋‚˜ ๋˜๋Š” ๊ฐ„๋‹จํ•œ ๊ฐœ๋ฐœ์„ ํ•˜๊ฒŒ ๋ ๋•Œ ๋‹น์—ฐํžˆ ์ด๋Ÿฌํ•œ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์–ด๋–ค ํ”„๋กœ์ ํŠธ์—์„œ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ๋  ๋•Œ ์ง์ ‘์ ์œผ๋กœ ์ฃผ์†Œ๋ฅผ ์š”์ฒญํ•˜์—ฌ ์—ฐ๊ฒฐ์‹œํ‚ค๊ณ ๋Š” ํ•œ๋‹ค. ์ด๋Š” ๋‹น์—ฐํžˆ ์ค‘๊ฐ„ ๊ตฌ์กฐ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์†๋„๊ฐ€ ๋น ๋ฅด๋‹ค๋Š” ํฌ๋‚˜ํฐ ์žฅ์ ์ด ์žˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ง€๊ธˆ๊ป ์ œ์ž‘ํ•ด์˜จ ๋ชจ๋†€๋ฆฌ์‹ ์•„ํ‚คํ…์ฒ˜๊ฐ€ ๋ฐ”๋กœ ์œ„์˜ ๊ตฌ์กฐ์ด๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋ชจ๋†€๋ฆฌ์‹ ์•„ํ‚คํ…์ฒ˜์˜ ๋‹จ์ ์€ spring cloud 1ํŽธ์—์„œ ์ด์•ผ๊ธฐ ํ–ˆ๋“ฏ์ด ํ™•์žฅ์„ฑ๊ณผ ์œ ์—ฐ์„ฑ์ด ์–ด๋ ต๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๋งŒ์•ฝ, 7๋ฒˆ ์‚ฌ๋žŒ์ด ์ถ”๊ฐ€๋œ๋‹ค๋ฉด 1๋ฒˆ๋ถ€ํ„ฐ 3๋ฒˆ๊นŒ์ง€์˜ ์‚ฌ๋žŒ์ด ์–ด๋–ป๊ฒŒ ์—ฐ๊ฒฐ๋˜์–ด์•ผ ํ•˜๋Š”์ง€, ์ถ”๊ฐ€์ ์ธ ์ž‘์—…์€ ์—†๋Š”์ง€, ๊ทœ์•ฝ์ด ๋ฐ”๋€Œ์ง€๋Š” ์•Š๋Š”์ง€ ๋“ฑ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์š”์†Œ๋ฅผ ์‹ ๊ฒฝ์จ์•ผ ํ•œ๋‹ค. ๋”์šฑ์ด ์‹œ๊ฐ„์ด๋‚˜ ๋น„์šฉ์ ์ธ ์ธก๋ฉด์—์„œ๋„ ์„œ๋น„์Šค๊ฐ€ ์ปค์ง์— ๋”ฐ๋ผ ํšจ์œจ์ ์ด์ง€ ๋ชปํ•˜๋‹ค.

์ „ํ™”๊ธฐ๋ก๋ถ€๊ฐ€ ์—†๋Š” ์ƒํƒœ์—์„œ ๋ฉ”์‹œ์ง€๋ฅผ ์ง์ ‘ ๋ณด๋‚ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด๋ผ. ๋ฏธ๋ฆฌ ์ €์žฅ๋˜์–ด ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ์ž์˜ ๋ฒˆํ˜ธ๋ฅผ ์™ธ์›Œ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด์•ผ ํ•˜๋ฉฐ, ์‹ฌ์ง€์–ด๋Š” ์•„๋Š” ์‚ฌ๋žŒ์ด ๋”์šฑ ๋งŽ์•„์งˆ์ˆ˜๋ก ๊ณจ์น˜์•„ํ”„๋‹ค.. ์–ธ์ œ ๋˜ ๋‹ค๋ฅธ ์ „ํ™”๋ฒˆํ˜ธ๋ฅผ ์™ธ์›Œ์•ผ ํ• ์ง€ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ด๋Ÿฌํ•œ ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•ํƒœ๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋˜์—ˆ๋‹ค.

 

๐Ÿฆด Kafka ๊ตฌ์กฐ

 

์ž์„ธํžˆ๋Š” ๋ชจ๋ฅด์ง€๋งŒ '์–ด๋–ค ๋ฌด์–ธ๊ฐ€'๊ฐ€ ์ค‘๊ฐ„์— ๊ตํ™˜๊ธฐ์ฒ˜๋Ÿผ ์žˆ๊ณ , ๊ฐ ์‚ฌ๋žŒ์€ ๋ฉ”์‹œ์ง€ ํ๊ฐ€ ์กด์žฌํ•œ๋‹ค. ์–ด๋–ค ๋ฌด์–ธ๊ฐ€๋Š” ๊ฐ ์‚ฌ๋žŒ์—๊ฒŒ '๋ฉ”์‹œ์ง€๊ฐ€ ์™”์–ด์š”!'๋ผ๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌํ•ด์ค€๋‹ค. ์•„์ง์€ '์–ด๋–ค ๋ฌด์–ธ๊ฐ€'๊ฐ€ ๋ญ”์ง€ ๋ชจ๋ฅด์ง€๋งŒ ์šฐ๋ฆฌ๋Š” 7๋ฒˆ ์‚ฌ๋žŒ์ด ์ถ”๊ฐ€๋˜์–ด๋„, 8๋ฒˆ ์‚ฌ๋žŒ์ด ์ถ”๊ฐ€๋˜์–ด๋„ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๋Š” ์‚ฌ๋žŒ์€ '์–ด๋–ค ๋ฌด์–ธ๊ฐ€'์˜ ์ฃผ์†Œ๋งŒ ๊ธฐ์–ตํ•ด๋‚ด๋ฉด ๋œ๋‹ค. ๊ฒฐ๊ตญ์€ ์‚ฌ๋žŒ์ด ์ถ”๊ฐ€๋˜์–ด๋„ ์ถ”๊ฐ€์ ์œผ๋กœ ๊ฐœ๋ฐœํ•  ์‚ฌํ•ญ๋“ค์€ ๋Œ€ํญ ์ค„์–ด๋“ค๊ณ , ํ™•์žฅ์„ฑ ๋ฉด์—์„œ๋„ ์ถฉ๋ถ„ํ•œ ์ด๋“์„ ๋ณธ ๊ฒƒ ๊ฐ™๋‹ค.

์ด๊ฒƒ์ด ๋ฐ”๋กœ kafka๊ฐ€ ํ•˜๋Š” ํ•ต์‹ฌ ์ผ์ด๋‹ค.

์‹ค์ œ๋กœ ๋งํฌ๋“œ์ธ์—์„œ kafka ์„œ๋น„์Šค ์—†์ด ๊ฐœ๋ฐœํ•  ๋•Œ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตฌ์กฐ๋ฅผ ๋ณด์—ฌ์ฃผ์—ˆ๋‹ค๊ณ  ํ•œ๋‹ค.

์ถœ์ฒ˜ : https://www.confluent.io/blog/event-streaming-platform-1/

๊ทธ๋ฆผ์ด ์–ด๋ ค์›Œ๋ณด์ด๋ฉด ์ •์ƒ์ด๋‹ค!

์šฐ๋ฆฌ๋Š” ์ด ๊ทธ๋ฆผ์—์„œ ์ด ํ๋ฆ„๋งŒ ์ดํ•ดํ•˜๋ฉด ๋œ๋‹ค. ๋งจ ์œ„์˜ Apps and Services๊ฐ€ Monitoring, Splunk(๋ฐ์ดํ„ฐ ์‹ค์‹œ๊ฐ„ ์ˆ˜์ง‘ ๋ฐ ๋ถ„์„), MQ(Message Queue), Relational Databases, Log Appregation ๋“ฑ ๋งŽ์€ ์„œ๋น„์Šค์— ์ง์ ‘์ ์œผ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ณด๋ฉด ๋œ๋‹ค. ๋งŒ์•ฝ, ์–ด๋–ค ์„œ๋น„์Šค๋ฅผ ์‹ค์ œ๋กœ ๋„์ž…ํ•œ๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ์— ์ค‘๊ฐ„์— ํ•˜๋‚˜ ๋„ฃ๊ฒŒ ๋˜๋ฉด ๊ทธ์™€ ๊ด€๋ จ๋œ ๊ด€๊ณ„ ์ฒ˜๋ฆฌ๋Š” ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ•˜๋Š”์ง€ ๋ฒŒ์จ๋ถ€ํ„ฐ ๊ณ ๋ฏผ์ด ๋œ๋‹ค. ๋งŒ์•ฝ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ํ•˜๋‚˜ ๋” ๋„์ž…ํ•œ๋‹ค๊ณ  ํ•˜๋ฉด ๊ทธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์–ด๋–ป๊ฒŒ ๋†“์„๊ฑด์ง€ ํ•œ ๋ฒˆ ์ƒ๊ฐํ•ด๋ณด๋ฉด ์ดํ•ด๊ฐ€ ๋  ๋“ฏ ํ•œ๋‹ค.

๋˜ํ•œ ๊ฐœ๋ฐœ์ ์ธ ์ธก๋ฉด์—์„œ ๋ณด์•˜์„ ๋•Œ ๊ฐœ๋ฐœ์€ ํšจ์œจ์ ์ธ ์ธก๋ฉด๋„ ์ค‘์š”ํ•˜์ง€๋งŒ ์™œ ๊ทธ๋ ‡๊ฒŒ ์„ค๊ณ„ํ–ˆ์„๊นŒ ํ•˜๋Š” ๋ถ€๋ถ„๋„ ์ •๋ง ์ค‘์š”ํ•œ ํฌ์ธํŠธ๊ฐ€ ๋œ๋‹ค. ์–ฝํžˆ๊ณ  ์„คํ‚จ ์ € ๊ด€๊ณ„๋“ค์„ ๋ณด๋ฉด์„œ ์ดํ•ดํ•˜๋Š” ๋ถ€๋ถ„์€ ๋น„ํšจ์œจ์ ์ธ ๋น„์šฉ์ด ์ถ”๊ฐ€์ ์œผ๋กœ ๋“œ๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ž˜์„œ ๋งํฌ๋“œ์ธ์€ ์นดํ”„์นด๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์‹œ์Šคํ…œ์„ ์žฌ๊ตฌ์„ฑํ–ˆ๋‹ค.

 

์ถœ์ฒ˜ : https://www.confluent.io/blog/event-streaming-platform-1/

๋กœ๊ทธ ๋ชจ๋‹ˆํ„ฐ๋ง, ๋ณด์•ˆ ๊ด€๋ฆฌ, ์‹ค์‹œ๊ฐ„ ๋ถ„์„ ๋ฐ ๋ฐ์ดํ„ฐ ์›จ์–ดํ•˜์šฐ์Šค, ์ŠคํŠธ๋ฆผ ์ฒ˜๋ฆฌ๋“ค์„ kafka์˜ ๋ฐ์ดํ„ฐ๋กœ๋ถ€ํ„ฐ ๋ฐ›๊ฒŒ ๋˜๊ณ , ์•ฑ ์„œ๋น„์Šค์—์„œ ๋‚˜์˜ค๋Š” ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ๋ฅผ ์ค‘์•™์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ํ˜•์‹์œผ๋กœ ๋ฐ”๊พธ์—ˆ๋‹ค. ํ•˜๋‚˜์˜ kafka ๋ถ„์‚ฐ ์ฒ˜๋ฆฌ๊ฐ€ ์ „์ฒด์˜ ํ๋ฆ„์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์„ ๋งŒํผ ์ค‘์š”ํ•œ ๋ชจ์Šต์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๊ธฐ์กด์—๋Š” ์ค‘์•™ํ™”๋œ ์ „์†ก ์˜์—ญ์˜ ๋ถ€์žฌ๊ฐ€ ์—”๋“œํฌ์ธํŠธ๋ฅผ ์„œ๋กœ ์—ฎ๋Š”๋ฐ ๋ณต์žกํ–ˆ๊ณ , ๊ฐ ์‹œ์Šคํ…œ๋งˆ๋‹ค ๊ตฌํ˜„๋˜๋Š” ๋ฐฉ์‹์ด ์„œ๋กœ ๋‹ฌ๋ผ ํ™•์žฅํ•˜๊ธฐ๊ฐ€ ์–ด๋ ค์› ๋‹ค. ๋งŒ์•ฝ ์ด์ „ ๋งํฌ๋“œ์ธ์˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์˜€๋‹ค๋ฉด ์–ด๋А ํ•œ ๊ณณ์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋”๋ผ๋„ ๊ทธ ์›์ธ์ง€๋ฅผ ์ฐพ๊ธฐ ์–ด๋ ค์šด ๋ฌธ์ œ๊นŒ์ง€ ๋ฐœ์ƒํ–ˆ์„ ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ kafka๋ฅผ ๋„์ž…ํ•˜๋ฉฐ ์„œ๋น„์Šค ํ™•์žฅ์—๋„ ์šฉ์ดํ•˜๋ฉฐ, ์ถ”๊ฐ€์ ์ธ ์žฅ์ ์œผ๋กœ '์‹ค์‹œ๊ฐ„์„ฑ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ'๊ฐ€ ์ƒ๊ฒผ๋‹ค. ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•ด๋„ ๋ฐ”๋กœ ์š”์ฒญํ•ด์„œ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ์ด ์•„๋‹Œ, ๋ฉ”์‹œ์ง• ํ์— ์ด๋ฒคํŠธ๋ฅผ ๋ณด๋‚ด๋†“๊ณ  ์ž์‹ ์ด ์ˆ˜ํ–‰ํ•  ์ผ๋งŒ ์ง„ํ–‰ํ•˜๊ณ  ์žˆ๋‹ค๊ฐ€ ๋ฉ”์‹œ์ง• ์ฒ˜๋ฆฌ๊ฐ€ ๋๋‚˜๋ฉด ๊ฒฐ๊ณผ๊ฐ’์„ ๋ฐ›๋Š” ์ด๋ฆ„๋ฐ” ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง„ ๊ฒƒ์ด๋‹ค.

์‰ฝ๊ฒŒ ์˜ˆ์‹œ๋ฅผ ๋“ค์–ด๋ณด์ž. ์ด์ „ ๋‚ด์šฉ๊ณผ ๋‹ค ์ผ๋งฅ์ƒํ†ตํ•˜๋Š”๋ฐ ์‰ฌ์šด ์˜ˆ์‹œ๊ฐ€ ์ƒ๊ฐ๋‚ฌ๋‹ค.
๊ฐ€๋” ์•Œ๋ผ๋”˜์—์„œ ์ฑ…์„ ๊ตฌ๋งคํ•˜๋‹ค๋ณด๋ฉด ์ง‘ ์•ž์—์„œ ๋ฐ›๋Š” ํƒ๋ฐฐ๋„ ์žˆ์ง€๋งŒ, ๊ฐ€๊นŒ์šด ๋Œ€๋ฆฌ์ ์— ๊ฐ€์„œ ์ฑ…์„ ํ”ฝ์—…ํ•ด๊ฐ€๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ชจ์Šต์€ ํก์‚ฌ kafka์™€ ๊ฐ™๋‹ค. ์•Œ๋ผ๋”˜ ๋ณธ์‚ฌ๊ฐ€ producer, ๊ฐ ๋Œ€๋ฆฌ์ ์€ kafka, ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๊ฐ€ consumer๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ๋Œ€๋ฆฌ์ ์ด ์žˆ๊ธฐ์— ์•Œ๋ผ๋”˜ ๋ณธ์‚ฌ๋Š” ์šฐ๋ฆฌ์˜ ์ฃผ์†Œ๋ฅผ ์ƒ๊ฐํ•  ํ•„์š”๊ฐ€ ์—†๊ณ , ๋Œ€๋ฆฌ์ ์—๊ฒŒ ์ฑ…๋งŒ ๋ณด๋‚ด์ฃผ๋ฉด ๊ทธ ์•Œ๋žŒ์ด consumer์ธ ์šฐ๋ฆฌ์—๊ฒŒ ๋„๋‹ฌํ•˜์—ฌ ์šฐ๋ฆฌ๋Š” ์ฑ…๋งŒ ๊ฐ€์ง€๋Ÿฌ ๊ฐ€๋ฉด ๋œ๋‹ค.

 

๐Ÿ”  Kafka ์šฉ์–ด ์„ค๋ช…

๊ทธ๋Ÿฌ๋ฉด ์ƒˆ๋กœ์šด ์šฉ์–ด๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”๋ฐ, kafka๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ ์šฉ์–ด๋ฅผ ์•Œ์•„๋ณด์ž

Producer : ๋ฉ”์‹œ์ง€๋ฅผ ์ƒ์‚ฐํ•˜๋Š” ์ฃผ์ฒด, ํŠน์ • ํ† ํ”ฝ์„ ์ง€์ •ํ•˜์—ฌ ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.
Consumer : ๋ฉ”์‹œ์ง€๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์š”์ฒญ. ํŠน์ • ํŒŒํ‹ฐ์…˜์„ ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ๋Š” ํŒŒํ‹ฐ์…˜ ๋ฆฌ๋”์—๊ฒŒ ์š”์ฒญํ•œ๋‹ค.
Topic : ๋ฉ”์‹œ์ง€์˜ ๊ทธ๋ฃน. ํ”„๋กœ๋“€์„œ์™€ ์ปจ์Šˆ๋จธ ์‚ฌ์ด์˜ ๋ฉ”์‹œ์ง€ ํ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค. ๋ณดํ†ต Topic์€ ๊ฐ ๋ฉ”์‹œ์ง€ ์ฃผ์ œ์— ๋งž์ถ”์–ด ์ƒ์„ฑํ•œ๋‹ค.
Record : ๋ฉ”์‹œ์ง€ ๋˜๋Š” ๋ฐ์ดํ„ฐ.
Broker : kafka๊ฐ€ ์„ค์น˜๋œ ์„œ๋ฒ„๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
Cluster : apache project application์œผ๋กœ ๋ธŒ๋กœ์ปค๋ฅผ ๊ตฌ์„ฑํ•œ ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

 

โš’๏ธ Spring Cloud Kafka

๐Ÿ”Ž Docker์œผ๋กœ kafka ๋ฐ zookeeper ์„ค์น˜

๋ณธ๊ฒฉ์ ์œผ๋กœ kafka์— ๋„์ „ํ•ด๋ณด์ž.

Spring cloud ์„œ๋ฒ„ ์™ธ์—๋„ ์šฐ๋ฆฌ๋Š” kafka server๋ฅผ ์ถ”๊ฐ€์ ์œผ๋กœ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค. producer์™€ consumer๋Š” spring cloud์—์„œ ๋‹ด๋‹นํ•œ๋‹ค๋Š” ์ด์•ผ๊ธฐ๋‹ค. kafka๋ฅผ ์„ค์น˜ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” docker๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŽธ๋ฆฌํ•˜๊ฒŒ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, docker ์„ค์น˜์™€ ๊ด€๋ จํ•ด์„œ๋Š” ๊ฐ์ž๊ฐ€ ์ฐพ์•„๋ณด๊ธธ ๋ฐ”๋ž€๋‹ค.

docker์œผ๋กœ kafka์™€ zookeeper์„ ์„ค์น˜ํ•œ๋‹ค.

// zookeeper ์„ค์น˜
docker pull wurstmeister/zookeeper

// kafka ์„ค์น˜
docker pull wurstmeister/kafka

 

vi์œผ๋กœ docker-compose.yml ํŒŒ์ผ์„ ์ œ์ž‘ํ•˜๊ณ , ๋‹ค์Œ ๋‚ด์šฉ์„ ๋„ฃ๋Š”๋‹ค.

docker-compose.yml

version: '2'
services:
  zookeeper:
    container_name: zookeeper
    image: wurstmeister/zookeeper
    ports:
      - "2181:2181"
  kafka:
    container_name: kafka
    image: wurstmeister/kafka
    depends_on:
      - zookeeper
    ports:
      - "9092:9092"
    environment:
      KAFKA_ADVERTISED_HOST_NAME: 127.0.0.1
      KAFKA_ADVERTISED_PORT: 9092
      KAFKA_CREATE_TOPICS: "test-topic:1:1"
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

 

๋‹ค์‹œ ๋Œ์•„์™€์„œ docker-compose๋ฅผ ์‹คํ–‰์‹œํ‚จ๋‹ค.

docker-compose up -d

lazydocker๊ฐ€ ๋‹ค์šด๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒํƒœ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

[Mac ๊ธฐ์ค€]
์—†๋‹ค๋ฉด brew install lazydocker๋กœ ๋‹ค์šด์„ ๋ฐ›๊ณ 
sudo lazydocker๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ™”๋ฉด์ด ๋‚˜์˜จ๋‹ค.

ํ™”๋ฉด์—์„œ ๋‚˜์˜ค๋Š” ๋ฐฉ๋ฒ•์€ q๋งŒ ๋ˆ„๋ฅด๋ฉด ๋œ๋‹ค.

์—ฌ๊ธฐ๊นŒ์ง€ zookeeper์™€ kafka๋ฅผ ํ†ตํ•ด kafka์„œ๋ฒ„๋ฅผ ์ œ์ž‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.
์šฐ๋ฆฌ๊ฐ€ ์ž‘์—…ํ•ด์•ผํ•˜๋Š” ๋‘๋ฒˆ์งธ ๋‹จ๊ณ„๋Š” kafka ๋‚ด์— topic์„ ์ƒ์„ฑํ•˜๊ณ  producer์˜ ๋ฉ”์‹œ์ง€ ์ „์†ก, consumer์˜ ๋ฉ”์‹œ์ง€ ์ฝ๊ธฐ ๋ฐ Spring์œผ๋กœ producer์™€ consumer์˜ ๊ตฌํ˜„์„ ํ•ด๋ณด์•„์•ผ ํ•œ๋‹ค.

๋‹ค์Œ์„ ํ†ตํ•ด docker์œผ๋กœ ๋„์šด kafka์— ๋“ค์–ด๊ฐ€๋ณด์ž

docker exec -it kafka /bin/bash

 

kafka ์„œ๋ฒ„์—์„œ topic์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

kafka-topics.sh --create --topic heony-topic --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1

 

์ค‘๊ฐ„์— heony-topic์€ ํ•„์ž๊ฐ€ ์ƒ์„ฑํ•œ ํ† ํ”ฝ์˜ ์ด๋ฆ„์ด๋ฉฐ, ๋ณธ์ธ์ด ํ•˜๊ณ  ์‹ถ์€ ํ† ํ”ฝ ์ฃผ์ œ๋ฅผ ์ž‘์„ฑํ•ด์„œ ์จ๋„ ๋œ๋‹ค.

root@d6f8ae8b644e:/# kafka-topics.sh --create --topic heony-topic --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1
Created topic heony-topic.
root@d6f8ae8b644e:/#

 

์•ž์„œ ์†Œ๊ฐœํ•œ kafka์˜ topic์„ ์ œ์ž‘ํ–ˆ์œผ๋ฉฐ, producer๋‚˜ consumer ๋˜ํ•œ ์นดํ”„์นด ์„œ๋ฒ„ ๋‚ด์—์„œ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ์˜ ๋ชฉํ‘œ๋Š” spring cloud๋ฅผ ํ†ตํ•ด kafka๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— docker ๋‚ด์—์„œ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์„ ์ƒ๋žตํ•œ๋‹ค.

 

๐Ÿง‘๐Ÿป‍๐Ÿ’ป Spring boot์—์„œ kafka ์ƒ์„ฑ

spring boot ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋‹ค๋ณด๋ฉด dependencies๋ฅผ ์„ ํƒํ•˜๋Š” ๋ถ€๋ถ„์—์„œ ๋‘ ๊ฐœ์˜ ์„ ํƒ์ง€๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๋‘ ๊ฐœ์˜ ์„ ํƒ์ง€๋ฅผ ๋ชจ๋‘ ์„ ํƒํ•  ํ•„์š”๋Š” ์—†๋‹ค. ๊ฒน์น˜๊ฒŒ ๋˜๋ฏ€๋กœ.
ํ•˜์ง€๋งŒ ๋ฌด์—‡์ด ๋‹ค๋ฅธ์ง€๋Š” ํ•œ๋ฒˆ ์ง‘๊ณ  ๋„˜์–ด๊ฐ€๋ณด์ž. 

spring-cloud ๊ณต์‹ ์‚ฌ์ดํŠธ์—์„œ๋Š” spring-cloud-stream-binder-kafka๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ,
์‚ฌ์ดํŠธ๋ฅผ ๋Œ์•„๋‹ค๋‹ˆ๋‹ค ๋ณด๋ฉด ๊ทธ๋ƒฅ spring-kafka๋งŒ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

<dependency>
    <groupId>org.springframework.kafka</groupId>
    <artifactId>spring-kafka</artifactId>
</dependency>

 

spring-kafka์™€ spring-cloud-stream-binder-kafka์™€์˜ ์ฐจ์ด๋Š” ์•„๋ž˜ ์‚ฌ์ดํŠธ์— ์ž˜ ๋‚˜์™€์žˆ๋‹ค.
https://stackoverflow.com/questions/69335758/difference-between-spring-cloud-kafka-streams-vs-spring-cloud-stream

 

Difference between Spring Cloud Kafka Streams Vs Spring Cloud Stream?

Whats the difference between Spring Cloud Kafka Streams Vs Spring Cloud Stream Vs Spring Cloud Function Vs Spring AMQP and Spring for Apache Kafka?

stackoverflow.com

์š”์•ฝํ•˜์ž๋ฉด,
Spring for Apache Kafka(์œ„์˜ spring-kafka์™€ ๊ฐ™์Œ) - ๋‚ฎ์€ ์ˆ˜์ค€์˜ ๊ธฐ๋ณธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋ฉฐ ์Šคํ”„๋ง ๋ถ€ํŠธ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค
Spring Cloud Function - java 8 ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ชจ๋ธ์„ ์ œ๊ณตํ•˜๋ฉฐ ์ด๋Š” spring boot ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ๋œ๋‹ค.
Spring Cloud Stream - ์ด๋ฒคํŠธ ์ค‘์‹ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•œ ํ”„๋ ˆ์ž„ ์›Œํฌ์ด๋ฉฐ spring boot ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ์‚ฌ์šฉ๋œ๋‹ค.
Spring Cloud Stream Kafka/Kafka Streams - Apache Kafka์šฉ Spring์„ ํ™œ์šฉํ•˜์—ฌ Spring Cloud Stream binder ๊ตฌํ˜„

๊ฒฐ๊ตญ ์ƒํ™ฉ์— ๋งž๋Š” ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. ๊ธฐ๋Šฅ์— ๋”ฐ๋ผ ๋ถ„๋ฅ˜๋˜๋ฏ€๋กœ.

 

๐Ÿ™†๐Ÿป ๊ฐœ๋ฐœ

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

728x90