Kafka
Kafka๋ ์์ฆ Uber, ์์ด๋น์๋น, ๋ทํ๋ฆญ์ค ๋ฑ ๋ง์ ํ์ฌ์์ ์ฌ์ฉํ๋ ๋น ๋ฐ์ดํฐ ๊ณต๊ฐ์์ ๊ฐ์ฅ ์ธ๊ธฐ์๋ ์ด๋ฒคํธ ์คํธ๋ฆฌ๋ฐ ํ๋ซํผ์ด๋ค.
Event Streaming Platform
๊ธฐ์กด์ Enterprise Architecture์์๋ ๋ชจ๋ ์ฑ์ด ์ฌ์ผ๋กํ(๋ถ์, ์ฌ์ , ๋ธ๋์น๋ณ๋ก ๋ฐ์ดํฐ ๋จ์ )๋์ด ์ค์๊ฐ์ผ๋ก ์ด์์ ํตํฉํ๊ฑฐ๋ ๊ฐ์งํ๋ ๊ฒ์ ๋ฌผ๋ก ์ค์๊ฐ ๋น์ฆ๋์ค ์์ฌ๊ฒฐ์ ์ ๋ด๋ฆฌ๋ ๊ฒ์ด ๋งค์ฐ ์ด๋ ค์ ๋ค. ๋ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๊ธฐ์ค์ผ๋ก ์๋ง์ ์์ ์๋ฃจ์ ๋ค์ด ๋์ค๊ณ , ์ด๋ฌํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ํธ ์ฐ๊ฒฐ์ ์๋์ ๊ฐ์ด ์ฝํ๊ณ ์ฝํ ์ง์ ๊ฐ ํตํฉ์ผ๋ก ์ด์ด์ก๋ค.
์ด๋ฅผ ๊ทน๋ณตํ๊ณ ์, ์ค์ ์ง์ค์ ํ๋ธ์ ์ฐ๊ฒฐํ์ฌ ์ค์๊ฐ ์ ๋ณด๋ฅผ ๋ถ์ํ๊ณ ์ด์๊ฐ ๋ฐ์ํ๋ ์ฆ์ ์ํ๋ ๋๋ก ๋ณํํ ์ ์๋ ์ด๋ฒคํธ ์คํธ๋ฆฌ๋ฐ ํ๋ซํผ์ด ๋ฑ์ฅํ๋ค.
์ด๋ฒคํธ ์คํธ๋ฆฌ๋ฐ ํ๋ซํผ์ ๋ฐ์ดํฐ ์ ์ฅ์, ๋ก๊ทธ, ํ์ฌ ์ฑ ๋ฑ์ ๋ชจ๋ ์ํฐํ๋ผ์ด์ฆ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ํ ๋จ์ผ ์ ์ ์ ์ญํ ์ ํ๋ค. ๋ํ์ ์ธ ๋๊ท๋ชจ ์คํธ๋ฆฌ๋ฐ ์ด๋ฒคํธ ์ฒ๋ฆฌ ์์ง์ผ๋ก๋ Kafka, Spark Streaming, Apache Flink ๋ฑ์ด ์๋ค.์ด๋ฌํ ์์ง๋ค์ ํตํ์ฌ ์ค์๊ฐ ์ด๋ฒคํธ๋ค์ ๋ชจ์๋ค. ์ด๋ฌํ ์ด๋ฒคํธ๋ค์ ์นด๋ฉ๋ผ์ ๊ฐ์ ์คํธ๋ฆผ ์ฒ๋ฆฌ ์์ง์ ํตํด ๋ชจ๋ํฐ๋ง ๋ฐ ๊ธฐ๋ก๋๋ฉฐ, ์ค์๊ฐ์ผ๋ก ์ด๋ฌํ ์ด๋ฒคํธ๋ฅผ ์ฌ์ํ๊ณ ๊ฐ์ ํ๊ณ ๋ฐ์ํ ์ ์๋ค.
์ฅ์
-
๋จ์ผ ์๋ฃจ์ ์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ๋ฐ์ดํฐ ์ธํ๋ผ๋ฅผ ๋ณผ ์ ์๋ค.(๋์ ์ฒ๋ฆฌ๋, ์ง์์ฑ, ์งง์ ๋๊ธฐ์๊ฐ, ๋ชจ๋ ์ด๋ฒคํธ ๋ฐ ์์คํ ์ด ์ฐ๊ฒฐ๋๋ ๋ฒ์ฉ ์ด๋ฒคํธ ํ์ดํ๋ผ์ธ)
-> ์ด๋ก ์ธํด ์๋ก ๋ค๋ฅธ ์์คํ ๋ผ๋ฆฌ ์๋ก ์ปค๋ฎค๋์ผ์ด์ ์ด ๊ฐ๋ฅํด์ก๋ค.
-
๋ ๊ฑฐ์ ๋ฐ์ดํฐ ์จ์ดํ์ฐ์ค, RDBMS๋ฅผ ํ๋ํํ๊ณ , ํ๋ ฅ์ ์ธ ์ํ ์ ์ฅ ๋ฐ์ดํฐ ์ ์ฅ์๋ฅผ ๊ตฌ์ถ ๊ฐ๋ฅ
-
ํ์ด๋ธ๋ฆฌ๋ ํด๋ผ์ฐ๋ ์คํธ๋ฆฌ๋ฐ ํ๋ซํผ ๊ตฌ์ถ
Kafka์ ๊ตฌ์ฑ์์
Kafka : Pub/Sub ๋ชจ๋ธ
์ํ์น ์นดํ์นด๋ ์ค์์ง์คํ ๋ฉ์์ง ๊ด๋ฆฌ ๋ฐฉ์์ผ๋ก ๋ฉ์์ง์ ์์ฑ๊ณผ ์๋น์ ๊ด๋ฆฌ๋ฅผ ์์ ํ ๋ ๋ฆฝ์ํจ pub-sub ๋ฉ์์ง ์์คํ ์ด๋ค. ๋ฉ์์ง๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐ์ดํฐ ํ๋ฅผ ์ค์์ ๋๊ณ , ๋ ๋ฆฝ์ ์ธ ๋ฐ์ดํฐ์ ์ ๊ณต, ์๋น๊ฐ ์ด๋ฃจ์ด ์ง๋ค. ์ด์ ๊ฐ์ ํจํด์ publish / subscribe ๋ชจ๋ธ ํจํด์ด๋ผ๊ณ ํ๋ฉฐ, ์ด๋ฐ ๋์จํ ๊ฒฐํฉ์ ํตํ์ฌ ์ ๊ณต๊ณผ ์๋น๋ฅผ ์์ฒญํ ๊ณณ์์ ์ฅ์ ๊ฐ ๋ฐ์ํ ๋์๋ ์์กด์ฑ์ด ์์ผ๋ฏ๋ก ์์ ์ ์ธ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค.
Kafka Cluster
์นดํ์นด ํด๋ฌ์คํฐ๋ ์์ ๊ฐฏ์์ ๋ ธ๋๋ก ๊ตฌ์ฑ๋๊ณ , ์ฌ๊ธฐ์ ๋ ธ๋๋ฅผ broker๋ผ๊ณ ๋ฐ๊ฟ ๋งํ ์ ์๋ค. ๋ณดํต ํด๋ฌ์คํฐ์๋ 1๊ฐ ์ด์์ ๋ธ๋ก์ปค๋ฅผ ๋์ด ํน์ ๋ ธ๋์ ๋ฌผ๋ฆฌ์ ์ฅ์ ๋ก ์ธํ ๋ฐ์ดํฐ ์ ์ค์ ๋๋นํ๋ค.
Broker
๋จ์ผ Kafka ์๋ฒ๋ฅผ Broker๋ผ๊ณ ํ๋ค. Broker๋ Producer๋ก๋ถํฐ ๋ฉ์์ง๋ฅผ ์์ ํ๊ณ Offset์ ํ ๋นํ๊ณ ๋์คํฌ์ ์ ์ฅ์์ ๋ฉ์์ง๋ฅผ ์ปค๋ฐํ๋ค. Consumer์๊ฒ ์๋น์ค๋ฅผ ์ ๊ณตํ์ฌ ํํฐ์ ์ ๋ํ Fetch ์์ฒญ์ ์๋ตํ๊ณ ๋์คํฌ์ ์ปค๋ฐ๋ ๋ฉ์์ง์ ์๋ตํ๋ค. ํ๋์จ์ด ์ฑ๋ฅ์ ๋ฐ๋ผ ๋จ์ผ Broker๊ฐ ์ด๋น ์์ฒ ๊ฐ์ ํํฐ์ ๊ณผ ์๋ฐฑ๋ง ๊ฐ์ ๋ฉ์์ง๋ฅผ ์ฝ๊ฒ ์ฒ๋ฆฌํ ์ ์๋ค.
Topic & Partition
Topic์ ๋ฉ์์ง๋ฅผ ๋ฐ์ ์ ์๋ ๋ ผ๋ฆฌ์ ์ธ ๋ชจ๋ธ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ตฌ๋ถํ๊ธฐ ์ํ ๋จ์์ด๋ค. ํ์ผ ์์คํ ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ ๋๋ ํด๋์ ๊ฐ๋ค. ๋ฐ์ดํฐ์ ์ฒ๋ฆฌ๋์ ๋์ด๊ธฐ ์ํด 1๊ฐ์ Topic์ 1๊ฐ ์ด์์ ํํฐ์ ์ ๊ฐ์ง๊ณ ์๋์ ๊ฐ์ด ๋ฐ์ดํฐ๋ฅผ ๋ถ์ฐ์์ผ ์ ์ฅํ๋ค.
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 ๋ฐฉ์์ผ๋ก ํ ํฝ์ ๊ธฐ๋ก๋๋ค.
์ ๊ทธ๋ฆผ์ 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์ 1:n์ด์ฌ์ผ ํ๋ค. ์ ๊ทธ๋ฆผ์ ๋ณด์. ๊ทธ๋ฆผ์์ ๋ณด๋ค์ํผ, ๋จ ํ๋์ ํํฐ์ ์๋ ๋์ผํ Consumer Group์์ ๋ฐ๋์ ํ๋์ Consumer๋ง ํ ๋น์ด ๋๋ค๋ ๊ฒ์ด๋ค.
ํ์ง๋ง ์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ํํฐ์ ๊ณผ Consumer์ ๋น์จ์ด 2:3์ธ ๊ฒฝ์ฐ, ํ๋์ Consumer๋ ํ ๋น๋ ํํฐ์ ์์ด ๋๊ธฐ๋ง ํ ๊ฒ์ด๋ค.
์ด์ ๊ฐ์ ์ํฉ์ ๋ฐฉ์งํ๊ธฐ ์ํ์ฌ ํํฐ์ ๊ณผ Consumer ์๋ ๊ณ ๋ คํด์ผ ํ๋ค. ๋ณดํต์ ๊ฐ์๋ฅผ ๊ฐ์ด ๋ง์ถฐ์ฃผ๋ ๊ฒ์ ๊ถ์ฅํ์ง๋ง, ์ค์ ๋ฉ์ธ์ง๊ฐ ์์ด๋ ์๋๋ณด๋ค ์ฒ๋ฆฌํ๋ ์๋๊ฐ ํจ์ฌ ๋น ๋ฅด๋ค๋ฉด ๊ตณ์ด 1:1 ๋งคํ๋ณด๋ค๋ ํํฐ์ ๊ฐ์ => ์ปจ์๋จธ๊ฐ์๋ก ์ค์ ํ๋ ๊ฒ๋ ๋์์ง ์๋ค.
๊ทธ๋ ๋ค๋ฉด Consumer Group์ด ์กด์ฌํ๋ ์ด์ ๋ ๋ฌด์์ผ๊น? ๊ธฐ๋ณธ์ ์ธ ๋ฃฐ์ด๋ผ๊ณ ๋งํ๋ ํํฐ์ ๊ณผ Consumer Group์ 1:n ๋น์จ์ ๋ณด๋ฉด ์ ์ ์๋ค. Consumer Group์ ํ๋์ ํ ํฝ์ ํํฐ์ ์ ๋ํ ๋ณ๋์ Offset์ ๊ด๋ฆฌํ๋ค. Consumer๊ฐ ๋ค์ด๋๋ค๋ฉด, ํด๋น Consumer๊ฐ ์ํด ์๋ ๊ทธ๋ฃน์์ rebalancing์ ํ์ฌ ๊ทธ๋ฃน๋ด์ ๋ค๋ฅธ Consumer์ ํํฐ์ ์ ํ ๋นํ๊ฒ ๋์ด ๊ทธ์ ์ Consumer์ ์๋น๋ฅผ ์ด์ด์ ํ๊ฒ ๋๋ค. ๊ทธ๋ฃน ๋ด์์ Offset์ ์ ๋ณด๋ฅผ ์๋ก ๊ณต์ ํ๊ณ ์๊ธฐ ๋๋ฌธ์, ๋ค์ด ์ง์ ์ Offset ์์น๋ฅผ ์๊ณ ๊ทธ ๋ค์๋ถํฐ ์๋นํ๋ฉด ๋ฌธ์ ๊ฐ ์์ด์ง๋ ๊ฒ์ด๋ค.
Offset
์ง์์ ์ผ๋ก ์ฆ๊ฐํ๋ ์ ์ ๊ฐ์ ๊ฐ์ง ๋ฉํ๋ฐ์ดํฐ. ๋ฐฐ์ด์์์ ์ธ๋ฑ์ค๊ณผ ๊ฐ๋ค. ํํฐ์ ์ ๊ฐ ๋ฉ์์ง์๋ ๊ณ ์ ํ ์คํ์ ์ด ์๋ค. ์ด ์คํ์ ์ผ๋ก Consumer๋ ์์๋ฅผ ์ฐพ๊ณ ๋ค์ ๊ฐ์ ธ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์ ์ ์๋ค.
Commit Log
์ ์ฅ๋ ๋ ์ฝ๋๋ ์์ ๋ฉ์์ง๋ก ์ฒ๋ฆฌ๋์ง ์๊ณ ์ง์์ ์ผ๋ก ์ ๋ฐ์ดํธ๋๋ Event ์คํธ๋ฆผ์ผ๋ก ์ฒ๋ฆฌ๋๋ ์ง์ ํํฐ์ . ์ด๋ฌํ ์คํธ๋ฆผ์ ์ฝ๊ฒ ์ก์ธ์คํ ์ ์๊ณ , Event๊ฐ ๋ฐ์ํ๋ ์ฆ์ ์ฒ๋ฆฌํ ์ ์์๋งํผ ๋น ๋ฅด๋ฉฐ, ์ด์ ์ ๋ฐ์ํ Event๋ฅผ ์ ์ฅํ ์ ์๋ค.
Zookeeper
์นดํ์นด ์ํคํ ์ฒ ๋ด์์ ์นดํ์นด ๋ธ๋ก์ปค๋ค์ ํ๋์ ํด๋ฌ์คํฐ๋ก ์ฝ๋๋ค์ดํ ํ๋ ์ญํ ์ ์ํ. ์ข๋ ์์ธํ ์ค๋ช ํ์๋ฉด, ์นดํ์นด ํด๋ฌ์คํฐ์ ์ค์ ์ ๋ณด๋ฅผ ์ต์ ์ผ๋ก ์ ์งํ๋ฉฐ, ํด๋ฌ์คํฐ ๋ด์์ ๋ธ๋ก์ปค ์๋ฒ๊ฐ ์ถ๊ฐ๋๊ฑฐ๋ ์ญ์ ๋ ๋ ๊ทธ ์ ๋ณด๋ฅผ ํด๋ฌ์คํฐ์ ์ํ ์๋ฒ๋ค๋ผ๋ฆฌ ๊ณต์ ํ ์ ์๋๋ก ํ๋ค. ๋ํ ๋ธ๋ก์ปค ์๋ฒ๋ ์ฃผํคํผ์๊ฒ ํ ํฝ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ๋ค.
์ด์ ์นดํ์นด ๋ฒ์ ์์๋ ์ฃผํคํผ๊ฐ ์ง์ ์ ์ธ ๋ฐ์ดํฐ ๊ด๋ฆฌ์๋ ์ฐธ์ฌํ์๋ค. Consumer์ธก์์ ์ฝ์ ํํฐ์ ์ Offset ์ ๋ณด๋ฅผ ์ฃผํคํผ์๊ฒ ๊ณต์ ํ์๋๋ฐ, ํ์ฌ๋ ์ด Offset ์ ๋ณด๋ฅผ Consumer group์์ ๊ด๋ฆฌํ๋ค.
Kafka Reference Architecture
๋ค์ ๊ทธ๋ฆผ์ Kafka์ ๋ ํผ๋ฐ์ค๋ค์ ์ํคํ ์ฒ์ด๋ค.
REST Proxy
confluent์์๋ REST Proxy๋ผ๊ณ ๋ถ๋ฆฌ๋ ์นดํ์นด ํด๋ฌ์คํฐ๋ฅผ ์ํ RESTful interface application์ ์คํ์์ค๋ก ์ ๊ณตํ๊ณ ์๋ค. Kafka ํด๋ผ์ด์ธํธ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋ฒ์ฉ์ ์ผ๋ก ์ฌ์ฉ๋๋ http๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๋ฃ๊ณ ๋บ ์ ์๋ค๋ ์ ์ด ํน์ง์ด๋ค.
Schema Registry
RESTful ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ์ฌ ์คํค๋ง๋ฅผ ๊ด๋ฆฌํ๊ฑฐ๋ ์กฐํํ๋ ๊ธฐ๋ฅ์ ์ ๊ณต. ์ด๋ Avro ํฌ๋งท์ ์ด์ฉํ๋ค. Avro ํฌ๋งท์ ์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ๋๋ ์ ธ ์คํค๋ง๋ ์คํค๋ง ๋ ์ง์คํธ๋ฆฌ๋ก, ์ค๋ฐ์ดํฐ๋ Kafka๋ก ๋ฑ๋ก๋๋ค.
์๋ชป๋ ์คํค๋ง์ ๋ฉ์์ง๋ฅผ ์ ๋ฌํ๋ค๋ฉด ์คํค๋ง ๋ ์ง์คํธ๋ฆฌ์ ๋ฑ๋กํ๋ ๊ณผ์ ์์ ์คํจ๊ณ Kafka์ ์ค๋ฐ์ดํฐ๊ฐ ์ ๋ฌ๋์ง ์๊ฒ ๋๋ค. ๊ทธ๋ฆฌํ์ฌ Consumer์์๋ ์๋ชป๋ ๋ฉ์์ง๋ฅผ ๋ฐ์ ์ผ์ด ์์ด Consumer์์ ์๋ชป๋ ์คํค๋ง๋ก ์ธํ ์๋ฌ๋ ๋ฐ์ํ์ง ์๋๋ค. ๋ํ Kafka์ ์ ๋ฌ๋๋ ๋ฐ์ด๋๋ฆฌ ๋ฐ์ดํฐ์ ์คํค๋ง๊ฐ ํฌํจ๋์ง ์๊ธฐ ๋๋ฌธ์ ์๋์ ์ผ๋ก ์ ์ ์ฉ๋์ ๋ฐ์ดํฐ๊ฐ ์ ๋ฌ๋๋ค.
ํ์ง๋ง 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๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ๋ฐ์ดํฐ์ ํ๋ฆ์ ํํํ๊ธฐ ์ํด ๋ ธ๋์ ์ ์ผ๋ก ์ด๋ฃจ์ด์ง 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 ์ ์ฅ์๋ก๋ ์ฌ์ฉํ ์ ์๋ ๊ธฐ๋ฅ์ ๊ฐ์ง๊ณ ์๋ค.
-
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์ ๋ด๋ถ์ ์ผ๋ก Kafka Streams๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ปดํ์ผ๋๋ฉฐ, ์ค์๊ฐ์ผ๋ก ๋ค์ด์ค๋ ๋ฐ์ดํฐ์์ SQL ์ฟผ๋ฆฌ๋ฌธ์ ํตํ์ฌ Error ํน์ ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฝ์๋ผ ์ ์์ด ๋น ๋ฅด๊ฒ ๊ด์ฐฐํ๊ณ ๋์ํด์ผ ํ๋ ์ด๋ฒคํธ ๊ธฐ๋ฐ ๋ง์ดํฌ๋ก์๋น์ค์ ์ด์์ ์ด๋ค.
- ์ ์ฌ SQL๋ฌธ์ ์ด์ฉํ์ฌ ๋ก์ง์ ๊ตฌ์ฑํ๊ธฐ ๋๋ฌธ์ ํ๋ก๊ทธ๋๋ฐ ์ง์์ด ๋ง์ด ์๊ตฌ๋์ง ์๋๋ค.
- ๊ตฌํ๋ KSQL๋ฌธ์ ์๋ฒ์ ๋ฐฐํฌํ๋ฉด ์์ง ๋ด์์ ๋ง์ถฐ ๊ตฌ๋๋๊ธฐ ๋๋ฌธ์, ์ฌ์ฉ์๊ฐ ์ง์ ์๋ฒ ๋ฐฐํฌ๊น์ง ๊ณ ๋ คํ ํ์๊ฐ ์๋ค.
์์ ๊ฐ์ ํน์ง ๋๋ฌธ์ ์นดํ์นด ํ ํฝ์ ๋ํ ๋ฐ์ดํฐ ๋ถ์์ ์์ฃผ ์ด์ฉ๋๋ค.
์์ ์๋ ์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ๊ฐ์ด๋ฐ KSQL ์ฒ๋ฆฌ๋ฅผ ํ๋ Cluster๊ฐ ๋ฐ๋ก ์๋ค. ๊ทธ๋ฆฌํ์ฌ JVM์์ running์ ํ์ฌ Kafka Cluster์ ์ฟผ๋ฆฌ๋ฅผ ์ํํ๋ค.
์์ ๊ฐ์ด ํ๋ฉด 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 ๋ด์์ ์ด๋ค ๊ณณ์์ ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ๊ฒ์ด๋ค ๋ฑ์ ๋ชจ๋ ๊ณผ์ ์ ํ๋ฐฉ์ ์ฒ๋ฆฌํ ์ ์๊ฒ ๋์๋ค. KSQL์ ETL ๋์ ๊ตฌ์กฐ์ ์์๋ Stream Processing, Connectors ์ด๋ฐ ๊ฒ๋ค์ KSQLDB์์ ์ฒ๋ฆฌํ ์ ์๋๋ก ํ ๊ฒ์ด๋ค.
Leave a comment