Kafka

Kafka๋Š” ์š”์ฆ˜ Uber, ์—์–ด๋น„์—”๋น„, ๋„ทํ”Œ๋ฆญ์Šค ๋“ฑ ๋งŽ์€ ํšŒ์‚ฌ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋น…๋ฐ์ดํ„ฐ ๊ณต๊ฐ„์—์„œ ๊ฐ€์žฅ ์ธ๊ธฐ์žˆ๋Š” ์ด๋ฒคํŠธ ์ŠคํŠธ๋ฆฌ๋ฐ ํ”Œ๋žซํผ์ด๋‹ค.


Event Streaming Platform

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

traditional-enterprise-architecture

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

event-streaming-platform

์ด๋ฒคํŠธ ์ŠคํŠธ๋ฆฌ๋ฐ ํ”Œ๋žซํผ์€ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ, ๋กœ๊ทธ, ํƒ€์‚ฌ ์•ฑ ๋“ฑ์˜ ๋ชจ๋“  ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ€ํ•œ ๋‹จ์ผ ์ ‘์ ์˜ ์—ญํ• ์„ ํ•œ๋‹ค. ๋Œ€ํ‘œ์ ์ธ ๋Œ€๊ทœ๋ชจ ์ŠคํŠธ๋ฆฌ๋ฐ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ์—”์ง„์œผ๋กœ๋Š” Kafka, Spark Streaming, Apache Flink ๋“ฑ์ด ์žˆ๋‹ค.์ด๋Ÿฌํ•œ ์—”์ง„๋“ค์„ ํ†ตํ•˜์—ฌ ์‹ค์‹œ๊ฐ„ ์ด๋ฒคํŠธ๋“ค์„ ๋ชจ์€๋‹ค. ์ด๋Ÿฌํ•œ ์ด๋ฒคํŠธ๋“ค์€ ์นด๋ฉ”๋ผ์™€ ๊ฐ™์€ ์ŠคํŠธ๋ฆผ ์ฒ˜๋ฆฌ ์—”์ง„์„ ํ†ตํ•ด ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ๊ธฐ๋ก๋˜๋ฉฐ, ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ด๋Ÿฌํ•œ ์ด๋ฒคํŠธ๋ฅผ ์žฌ์ƒํ•˜๊ณ  ๊ฐœ์ž…ํ•˜๊ณ  ๋ฐ˜์‘ํ•  ์ˆ˜ ์žˆ๋‹ค.


์žฅ์ 

  1. ๋‹จ์ผ ์†”๋ฃจ์…˜์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ๋ฐ์ดํ„ฐ ์ธํ”„๋ผ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.(๋†’์€ ์ฒ˜๋ฆฌ๋Ÿ‰, ์ง€์†์„ฑ, ์งง์€ ๋Œ€๊ธฐ์‹œ๊ฐ„, ๋ชจ๋“  ์ด๋ฒคํŠธ ๋ฐ ์‹œ์Šคํ…œ์ด ์—ฐ๊ฒฐ๋˜๋Š” ๋ฒ”์šฉ ์ด๋ฒคํŠธ ํŒŒ์ดํ”„๋ผ์ธ)

    -> ์ด๋กœ ์ธํ•ด ์„œ๋กœ ๋‹ค๋ฅธ ์‹œ์Šคํ…œ๋ผ๋ฆฌ ์„œ๋กœ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜์ด ๊ฐ€๋Šฅํ•ด์กŒ๋‹ค.

  2. ๋ ˆ๊ฑฐ์‹œ ๋ฐ์ดํ„ฐ ์›จ์–ดํ•˜์šฐ์Šค, RDBMS๋ฅผ ํ˜„๋Œ€ํ™”ํ•˜๊ณ , ํƒ„๋ ฅ์ ์ธ ์ƒํƒœ ์ €์žฅ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ๋ฅผ ๊ตฌ์ถ• ๊ฐ€๋Šฅ

  3. ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ํด๋ผ์šฐ๋“œ ์ŠคํŠธ๋ฆฌ๋ฐ ํ”Œ๋žซํผ ๊ตฌ์ถ•


Kafka์˜ ๊ตฌ์„ฑ์š”์†Œ

Kafka : Pub/Sub ๋ชจ๋ธ

pub sub ๋ชจ๋ธ

์•„ํŒŒ์น˜ ์นดํ”„์นด๋Š” ์ค‘์•™์ง‘์ค‘ํ˜• ๋ฉ”์‹œ์ง€ ๊ด€๋ฆฌ ๋ฐฉ์‹์œผ๋กœ ๋ฉ”์‹œ์ง€์˜ ์ƒ์„ฑ๊ณผ ์†Œ๋น„์™€ ๊ด€๋ฆฌ๋ฅผ ์™„์ „ํžˆ ๋…๋ฆฝ์‹œํ‚จ pub-sub ๋ฉ”์‹œ์ง• ์‹œ์Šคํ…œ์ด๋‹ค. ๋ฉ”์‹œ์ง€๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ์ดํ„ฐ ํ๋ฅผ ์ค‘์•™์— ๋‘๊ณ , ๋…๋ฆฝ์ ์ธ ๋ฐ์ดํ„ฐ์˜ ์ œ๊ณต, ์†Œ๋น„๊ฐ€ ์ด๋ฃจ์–ด ์ง„๋‹ค. ์ด์™€ ๊ฐ™์€ ํŒจํ„ด์„ publish / subscribe ๋ชจ๋ธ ํŒจํ„ด์ด๋ผ๊ณ  ํ•˜๋ฉฐ, ์ด๋Ÿฐ ๋Š์Šจํ•œ ๊ฒฐํ•ฉ์„ ํ†ตํ•˜์—ฌ ์ œ๊ณต๊ณผ ์†Œ๋น„๋ฅผ ์š”์ฒญํ•œ ๊ณณ์—์„œ ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ์—๋„ ์˜์กด์„ฑ์ด ์—†์œผ๋ฏ€๋กœ ์•ˆ์ •์ ์ธ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.


Kafka Cluster

kafka cluster

์นดํ”„์นด ํด๋Ÿฌ์Šคํ„ฐ๋Š” ์ž„์˜ ๊ฐฏ์ˆ˜์˜ ๋…ธ๋“œ๋กœ ๊ตฌ์„ฑ๋˜๊ณ , ์—ฌ๊ธฐ์„œ ๋…ธ๋“œ๋ฅผ broker๋ผ๊ณ  ๋ฐ”๊ฟ” ๋งํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ณดํ†ต ํด๋Ÿฌ์Šคํ„ฐ์—๋Š” 1๊ฐœ ์ด์ƒ์˜ ๋ธŒ๋กœ์ปค๋ฅผ ๋‘์–ด ํŠน์ • ๋…ธ๋“œ์˜ ๋ฌผ๋ฆฌ์  ์žฅ์• ๋กœ ์ธํ•œ ๋ฐ์ดํ„ฐ ์œ ์‹ค์„ ๋Œ€๋น„ํ•œ๋‹ค.


Broker

๋‹จ์ผ Kafka ์„œ๋ฒ„๋ฅผ Broker๋ผ๊ณ  ํ•œ๋‹ค. Broker๋Š” Producer๋กœ๋ถ€ํ„ฐ ๋ฉ”์‹œ์ง€๋ฅผ ์ˆ˜์‹ ํ•˜๊ณ  Offset์„ ํ• ๋‹นํ•˜๊ณ  ๋””์Šคํฌ์˜ ์ €์žฅ์†Œ์— ๋ฉ”์‹œ์ง€๋ฅผ ์ปค๋ฐ‹ํ•œ๋‹ค. Consumer์—๊ฒŒ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜์—ฌ ํŒŒํ‹ฐ์…˜์— ๋Œ€ํ•œ Fetch ์š”์ฒญ์— ์‘๋‹ตํ•˜๊ณ  ๋””์Šคํฌ์— ์ปค๋ฐ‹๋œ ๋ฉ”์‹œ์ง€์— ์‘๋‹ตํ•œ๋‹ค. ํ•˜๋“œ์›จ์–ด ์„ฑ๋Šฅ์— ๋”ฐ๋ผ ๋‹จ์ผ Broker๊ฐ€ ์ดˆ๋‹น ์ˆ˜์ฒœ ๊ฐœ์˜ ํŒŒํ‹ฐ์…˜๊ณผ ์ˆ˜๋ฐฑ๋งŒ ๊ฐœ์˜ ๋ฉ”์‹œ์ง€๋ฅผ ์‰ฝ๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.


Topic & Partition

Topic์€ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ๋…ผ๋ฆฌ์ ์ธ ๋ชจ๋ธ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•œ ๋‹จ์œ„์ด๋‹ค. ํŒŒ์ผ ์‹œ์Šคํ…œ์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ” ๋˜๋Š” ํด๋”์™€ ๊ฐ™๋‹ค. ๋ฐ์ดํ„ฐ์˜ ์ฒ˜๋ฆฌ๋Ÿ‰์„ ๋†’์ด๊ธฐ ์œ„ํ•ด 1๊ฐœ์˜ Topic์€ 1๊ฐœ ์ด์ƒ์˜ ํŒŒํ‹ฐ์…˜์„ ๊ฐ€์ง€๊ณ  ์•„๋ž˜์™€ ๊ฐ™์ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„์‚ฐ์‹œ์ผœ ์ €์žฅํ•œ๋‹ค.

partition

3๊ฐœ์˜ Broker๋กœ ๊ตฌ์„ฑ๋œ Kafka Cluster์— Topic์„ 4๊ฐœ์˜ ํŒŒํ‹ฐ์…˜, replica๋Š” 3๊ฐœ๋กœ ์„ค์ •ํ•ด์„œ ์ƒ์„ฑํ•˜์˜€๋‹ค. ์—ฌ๊ธฐ์„œ replica๋ฅผ ์„ค์ •ํ•˜๋Š” ์ด์œ ๋Š” ๋ธŒ๋กœ์ปค ๋…ธ๋“œ์˜ ์žฅ์• ๋‚˜ Fail์— ๋Œ€๋น„ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ด๋‹ค. ๊ทธ๋ฆฌํ•˜์—ฌ 0~3๊นŒ์ง€์˜ ํŒŒํ‹ฐ์…˜์ด ์ƒ์„ฑ๋˜๊ณ , ๊ฐ ํŒŒํ‹ฐ์…˜์ด 3๊ฐœ๋กœ ๋ณต์ œ๊ฐ€ ๋˜์—ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ๊ฐ ํŒŒํ‹ฐ์…˜๋งˆ๋‹ค ๋ฆฌ๋”๊ฐ€ ์„ ์ถœ๋˜๊ณ , ๋‚˜๋จธ์ง€๋Š” ํŒ”๋กœ์›Œ๊ฐ€ ๋œ๋‹ค. ๋ฆฌ๋”๋Š” Producer, Consumer๋ฅผ ํ†ตํ•œ ๋ฐ์ดํ„ฐ write/read๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ , ํŒ”๋กœ์›Œ๋Š” ๋ฐ์ดํ„ฐ ๋ณต์ œ๋งŒ์„ ๋‹ด๋‹นํ•œ๋‹ค. ๋งŒ์ผ ๋ฆฌ๋”๋…ธ๋“œ๊ฐ€ ์žˆ๋Š” ๋ธŒ๋กœ์ปค์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋ฉด zookeeper์—์„œ ๋‚˜๋จธ์ง€ ํŒ”๋กœ์›Œ ์ค‘์— ์ƒˆ๋กœ์šด ๋ฆฌ๋”๋ฅผ ์„ ์ถœํ•˜์—ฌ ๋ฐ์ดํ„ฐ์˜ ์œ ์‹ค์„ ๋ฐฉ์ง€ํ•˜๊ณ  ๋ณต๊ตฌ๋ฅผ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์œ„ ๊ฒฝ์šฐ๋Š” ํ•œ replica๊ฐ€ 3์ด๋ฏ€๋กœ 2๋ฒˆ์˜ ์žฅ์• ๊นŒ์ง€ ๊ฒฌ๋”œ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

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

ํŠนํžˆ Kafka์—์„œ๋Š” ํŒŒํ‹ฐ์…˜์„ ์ฆ๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ์•„๋ฌด๋•Œ๋‚˜ ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ๋ฐ˜๋Œ€๋กœ ํŒŒํ‹ฐ์…˜์˜ ์ˆ˜๋ฅผ ์ค„์ด๋ ค๋ฉด ํ† ํ”ฝ์„ ์‚ญ์ œํ•˜๋Š” ๋ฐฉ๋ฒ•๋ฐ–์— ์—†๋‹ค. ๋˜ํ•œ ๋ฉ”์‹œ์ง€๋Š” HDFS์™€ ๊ฐ™์€ append-only ๋ฐฉ์‹์œผ๋กœ ํ† ํ”ฝ์— ๊ธฐ๋ก๋œ๋‹ค.

kafka producer-broker-consumer structure

์œ„ ๊ทธ๋ฆผ์€ Producer์™€ Broker, Consumer ์˜ ๊ตฌ์กฐ๋ฅผ ๊ทธ๋ฆผ์œผ๋กœ ํ‘œํ˜„ํ•œ ๊ฒƒ์ด๋‹ค. Producer๋Š” 1~9๊นŒ์ง€ ์ˆœ์„œ๋Œ€๋กœ ๋ฉ”์‹œ์ง€๋ฅผ publishํ•˜์˜€๋‹ค. Consumer๋Š” ๊ฐ ํŒŒํ‹ฐ์…˜๋งˆ๋‹ค ๊ฐ€์ง€๊ณ ์žˆ๋Š” Offset๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ์ฝ์–ด์˜จ๋‹ค. ๋งŒ์•ฝ ํ•˜๋‚˜์˜ Consumer๊ฐ€ 3๊ฐœ์˜ ํŒŒํ‹ฐ์…˜์„ ๋ชจ๋‘ subscribeํ•œ ๊ฒฝ์šฐ์—”, Producer๊ฐ€ ๋ณด๋ƒˆ์„๋•Œ์˜ ์ˆœ์„œ๋Œ€๋กœ ์˜ค์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค. ๋‹ค๋ฅธ ํŒŒํ‹ฐ์…˜๋ผ๋ฆฌ๋Š” ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ํ•˜์ง€๋งŒ ํ•˜๋‚˜์˜ ํŒŒํ‹ฐ์…˜ ๋‚ด์—์„œ๋Š” ๋ฉ”์‹œ์ง€์˜ ์ˆœ์„œ๊ฐ€ ๋ณด์žฅ๋œ๋‹ค. ๊ทธ๋ž˜์„œ ๋งŒ์•ฝ ๋ฉ”์‹œ์ง€์˜ ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•œ ๊ฒฝ์šฐ, ํŒŒํ‹ฐ์…˜์˜ ์ˆ˜๋ฅผ 1๋กœ ๋‘๊ฑฐ๋‚˜, ์ˆœ์„œ๊ฐ€ ๋ณด์žฅ๋˜์–ด์•ผ ํ•˜๋Š” ๋ฉ”์„ธ์ง€๋Š” ๊ฐ™์€ ํŒŒํ‹ฐ์…˜์— ๋“ค์–ด๊ฐ€๋„๋ก ํŒŒํ‹ฐ์…˜ํ‚ค(ํ•ด์‹œํ‚ค)๋ฅผ ์„ค์ •ํ•˜์—ฌ์•ผ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์‹ฑ๊ธ€ ํŒŒํ‹ฐ์…˜์œผ๋กœ ํ–ˆ์„๋•Œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ด๋ก ๋“ค์ด ์žˆ๋‹ค. ํ•ด๋‹น ๋ธŒ๋กœ์ปค๊ฐ€ ์ฃฝ์—ˆ๋‹ค๊ฐ€ ๋‹ค์‹œ ์‚ด์•„๋‚˜๋Š” ๊ทธ ์ฐฐ๋‚˜๊ฐ€ ๋ฌธ์ œ์ด๋‹ค. ๋ฌผ๋ก  ์˜ต์…˜์„ ํ†ตํ•ด์„œ ์ฃฝ์—ˆ๋˜ ๊ณณ๋ถ€ํ„ฐ ๋‹ค์‹œ ์†Œ๋น„๋ฅผ ํ•˜๋Š” offset.reset ์ „๋žต์„ ํƒํ–ˆ์ง€๋งŒ, ๋„คํŠธ์›Œํฌ ์ด์Šˆ๋กœ ์ธํ•ด ์ค‘๋ณต์†Œ๋น„๋˜๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. confluent ํŒ€๋„ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ์ ์„ ๊ณ ๋ฏผํ•˜๊ณ  ๋‚˜์˜จ๊ฒƒ์ด Exactly-Once-Delivery๋ผ๋Š” ์ปจ์…‰์ด๋‹ค.


Producer

topic์— ๋ฐ์ดํ„ฐ๋ฅผ ์“ฐ๋Š” ์—ญํ• , ์ƒˆ๋กœ์šด ๋ฉ”์‹œ์ง€๋ฅผ ๋งŒ๋“ ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” ๋ฉ”์‹œ์ง€๋Š” ํŠน์ • ํ† ํ”ฝ์— ๋Œ€ํ•ด ์ƒ์„ฑ๋˜๋ฉฐ, ๋ชจ๋“  ํŒŒํ‹ฐ์…˜์— ๊ท ๋“ฑํ•˜๊ฒŒ ๋ฉ”์‹œ์ง€ ๊ท ํ˜•์„ ์œ ์ง€ํ•œ๋‹ค. Producer๊ฐ€ ํ•ด์‹œํ‚ค๋ฅผ ์ด์šฉํ•˜์—ฌ ํŠน์ • ํŒŒํ‹ฐ์…˜์œผ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ผ ์ˆ˜๋„ ์žˆ๋‹ค.


Consumer

topic์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ๊ฐ€๋Š” ์—ญํ• . ๋ฉ”์‹œ์ง€๋ฅผ ์ฝ๋Š”๋‹ค. ํŠน์ • Topic์„ ๊ตฌ๋…ํ•จ์œผ๋กœ์จ, ์ž๊ธฐ๊ฐ€ ์Šค์Šค๋กœ ์กฐ์ ˆํ•ด๊ฐ€๋ฉด์„œ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค. ํ•ด๋‹น topic ๋‚ด์˜ ๊ฐ ํŒŒํ‹ฐ์…˜์— ์กด์žฌํ•˜๋Š” Offset๊ณผ Consumer๊ฐ€ ์ด์ „์— ์†Œ๋น„ํ–ˆ๋˜ Offset์˜ ์œ„์น˜๋ฅผ ํ†ตํ•ด ๋งˆ์ง€๋ง‰์œผ๋กœ ์ฝ์—ˆ๋˜ ์œ„์น˜์—์„œ๋ถ€ํ„ฐ ๋‹ค์‹œ ์ฝ์–ด๋“ค์ผ ์ˆ˜ ์žˆ๋‹ค.


Consumer Group

๋ง ๊ทธ๋Œ€๋กœ Consumer๋“ค์˜ ๋ฌถ์Œ์ด๋‹ค. ๊ธฐ์กด์˜ Message Queue ์†”๋ฃจ์…˜์—์„œ๋Š” Consumer๊ฐ€ ๋ฉ”์‹œ์ง€๋ฅผ ๊ฐ€์ ธ๊ฐ€๋ฉด, ํ•ด๋‹น ๋ฉ”์‹œ์ง€๋Š” ํ์—์„œ ์‚ญ์ œ๋œ๋‹ค. ํ•˜์ง€๋งŒ Kafka๋Š”, Consumer๊ฐ€ ๋ฉ”์‹œ์ง€๋ฅผ ๊ฐ€์ ธ๊ฐ€๋„ ํ์—์„œ ์ฆ‰์‹œ ์‚ญ์ œ๋˜์ง€ ์•Š์œผ๋ฉฐ, ํ•˜๋‚˜์˜ ํ† ํ”ฝ์— ์—ฌ๋Ÿฌ Consumer Group์ด ๋ถ™์–ด ๋ฉ”์‹œ์ง€๋ฅผ ๊ฐ€์ ธ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.(2.x ๊ธฐ์ค€ default 7์ผ) ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค.

consumer group

์—ฌ๊ธฐ์— ๊ธฐ๋ณธ์ ์ธ ๋ฃฐ ํ•˜๋‚˜๊ฐ€ ์กด์žฌํ•œ๋‹ค. ๋ฐ˜๋“œ์‹œ ํ† ํ”ฝ์˜ ํŒŒํ‹ฐ์…˜๊ณผ Consumer Group์€ 1:n์ด์—ฌ์•ผ ํ•œ๋‹ค. ์œ„ ๊ทธ๋ฆผ์„ ๋ณด์ž. ๊ทธ๋ฆผ์—์„œ ๋ณด๋‹ค์‹œํ”ผ, ๋‹จ ํ•˜๋‚˜์˜ ํŒŒํ‹ฐ์…˜์—๋Š” ๋™์ผํ•œ Consumer Group์—์„œ ๋ฐ˜๋“œ์‹œ ํ•˜๋‚˜์˜ Consumer๋งŒ ํ• ๋‹น์ด ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

ํ•˜์ง€๋งŒ ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ํŒŒํ‹ฐ์…˜๊ณผ Consumer์˜ ๋น„์œจ์ด 2:3์ธ ๊ฒฝ์šฐ, ํ•˜๋‚˜์˜ Consumer๋Š” ํ• ๋‹น๋œ ํŒŒํ‹ฐ์…˜ ์—†์ด ๋Œ€๊ธฐ๋งŒ ํ•  ๊ฒƒ์ด๋‹ค.

consumer group2

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

๊ทธ๋ ‡๋‹ค๋ฉด Consumer Group์ด ์กด์žฌํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ผ๊นŒ? ๊ธฐ๋ณธ์ ์ธ ๋ฃฐ์ด๋ผ๊ณ  ๋งํ–ˆ๋˜ ํŒŒํ‹ฐ์…˜๊ณผ Consumer Group์˜ 1:n ๋น„์œจ์„ ๋ณด๋ฉด ์•Œ ์ˆ˜ ์žˆ๋‹ค. Consumer Group์€ ํ•˜๋‚˜์˜ ํ† ํ”ฝ์˜ ํŒŒํ‹ฐ์…˜์— ๋Œ€ํ•œ ๋ณ„๋„์˜ Offset์„ ๊ด€๋ฆฌํ•œ๋‹ค. Consumer๊ฐ€ ๋‹ค์šด๋œ๋‹ค๋ฉด, ํ•ด๋‹น Consumer๊ฐ€ ์†ํ•ด ์žˆ๋˜ ๊ทธ๋ฃน์—์„œ rebalancing์„ ํ•˜์—ฌ ๊ทธ๋ฃน๋‚ด์˜ ๋‹ค๋ฅธ Consumer์— ํŒŒํ‹ฐ์…˜์„ ํ• ๋‹นํ•˜๊ฒŒ ๋˜์–ด ๊ทธ์ „์— Consumer์˜ ์†Œ๋น„๋ฅผ ์ด์–ด์„œ ํ•˜๊ฒŒ ๋œ๋‹ค. ๊ทธ๋ฃน ๋‚ด์—์„œ Offset์˜ ์ •๋ณด๋ฅผ ์„œ๋กœ ๊ณต์œ ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋‹ค์šด ์ง์ „์˜ Offset ์œ„์น˜๋ฅผ ์•Œ๊ณ  ๊ทธ ๋‹ค์Œ๋ถ€ํ„ฐ ์†Œ๋น„ํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ์—†์–ด์ง€๋Š” ๊ฒƒ์ด๋‹ค.


Offset

offset

์ง€์†์ ์œผ๋กœ ์ฆ๊ฐ€ํ•˜๋Š” ์ •์ˆ˜ ๊ฐ’์„ ๊ฐ€์ง„ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ. ๋ฐฐ์—ด์—์„œ์˜ ์ธ๋ฑ์Šค๊ณผ ๊ฐ™๋‹ค. ํŒŒํ‹ฐ์…˜์˜ ๊ฐ ๋ฉ”์‹œ์ง€์—๋Š” ๊ณ ์œ ํ•œ ์˜คํ”„์…‹์ด ์žˆ๋‹ค. ์ด ์˜คํ”„์…‹์œผ๋กœ Consumer๋Š” ์ˆœ์„œ๋ฅผ ์ฐพ๊ณ  ๋‹ค์Œ ๊ฐ€์ ธ์˜ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.


Commit Log

์ €์žฅ๋œ ๋ ˆ์ฝ”๋“œ๋‚˜ ์ž„์‹œ ๋ฉ”์‹œ์ง€๋กœ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š๊ณ  ์ง€์†์ ์œผ๋กœ ์—…๋ฐ์ดํŠธ๋˜๋Š” Event ์ŠคํŠธ๋ฆผ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๋Š” ์ง€์† ํŒŒํ‹ฐ์…˜. ์ด๋Ÿฌํ•œ ์ŠคํŠธ๋ฆผ์€ ์‰ฝ๊ฒŒ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๊ณ , Event๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ฆ‰์‹œ ์ฒ˜๋ฆฌํ• ์ˆ˜ ์žˆ์„๋งŒํผ ๋น ๋ฅด๋ฉฐ, ์ด์ „์— ๋ฐœ์ƒํ•œ Event๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.


Zookeeper

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

์ด์ „ ์นดํ”„์นด ๋ฒ„์ „์—์„œ๋Š” ์ฃผํ‚คํผ๊ฐ€ ์ง์ ‘์ ์ธ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ์—๋„ ์ฐธ์—ฌํ–ˆ์—ˆ๋‹ค. Consumer์ธก์—์„œ ์ฝ์€ ํŒŒํ‹ฐ์…˜์˜ Offset ์ •๋ณด๋ฅผ ์ฃผํ‚คํผ์—๊ฒŒ ๊ณต์œ ํ–ˆ์—ˆ๋Š”๋ฐ, ํ˜„์žฌ๋Š” ์ด Offset ์ •๋ณด๋ฅผ Consumer group์—์„œ ๊ด€๋ฆฌํ•œ๋‹ค.


Kafka Reference Architecture

๋‹ค์Œ ๊ทธ๋ฆผ์€ Kafka์˜ ๋ ˆํผ๋Ÿฐ์Šค๋“ค์˜ ์•„ํ‚คํ…์ฒ˜์ด๋‹ค.

confluent kafka reference architecture

REST Proxy

rest proxy

confluent์—์„œ๋Š” REST Proxy๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ์นดํ”„์นด ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์œ„ํ•œ RESTful interface application์„ ์˜คํ”ˆ์†Œ์Šค๋กœ ์ œ๊ณตํ•˜๊ณ  ์žˆ๋‹ค. Kafka ํด๋ผ์ด์–ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋ฒ”์šฉ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” http๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๊ณ  ๋บ„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด ํŠน์ง•์ด๋‹ค.


Schema Registry

RESTful ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์Šคํ‚ค๋งˆ๋ฅผ ๊ด€๋ฆฌํ•˜๊ฑฐ๋‚˜ ์กฐํšŒํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณต. ์ด๋•Œ Avro ํฌ๋งท์„ ์ด์šฉํ•œ๋‹ค. Avro ํฌ๋งท์€ ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ๋‚˜๋ˆ ์ ธ ์Šคํ‚ค๋งˆ๋Š” ์Šคํ‚ค๋งˆ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋กœ, ์‹ค๋ฐ์ดํ„ฐ๋Š” Kafka๋กœ ๋“ฑ๋ก๋œ๋‹ค.

์ž˜๋ชป๋œ ์Šคํ‚ค๋งˆ์˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌํ•œ๋‹ค๋ฉด ์Šคํ‚ค๋งˆ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ๋“ฑ๋กํ•˜๋Š” ๊ณผ์ •์—์„œ ์‹คํŒจ๊ณ  Kafka์— ์‹ค๋ฐ์ดํ„ฐ๊ฐ€ ์ „๋‹ฌ๋˜์ง€ ์•Š๊ฒŒ ๋œ๋‹ค. ๊ทธ๋ฆฌํ•˜์—ฌ Consumer์—์„œ๋Š” ์ž˜๋ชป๋œ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์„ ์ผ์ด ์—†์–ด Consumer์—์„œ ์ž˜๋ชป๋œ ์Šคํ‚ค๋งˆ๋กœ ์ธํ•œ ์—๋Ÿฌ๋Š” ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋˜ํ•œ Kafka์— ์ „๋‹ฌ๋˜๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ์— ์Šคํ‚ค๋งˆ๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ƒ๋Œ€์ ์œผ๋กœ ์ ์€ ์šฉ๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์ „๋‹ฌ๋œ๋‹ค.

ํ•˜์ง€๋งŒ Schema Registry์˜ ์—ญํ• ์ด ๊ต‰์žฅ์ด ์ค‘์š”ํ•˜์—ฌ Schema Registry์˜ ์žฅ์•  ๋ฐœ์ƒ ์‹œ ์ •์ƒ์ ์ธ ๋ฉ”์‹œ์ง€ ์ „๋‹ฌ์ด ๋ถˆ๊ฐ€ํ•˜๋‹ค.

Schema Registry


Kafka Connect

Kafka Connect๋Š” Kafka ๋ธŒ๋กœ์ปค์™€ ๋‹ค๋ฅธ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜๊ฐ„์— ๋ฐ์ดํ„ฐ ํ•ธ๋“ค๋ง์„ ์œ„ํ•œ ํ”Œ๋Ÿฌ๊ทธํ˜• ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค. Connector๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์†Œ์Šค์™€ Kafka๋ฅผ ์—ฐ๊ฒฐํ•ด์ค€๋‹ค. ๋‹ค์‹œ๋งํ•ด, Kafka Connector๊ฐ€ Producer์™€ Consumer ์—ญํ• ์„ ํ•œ๋‹ค๊ณ  ๋ณด๋ฉด ๋œ๋‹ค. Producer ์—ญํ• ์„ ํ•˜๋Š” Kafka Connector๋ฅผ Source Connector๋ผ๊ณ  ํ•˜๊ณ , Consumer ์—ญํ• ์„ ํ•˜๋Š” Kafka Connector๋ฅผ Sink Connector๋ผ๊ณ  ํ•œ๋‹ค.

Kafka Connect์—์„œ๋Š” Kafka๋ฅผ ์—ฌ๋Ÿฌ Source ๋ฐ Sink์™€ ํ†ตํ•ฉํ•˜์—ฌ ์ž์ฒด ์ปค๋„ฅํ„ฐ๋ฅผ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.


KSQL

Kafka์— ๋Œ€ํ•œ ์ŠคํŠธ๋ฆผ ์ฒ˜๋ฆฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ๊ณ  ๊ฐ•๋ ฅํ•œ SQL ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•œ๋‹ค.


Kafka Streams

์‹ค์‹œ๊ฐ„์œผ๋กœ ์ด๋ฒคํŠธ ์ŠคํŠธ๋ฆผ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ๊ฐ•ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” stateful ๋ฐ stateless ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค..


Confluent Control Center

Kafka ๋ธŒ๋กœ์ปค์˜ ์ƒํƒœ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, Kafka Connect, KSQL ๋ฐ Schema Registry์™€ ๊ฐ™์€ Confluent Platform์˜ ๊ตฌ์„ฑ ์š”์†Œ์— ์œ ์šฉํ•œ ํ†ตํ•ฉ GUI๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ๋ณดํ†ต Control Center๋Š” K8S์— ๋ฐฐํฌ๋˜๋ฏ€๋กœ, provisioning ์ž๋™ํ™”, kafka ํด๋Ÿฌ์Šคํ„ฐ ์žฌ์กฐ์ •, self healing, auto scaling๊ณผ ๊ฐ™์€ K8S์˜ ๋ชจ๋“  ์ด์ ์ด Control Center์˜ ํ•ต์‹ฌ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๋˜์—ˆ๋‹ค.


Kafka Streams

Kafka์˜ ์ •์˜๋Š” ๋ถ„์‚ฐ ์ด๋ฒคํŠธ ์ŠคํŠธ๋ฆฌ๋ฐ ํ”Œ๋žซํผ์œผ๋กœ์จ Producer์™€ Consumer๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์‚ฐํ•˜๊ณ  ๋ฐ›์•„์™€์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ณณ์— ์‚ฌ์šฉํ•ด ์™”๋‹ค. ์ด๋•Œ Consumer๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์™€์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๋น ๋ฅด๊ณ  ์•ˆ์ „ํ•˜๊ฒŒ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ Kafka ์—์„œ ์ง€์›ํ•ด์ค€ ๊ฒƒ์ด Kafka Streams ์ด๋‹ค. ๋”์šฑ ์ž์„ธํ•˜๊ฒŒ๋Š”, ์–ด๋–ค Topic์œผ๋กœ ๋“ค์–ด์˜จ ๋ฐ์ดํ„ฐ๋ฅผ Consumeํ•˜์—ฌ Kafka Streams์—์„œ ์ œ๊ณตํ•˜๋Š” ์ฒ˜๋ฆฌ ๋กœ์ง์„ ํ†ตํ•ด ์ฒ˜๋ฆฌ ํ›„ ๋‹ค๋ฅธ Topic์œผ๋กœ ์ „์†กํ•˜๊ฑฐ๋‚˜ ๋๋‚ด๋Š” ๋ถ€๋ถ„์„ ์ˆ˜ํ–‰ํ•˜๋Š” Confluent ๊ณต์‹ ์ง€์› ์ž๋ฐ” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.

kafka streams

๊ตฌ์กฐ

Kafka Streams๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฐ์ดํ„ฐ์˜ ํ๋ฆ„์„ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋“œ์™€ ์„ ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ Topology๋ผ๋Š” ๊ฐœ๋…์„ ์•Œ์•„์•ผ ํ•œ๋‹ค.

Topology๋Š” โ€˜๋…ธ๋“œโ€™์™€ โ€˜๋…ธ๋“œ๋ฅผ ์ด์€ ์„ โ€™์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. Kafka Streams๋ฅผ ๋„์‹ํ™”ํ•ด ๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

Source Processor

Topology์˜ ์‹œ์ž‘ ๋…ธ๋“œ์ด๋ฉฐ, ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์ตœ์ดˆ๋กœ ์„ ์–ธํ•ด์•ผ ํ•˜๋Š” ๋…ธ๋“œ์ด๋‹ค. Kafka์™€ ์—ฐ๊ฒฐ๋œ ํ”„๋กœ์„ธ์„œ์ด๋ฉฐ, ํ•˜๋‚˜ ์ด์ƒ์˜ ํ† ํ”ฝ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.


Stream Processor

๋‹ค๋ฅธ ํ”„๋กœ์„ธ์„œ๊ฐ€ ๋ฐ˜ํ™˜ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์—ญํ• 


Sink Processor

Topology์˜ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ์ด๋ฉฐ, ๋ฐ์ดํ„ฐ ์ „๋‹ฌ์„ ์œ„ํ•ด ๋งˆ์ง€๋ง‰์— ์„ ์–ธํ•ด์•ผ ํ•˜๋Š” ๋…ธ๋“œ์ด๋‹ค.

Kafka์™€ ์—ฐ๊ฒฐ๋œ ํ”„๋กœ์„ธ์„œ์ด๋ฉฐ, ๋ฐ์ดํ„ฐ๋ฅผ Kafka์˜ ํŠน์ • ํ† ํ”ฝ์œผ๋กœ ์ €์žฅํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.


ํŠน์ง•

์นดํ”„์นด์™€ ์™„๋ฒฝ ํ˜ธํ™˜

Confluent ๊ณต์‹ ์ง€์› ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ŠคํŒŒํฌ, ๋กœ๊ทธ์Šคํƒœ์‹œ์™€ ๊ฐ™์€ ์™ธ๋ถ€ ์˜คํ”ˆ์†Œ์Šค๋“ค๊ณผ ๋‹ค๋ฅด๊ฒŒ ์นดํ”„์นด ๋ฒ„์ „์— ๋งž์ถฐ์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.


์Šค์ผ€์ค„๋ง ๋„๊ตฌ๊ฐ€ ํ•„์š” ์—†๋‹ค.

์นดํ”„์นด์™€ ์—ฐ๋™ํ•˜๋Š” ์ŠคํŠธ๋ฆผ ํ”„๋กœ์„ธ์‹ฑ ํˆด๋กœ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด Spark Stream์ด๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋งˆ์ดํฌ๋กœ ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋Š” ์ด๋ฒคํŠธ ๋ฐ์ดํ„ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋ฅผ ์šด์˜ํ•˜๊ธฐ ์œ„ํ•ด์„  yarn๊ณผ ๊ฐ™์€ ํด๋Ÿฌ์Šคํ„ฐ ๊ด€๋ฆฌ์ž, ๋ฆฌ์†Œ์Šค ๋งค๋‹ˆ์ €์™€ ๊ฐ™์€ ๊ฒƒ๊ณผ ๋Œ€๊ทœ๋ชจ ์žฅ๋น„ ๋“ฑ์ด ํ•„์š”ํ•˜๋‹ค. ๋ฐ˜๋ฉด Spark Streams๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์Šค์ผ€์ค„๋ง ๋„๊ตฌ๊ฐ€ ํ•„์š” ์—†๋‹ค. ์ž์‹ ์ด ์›ํ•˜๋Š” ๋งŒํผ ์ ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ๋ฉด 2๊ฐœ, ๋Œ€์šฉ๋Ÿ‰์ด๋ฉด 10~20๊ฐœ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ WAS ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌํ•˜๋“ฏ์ด ๋ฐฐํฌํ•˜๋ฉด ๋œ๋‹ค.


์ŠคํŠธ๋ฆผ์ฆˆDSL๊ณผ ํ”„๋กœ์„ธ์„œAPI๋ฅผ ์ œ๊ณต

๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ํ• ๋•Œ ์ŠคํŠธ๋ฆผ์ฆˆ DSL์—์„œ map, join, window์™€ ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋“ค์„ ์ œ๊ณตํ•œ๋‹ค. ๋˜ํ•œ ์ŠคํŠธ๋ฆผ์ฆˆDSL๋งŒ์ด ์ œ๊ณตํ•˜๋Š” KStream, KTable, GlobalKTable์€ ์นดํ”„์นด๋ฅผ ์ŠคํŠธ๋ฆผ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋Œ€๊ทœ๋ชจ key-value ์ €์žฅ์†Œ๋กœ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

Streams DSL

  • KStream

    ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋ฉด ํ† ํ”ฝ์— ์กด์žฌํ•˜๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ ์ถœ๋ ฅํ•˜๋ฉฐ key์˜ ์ค‘๋ณต ํ—ˆ์šฉ

  • KTable

    ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋ฉด ํ† ํ”ฝ์— ์กด์žฌํ•˜๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋ฉด์„œ ๋™์ผํ•œ key์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์œผ๋ฉด, ์ตœ์‹  ๋ฐ์ดํ„ฐ๋กœ ๋ฎ์–ด์”Œ์šด๋‹ค.

  • GlobalKTable

    KTable๋กœ ์„ ์–ธ๋œ ํ† ํ”ฝ์€ 1๊ฐœ ํŒŒํ‹ฐ์…˜์ด 1๊ฐœ task์— ํ• ๋‹น๋˜์ง€๋งŒ, GlobalKTable๋กœ ์„ ์–ธ๋œ ํ† ํ”ฝ์€ ๋ชจ๋“  ํŒŒํ‹ฐ์…˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฐ task์— ํ• ๋‹น๋˜์–ด ์‚ฌ์šฉ๋˜๋Š” ์ฐจ์ด์  ์กด์žฌ

    KStream๊ณผ KTable ์กฐ์ธ ํ•ด๊ฒฐ ๊ฐ€๋Šฅ


์ž์ฒด ๋กœ์ปฌ ์ƒํƒœ ์ €์žฅ์†Œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

์‹ค์‹œ๊ฐ„์œผ๋กœ ๋“ค์–ด์˜ค๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์€ ๋น„์ƒํƒœ๊ธฐ๋ฐ˜(Stateless) ์ฒ˜๋ฆฌ, ์ƒํƒœ๊ธฐ๋ฐ˜(Stateful) ์ฒ˜๋ฆฌ ๋‘๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค. ๋น„์ƒํƒœ๊ธฐ๋ฐ˜ ์ฒ˜๋ฆฌ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด์˜ฌ ๋•Œ๋งˆ๋‹ค Produceํ•˜๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ์˜ ์œ ์‹ค์ด๋‚˜ ์ค‘๋ณต ๋ฐœ์ƒ ์—ผ๋ ค๊ฐ€ ์ ๊ณ  ๊ฐœ๋ฐœ์ด ์‰ฝ๋‹ค. ์ƒํƒœ๊ธฐ๋ฐ˜ ์ฒ˜๋ฆฌ๋Š” ์ง์ ‘ ๊ตฌํ˜„์ด ์–ด๋ ต๋‹ค. window, join, aggregation๊ณผ ๊ฐ™์€ ์ฒ˜๋ฆฌ๋Š” ์ด์ „์— ๋ฐ›์•˜๋˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜๊ณ  ์žˆ์œผ๋ฉด์„œ ๋‹ค์Œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐธ์กฐํ•ด์„œ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.

์ด๋•Œ Kafka Streams๋Š” ๋กœ์ปฌ์— rocksdb๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๊ณ , ์ด ์ƒํƒœ์— ๋Œ€ํ•œ ๋ณ€ํ™˜ ์ •๋ณด๋Š” Kafka์˜ changelog ํ† ํ”ฝ์— ์ €์žฅํ•œ๋‹ค. ๊ทธ๋ฆฌํ•˜์—ฌ ํ”„๋กœ์„ธ์Šค์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜๋”๋ผ๋„ ๊ทธ ์ƒํƒœ๊ฐ€ ๋ชจ๋‘ ์•ˆ์ „ํ•˜๊ฒŒ ์ €์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์žฅ์•  ๋ณต๊ตฌ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค.


KSQL / KSQLDB

์ง€์†์ ์ธ ์ŠคํŠธ๋ฆผ ํ˜•ํƒœ๋กœ ๋“ค์–ด์˜ค๋Š” ๋ฐ์ดํ„ฐ์—์„œ SQL์ฟผ๋ฆฌ์˜ ํŠน์ • ํ‚ค ๊ฐ’์œผ๋กœ ์กฐํšŒํ•˜๋ ค๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ์ด๊ฑธ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด KSQL ์ด๋‹ค. KSQL์€ Kafka Streams๋ฅผ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด Kafka์— ๋Œ€ํ•ด ์ŠคํŠธ๋ฆผ ์ฒ˜๋ฆฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฐ•๋ ฅํ•œ SQL ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ๊ตฌ์„ฑ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

KSQL architecture

์žฅ์ 

  • KSQL์€ ๋‚ด๋ถ€์ ์œผ๋กœ Kafka Streams๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ปดํŒŒ์ผ๋˜๋ฉฐ, ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋“ค์–ด์˜ค๋Š” ๋ฐ์ดํ„ฐ์—์„œ SQL ์ฟผ๋ฆฌ๋ฌธ์„ ํ†ตํ•˜์—ฌ Error ํ˜น์€ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฝ‘์•„๋‚ผ ์ˆ˜ ์žˆ์–ด ๋น ๋ฅด๊ฒŒ ๊ด€์ฐฐํ•˜๊ณ  ๋Œ€์‘ํ•ด์•ผ ํ•˜๋Š” ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค์— ์ด์ƒ์ ์ด๋‹ค.
  • ์œ ์‚ฌ SQL๋ฌธ์„ ์ด์šฉํ•˜์—ฌ ๋กœ์ง์„ ๊ตฌ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ง€์‹์ด ๋งŽ์ด ์š”๊ตฌ๋˜์ง€ ์•Š๋Š”๋‹ค.
  • ๊ตฌํ˜„๋œ KSQL๋ฌธ์„ ์„œ๋ฒ„์— ๋ฐฐํฌํ•˜๋ฉด ์—”์ง„ ๋‚ด์—์„œ ๋งž์ถฐ ๊ตฌ๋™๋˜๊ธฐ ๋•Œ๋ฌธ์—, ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ์„œ๋ฒ„ ๋ฐฐํฌ๊นŒ์ง€ ๊ณ ๋ คํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

์œ„์™€ ๊ฐ™์€ ํŠน์ง• ๋•Œ๋ฌธ์— ์นดํ”„์นด ํ† ํ”ฝ์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ ๋ถ„์„์— ์ž์ฃผ ์ด์šฉ๋œ๋‹ค.

์˜ˆ์ „์—๋Š” ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ๊ฐ€์šด๋ฐ KSQL ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋Š” Cluster๊ฐ€ ๋”ฐ๋กœ ์žˆ๋‹ค. ๊ทธ๋ฆฌํ•˜์—ฌ JVM์—์„œ running์„ ํ•˜์—ฌ Kafka Cluster์— ์ฟผ๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

KSQL

์œ„์™€ ๊ฐ™์ด ํ•˜๋ฉด JVM ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋”ฐ๋กœ ๊ด€๋ฆฌ๋ฅผ ํ•ด์•ผํ•œ๋‹ค. ์ด์— ํ•œ๋‹จ๊ณ„ ๋” ๋ฐœ์ „ํ•œ ๊ฒƒ์ด KSQLDB์ด๋‹ค.


KSQLDB์˜ ํŠน์ง•

ํŠน์ง•1 : Pull query

๊ธฐ์กด RDB์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์„ Pull query ๋ผ๊ณ  ํ•œ๋‹ค. ํ•˜์ง€๋งŒ KSQL์—์„œ๋Š” ์ง€์†์ ์œผ๋กœ ๋ณ€ํ™”ํ•˜๋Š” ์ŠคํŠธ๋ฆผ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ€์–ด๋‚ธ๋‹ค๋Š” ์˜๋ฏธ๋กœ push quries๋ผ๋Š” ๋ช…์นญ์ด ๋ถ™๊ฒŒ ๋˜์—ˆ๋‹ค. ์ด๋Ÿฌํ•œ Push query๋Š” ์˜๊ตฌ์ ์œผ๋กœ ์‹คํ–‰๋˜๋ฉฐ ์ƒˆ๋กœ์šด ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค ๊ฒฐ๊ณผ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•ด์ค€๋‹ค. ๊ณผ๊ฑฐ ๋ฒ„์ „์˜ KSQL์—์„œ๋Š” RDB์™€ ๊ฐ™์ด ํ˜„์žฌ ์ƒํƒœ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” Pull query์— ๋Œ€ํ•œ ๊ธฐ๋Šฅ์ด ์—†์—ˆ๋‹ค. ํ•˜์ง€๋งŒ KSQLDB์—์„œ EMIT CHANGE๋ผ๋Š” ๊ฒƒ์ด ์ถ”๊ฐ€๋˜๋ฉด์„œ RDB์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค. ๊ธฐ์กด Kafka๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋˜ ์ €์žฅ์†Œ(DB)๋กœ์จ์˜ ๋ถ€๋ถ„์„ ๋”์šฑ ํšจ๊ณผ์ ์œผ๋กœ ๋ณด์™„ํ•˜๊ณ ์ž ๋‚˜์˜จ ๊ฒƒ์ด๋‹ค.

์•„๋ž˜๋Š” ์šด์ „์ž์˜ ์œ„์น˜๋ฅผ ๊ธฐ๋กํ•˜๋Š” ์•ฑ์˜ ์ฟผ๋ฆฌ๋ฌธ์ด๋‹ค. ์œ„์น˜๋ฅผ ๋ณ€๊ฒฝํ•ด ๊ฐ€๋ฉด์„œ ํ˜„์žฌ ์‹œ์ ์˜ ํŠน์ • ์šด์ „์ž์˜ ์œ„์น˜๋ฅผ ์–ป์œผ๋ ค๊ณ  ํ• ๋•Œ, KSQLDB์—์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด Pull query๋ฅผ ๋‚ ๋ฆด ์ˆ˜ ์žˆ๋‹ค.

SELECT ride_id, current_latitude, current_longitude
FROM ride_locations
WHERE ROWKEY = โ€˜6fd0fcdbโ€™;

+-----------+-----------------------+-----------------------+
|RIDE_ID    |CURRENT_LATITUDE       |CURRENT_LONGITUDE      |
+-----------+-----------------------+-----------------------+
|45334      |37.7749                |122.4194               |
+-----------+-----------------------+-----------------------+

์—ฌ๊ธฐ์„œ EMIT CHANGES๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ํ˜„์žฌ ์šด์ „์ž์— ๋Œ€ํ•œ ์œ„์น˜ ๋ณ€๊ฒฝ ๊ธฐ๋ก์„ ์ง€์†์ ์œผ๋กœ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

SELECT ride_id, current_latitude, current_longitude
FROM ride_locations
WHERE ROWKEY = โ€˜6fd0fcdbโ€™
EMIT CHANGES;

+-----------+-----------------------+-----------------------+
|RIDE_ID    |CURRENT_LATITUDE       |CURRENT_LONGITUDE      |
+-----------+-----------------------+-----------------------+
|45334      |37.7749                |122.4194               |
|45334      |37.7749                |122.4192               |
|45334      |37.7747                |122.4190               |
|45334      |37.7748                |122.4188               |
+-----------+-----------------------+-----------------------+

์—ฌ๊ธฐ์„œ Pull query์˜ ์„ฑ๋Šฅ์€ ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ์— ๋”ฐ๋ผ์„œ๋Š” RocksDB์˜ ์„ฑ๋Šฅ์— ๋”ฐ๋ผ๊ฐ„๋‹ค.


ํŠน์ง•2 : Connector Management

KSQL์€ Kafka Cluster ๋ฐ–์— ์žˆ์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค์ง€์— ๋Œ€ํ•ด์„œ Kafka Cluster ๋‚ด์— ๋”ฐ๋กœ ์„ค์ •์„ ํ•ด์ฃผ์—ˆ์–ด์•ผ ํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ KSQLDB๋Š” ์„ค์ •์„ ๋”ฐ๋กœ ํ•  ํ•„์š” ์—†์ด ์ฟผ๋ฆฌ๋ฌธ ์ž์ฒด์—์„œ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค. ์ฟผ๋ฆฌ๋ฌธ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

CREATE SOURCE CONNECTOR rider_profiles WITH (
      'connector.class'          = 'io.confluent.connect.jdbc.JdbcSourceConnector',
      'connection.url'           = 'jdbc:postgresql://postgres:5432/postgres',
      'key'                      = 'profile_id',
      ...
);

์ด๊ฒƒ์ด KSQLDB๋ฅผ ๊ฐœ๋ฐœํ•œ ๊ทผ๋ณธ์ ์ธ ์ด์œ ์ด๋‹ค. Confluent์—์„œ๋Š” ์ŠคํŠธ๋ฆผ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ ๋งŒ๋“ค์–ด์•ผ ํ•˜๋Š” ์‹œ์Šคํ…œ์˜ ๋ณต์žก์„ฑ ๋•Œ๋ฌธ์ด๋ผ๊ณ  ์„ค๋ช…ํ•˜๊ณ  ์žˆ๋‹ค.

์•„๋ž˜๋Š” ๊ธฐ์กด KSQL์˜ ETL ๋™์ž‘์„ ๊ตฌ์กฐํ™”ํ•œ ๊ทธ๋ฆผ์ด๋‹ค.

์™ผ์ชฝ๋ถ€ํ„ฐ ์ˆœ์„œ๋Œ€๋กœ ๋ฐ์ดํ„ฐ ์ถ”์ถœ - Kafka ์ €์žฅ - ๋ฐ์ดํ„ฐ ๋ณ€ํ˜• - ๋ฐ์ดํ„ฐ ๋กœ๋“œ - APP์— ๋ฐ์ดํ„ฐ ์ €์žฅ ์œผ๋กœ ๋™์ž‘ํ•˜๊ฒŒ ๋œ๋‹ค. ์ด ๊ณผ์ •์—์„œ ์—ฌ๋Ÿฌ ์‹œ์Šคํ…œ๋“ค์„ ๊ฐ๊ฐ ๊ด€๋ฆฌํ•˜๋Š”๋ฐ ๋ถ€๋‹ด์ด ๋œ๋‹ค๋Š” ๊ฒƒ์ด ์š”์ ์ด๋‹ค. KSQLDB์—์„œ๋Š” ์ด๊ฑธ RDB๋ฅผ ํ†ตํ•œ CRUD ๋งŒ์œผ๋กœ ๊ตฌ์กฐ๋ฅผ ๊ฐ„๋‹จํžˆ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค. ๊ตฌ์กฐ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

ksqlDB-architecture

์•„์˜ˆ KSQLDB ๋‚ด์—์„œ ์–ด๋–ค ๊ณณ์—์„œ ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ๊ฒƒ์ด๋‹ค ๋“ฑ์˜ ๋ชจ๋“  ๊ณผ์ •์„ ํ•œ๋ฐฉ์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค. KSQL์˜ ETL ๋™์ž‘ ๊ตฌ์กฐ์— ์žˆ์—ˆ๋˜ Stream Processing, Connectors ์ด๋Ÿฐ ๊ฒƒ๋“ค์„ KSQLDB์—์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ ๊ฒƒ์ด๋‹ค.


Tags:

Categories:

Updated:

Leave a comment