๋์ฉ๋ ์ค์๊ฐ ์คํธ๋ฆฌ๋ฐ ๋ถ์ ์์คํ
,
Kafka + ksqlDB๋ก ์ฝ๊ณ ๊ฐ๋ ฅํ๊ฒ!
์ค์๊ฐ ์คํธ๋ฆฌ๋ฐ ๋ฐ์ดํฐ ๋ถ์์
ํจ์จ๊ณผ ํ์ฅ์ฑ์ ์ก๊ณ ์ถ๋ค๋ฉด?
Kafka(์นดํ์นด)๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค๋ฉด, ๋์ฉ๋์ ์ค์๊ฐ ์คํธ๋ฆฌ๋ฐ ๋ถ์ ์์คํ
์ ๊ตฌํํ๋ ๊ฐ์ฅ ์ฝ๊ณ ๋น ๋ฅธ ๋ฐฉ๋ฒ์ ๋ฐ๋ก ksqlDB๋ฅผ ์ด์ฉํ๋ ๊ฒ์
๋๋ค.
Kafka์ ํตํฉ๋์ด ์ค์น ๋ฐ ๊ตฌ๋๋๋ ksqlDB๋ ๋ณต์กํ Streaming API๋ฅผ ์ฌ์ฉํ์ง ์๊ณ , ๋จ ๋ช ์ค์ SQL ์ฝ๋๋ง์ผ๋ก๋ ๊ฐ๋จํ๊ฒ ์ค์๊ฐ ์คํธ๋ฆฌ๋ฐ ๋ฐ์ดํฐ์ ๊ฐ๊ณต/๋ณํ/๋ถ์ ์์
์ ์ํํ ์ ์์ต๋๋ค.
์ปจํ๋ฃจ์ธํธ ๊ณต์ ํ์ด์ง์์ ๋ฐ์ท (๋งํฌ)
์ด๋ฏธ ๊ตญ๋ด์ธ ์ ์ ๊ธฐ์
๋ค์ด ๊ณผ๊ฑฐ์ ๋นํ ์ ์์ ์ ๋๋ก ๋์ฉ๋์ด๋ฉด์ ๋น ๋ฅธ Latency๋ฅผ ๊ฐ์ง๋ ์คํธ๋ฆฌ๋ฐ ๋ฐ์ดํฐ๋ฅผ ์ค์๊ฐ์ผ๋ก ๋ถ์ํ๊ณ ์ฆ๊ฐ์ ์ผ๋ก ํด๋น ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์ํ๋ ค๋ ์๊ตฌ์ฌํญ์ ์ง๋ฉดํ๊ณ ์์ผ๋ฉฐ, ์ด๋ฅผ ์ํด ksqlDB๋ฅผ ์ ๊ทน์ ์ผ๋ก ๋์
ํ๊ณ ์์ต๋๋ค.
๊ณผ๊ฑฐ์๋ Kafka ๊ธฐ๋ฐ์ ์ค์๊ฐ ์คํธ๋ฆฌ๋ฐ ๋ฐ์ดํฐ ๊ฐ๊ณต/๋ณํ/๋ถ์์ ์ํด ๋ณต์กํ Kafka Streams API๋ฅผ ํ์ฉํ์ง๋ง, ์ง๊ธ์ ๊ฐ๋จํ ์ฟผ๋ฆฌ๋ง์ผ๋ก๋ ์ฝ๊ณ ๋น ๋ฅด๊ฒ ์คํธ๋ฆฌ๋ฐ ๋ถ์ ์์คํ
์ ๊ตฌ์ถํ ์ ์๋ ksqlDB๊ฐ ์ค์๊ฐ ์คํธ๋ฆฌ๋ฐ ๋ฐ์ดํฐ ๋ถ์ ์์คํ
๊ตฌ์ถ์ ์ํ ๋์ธ๊ฐ ๋์ด ๊ฐ๊ณ ์์ต๋๋ค.
๋น ๋ฅด๊ฒ ์ฑ์ฅํ๋ ksqlDB, ๊ทธ๋ฆฌ๊ณ ๋ถ์กฑํ ์ ๋ฌธ๊ฐ
ksqlDB๋ SQL ๊ธฐ๋ฐ์ ์ฝ๊ณ ํธ๋ฆฌํ ๊ตฌํ ๋ฑ ์ฌ๋ฌ ์ฅ์ ์ผ๋ก ์ธํด ๊ธฐ์กด์ ์นดํ์นด Streams API๋ฅผ ๋น ๋ฅด๊ฒ ๋์ฒดํ๋ฉฐ ์ฑ์ฅํ๊ณ ์์ต๋๋ค.
ํ์ง๋ง ksqlDB๋ฅผ ์ค๋ฌด์ ํ์ฉํ ์ ๋์ ์ค๋ ฅ์ ๊ฐ์ถ ํ์
์ธ๋ ฅ์ ์ฐพ๊ธฐ๋ ๋งค์ฐ ์ด๋ ต์ต๋๋ค. ksqlDB๊ฐ ๋น๊ต์ ์ต๊ทผ์ ๋ถ๊ฐ๋ ์๋ฃจ์
์๊ณผ ๋์์, ksqlDB๋ฅผ ๋ค๋ฃจ๋ ๋๋ถ๋ถ์ ์๋ฃ๋ ๊ฐ์๊ฐ ํผ์์ ์ธ ๊ฐ๋
์์ฃผ์ ๋ด์ฉ์ผ๋ก ๊ตฌ์ฑ๋์ด ์ค๋ฌด์์ ํ์๋ก ํ๋ ์ค๋ ฅ์ ์๊ธฐ์๋ ๋ถ์กฑํจ์ด ๋ง์๊ธฐ ๋๋ฌธ์
๋๋ค.
์ค์๊ฐ ๋์ฉ๋ ์คํธ๋ฆฌ๋ฐ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์ ํ๋ฆฌ์ผ์ด์
์ ์ฝ๊ณ ๋น ๋ฅด๊ฒ.
โ์นดํ์นด ์๋ฒฝ ๊ฐ์ด๋ - ksqlDBโ๋
๋ณธ ๊ฐ์๋ ์ฌ๋ฌ๋ถ์ ksqlDB ์ ๋ฌธ๊ฐ๋ก ์ฑ์ฅํ ์ ์๋๋ก ์ค์ ์ ์ธ ๋ด์ฉ์ผ๋ก ๊ตฌ์ฑ๋์ด ์์ต๋๋ค. ์ฐ๋ฆฌ์ ๋ชฉํ๋ ์ด๋ฅผ ํตํด ๊ธฐ์
์ด ์ํ๋ ksqlDB ์ ๋ฌธ ์ธ๋ ฅ์ผ๋ก ํ์ธต ๋ ๋ฐ๋์ํ ์ ์๊ฒ ๋๋ ๊ฒ์
๋๋ค.
โ
๋ฒ๋ฒ์ด ksqlDB์ ๋์ ๋ฒฝ์ ๊ฐ๋ก๋งํ์ ๋ถ
โ
ksqlDB์ ํต์ฌ ๋ฉ์ปค๋์ฆ์ ์ดํดํ๊ณ ์ถ์ผ์ ๋ถ
โ
์
๋ฌด์ ์ฆ๊ฐ์ ์ผ๋ก ksqlDB๋ฅผ ํ์ฉํ๊ณ ์ถ์ผ์ ๋ถ
์ด์ ๋ณธ ๊ฐ์๋ ์๊ฐ์ ์ฌ๋ฌ๋ถ๋ค์ด ์ค๋ฌด์์ ๋ฐ๋ก ksqlDB๋ฅผ ํ์ฉํ๊ธฐ ์ํด์ ๋ฐ๋์ ์ฒด๋ํด์ผ ํ ๋ด์ฉ๋ค๋ก ์ฑ์์ ธ ์์ต๋๋ค.
์ด ๊ฐ์๋ง์ ํน์ง์
ํ์ธํด๋ณด์ธ์.
์์ธํ ์๊ฐ์๋ฃ์ ์ค์ต์ ํตํด ksqlDB ์ฃผ์ ๊ตฌ์ฑ์์๋ค์ ํต์ฌ ๋์ ๋ฉ์ปค๋์ฆ์ ์ฒด๋
ksqlDB๋ ์ผ๋ฐ RDBMS์ ๋น์ทํ ๋ถ๋ถ๋ ์์ง๋ง, ์๋นํ ๋ค๋ฅธ ๋ถ๋ถ์ด ๋ง์ต๋๋ค. ๋๋ฌธ์ ksqlDB๋ฅผ ์ ๋ค๋ฃจ๊ธฐ ์ํด์๋ ์ฃผ์ ๊ตฌ์ฑ ์์์ธ Stream, Table, Query, Mview, RocksDB ๋ฑ์ ๋์ ๋ฉ์ปค๋์ฆ์ ์์ธํ ์ดํดํ๊ณ ์์ด์ผ ํฉ๋๋ค. ๋ณธ ๊ฐ์๋ ์์ธํ ์๊ฐ์๋ฃ์ ์ค์ต์ ํตํด ksqlDB์ ํต์ฌ ๋ฉ์ปค๋์ฆ์ ์ฒด๋ํ ์ ์๋๋ก ๋์๋๋ฆด ๊ฒ์
๋๋ค.
ksqlDB ๊ณ ์ ์ ๋ค์ํ ํจ์, ์กฐ์ธ, Group by, Window ํ์ฉ ๋ฐ ์ค๋ฌด ํ์ฉ์ ์ํ ์ค์ ์ค์ต๊น์ง
ksqlDB๋ฅผ ์ค๋ฌด์์ ์ ํ์ฉํ๋ ค๋ฉด ksqlDB์์ ์ ๊ณตํ๋ ์ฌ๋ฌ ํจ์๋ค์ ์กฐ์ธ ๋ฐ Group by, ๊ทธ๋ฆฌ๊ณ Window ์ฌ์ฉ ๋ฐฉ๋ฒ์ ์ ์๊ณ ์์ด์ผ ํฉ๋๋ค. ํนํ ksqlDB์ ์กฐ์ธ, Group by, Window๋ SQL๊ณผ๋ ๋ค๋ฅธ ์ ์ฝ์ ๋ค์ด ์์ผ๋ฉฐ, ์ด๋ค์ ์ดํดํ์ง ์๊ณ ์๋ ksqlDB๋ฅผ ์ ๋๋ก ํ์ฉ ํ ์ ์์ต๋๋ค. ๋ณธ ๊ฐ์์์ ์ด๋ค ์์๋ค์ ๋ง์ ์ค์ต์ ํตํด์ ์ง์ ์ํํด ๋ณด๋ฉด์ ๊ทธ ์ฐจ์ด๋ฅผ ๋ช
ํํ๊ฒ ์ดํดํ์ค ์ ์์ ๊ฒ์
๋๋ค.
๋ํ ๋ณ๋๋ก ๋ง๋ จ๋ '์จ๋ผ์ธ ์ ๋ฐ Shop' ์ค์ ์ค์ต ์น์
์ ํตํด, ์ฌ๋ฌ๋ถ์ ์ค๋ฌด์์ ksqlDB์์ ๋ค์ํ ์ค์๊ฐ ๋ถ์์ ํจ์จ์ ์ผ๋ก ์ ์ฉํ ์ ์๋ ์์ค์ผ๋ก ์ด๋์ด ๋๋ฆด ๊ฒ์
๋๋ค.
ksqlDB์์ Connect ํ์ฉ, ๊ทธ๋ฆฌ๊ณ Elasticsearch ์ฐ๋๊ณผ Kibana ์๊ฐํ๊น์ง
ksqlDB์์ Connect์ ํตํฉํ๊ณ ํ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ง์๋๋ฆฝ๋๋ค. ๋ํ ksqlDB์ ๋ถ์ ๊ฒฐ๊ณผ๋ฅผ Elasticsearch๋ก Connect๋ฅผ ํตํด์ ์ ์ฅํ๊ณ ์ด๋ฅผ Kibana๋ฅผ ํตํด ์๊ฐํํ๋ ๋ฐฉ๋ฒ์ ์ค์ต์ ํตํด ์ตํ์ค ์ ์์ต๋๋ค.
ksqlDB ์ด๋ณด์์ ์ ๋ฌธ๊ฐ ์์ค์ผ๋ก ์ด๋์ด ๋๋ฆฝ๋๋ค.
โ๏ธ
ksqlDB ์ฃผ์ ๊ตฌ์ฑ ์์๋ค์ ํต์ฌ ๋ฉ์ปค๋์ฆ
๐
Stream๊ณผ Table์ ์ฐจ์ด ๋ฐ ํ์ฉ ๋ฐฉ๋ฒ, ์ฃผ์ ์ค๋ธ์ ํธ๋ค์ ์์ฑ ๋ฐ ๊ด๋ฆฌ
๐งฐ
์ค์ต์ ํตํ ksqlDB์ ๋ค์ํ ์ฟผ๋ฆฌ ๊ตฌ๋ฌธ๊ณผ ์ฃผ์ ํจ์์ ์ดํด
๐
ksqlDB ๊ณ ์ ์ Group by, MView, Join ์ดํด์ ํ์ฉ, RDBMS์์ ์ฐจ์ด ๋ฐ ์ ์ฝ ์ฌํญ
๐
์ฌ๋ฌ ๊ฐ์ง ์ ํ์ Window์ ๋ํ ์ดํด ๋ฐ Time ๊ธฐ๋ฐ Window Aggregation, Window ์กฐ์ธ์ ๋์ ๋ฉ์ปค๋์ฆ ์ค์ต
๐พ
Connect์์ ์ฐ๋ ๋ฐ Elasticsearch์ Kibana๋ฅผ ํตํ ๋ถ์ ๊ฒฐ๊ณผ์ ์์ง ๋ฐ ์๊ฐํ
ksqlDB ๊ฒํฅ๊ธฐ๊ฐ ์๋, ์ง๊ธ๊น์ง์ ์ด๋ค ๊ฐ์๋ ์ธํฐ๋ท ์๋ฃ์์๋ ์ฐพ์๋ณผ ์ ์์๋ ํต์ฌ์ ์ธ ๋ด์ฉ๊ณผ ํ์ฉ๋ฒ์ ๋ด์๋ด๊ธฐ ์ํด ๋ง์ ๋
ธ๋ ฅ์ ๊ธฐ์ธ์์ต๋๋ค. ๋ํ ์ค์ต์ ํตํด ์ด๋ก ์ ๋ณด๋ค ์์ฐ์ค๋ฝ๊ฒ ์ตํ ์ ์๋๋ก ๋ค์ํ ์ค์ต ์์
์ผ๋ก ์ปค๋ฆฌํ๋ผ์ ๊ฐ๋ ์ฑ์ ์ต๋๋ค.
๋ณธ ๊ฐ์๋ฅผ ๋ง์น์ ๋ค์๋, ๋๊ตฌ์ ๊ฒฌ์ฃผ์ด๋ ์์์๋ ksqlDB ์ ๋ฌธ๊ฐ๋ก ์ฑ์ฅํด ์๋ ์์ ์ ๋ฐ๊ฒฌํ์ค ์ ์์ ๊ฒ์
๋๋ค.
์์ธํ ์ค๋ช
, ๋ค์ํ ์ค์ต์ผ๋ก ๋ด์ฉ์ ์ถฉ๋ถํ ์ดํดํ ์ ์๋๋ก ๊ตฌ์ฑํ์ต๋๋ค.
(์๊ฐ์ ๋ถ๋ค๊ป๋ 100ํ์ด์ง ์ด์์ ๊ฐ์ ๊ต์ฌ PDF๋ฅผ ์ ๊ณตํฉ๋๋ค.)
๐ก ์๊ฐ ์ ์ฐธ๊ณ ํด์ฃผ์ธ์!
- ๋ณธ ๊ฐ์์์๋ ksqlDB๋ง ๋ค๋ฃจ๋ฉฐ, Kafka Streams๋ ๋ค๋ฃจ์ง ์์ต๋๋ค.
- Macbook M1/M2 ๋ชจ๋ธ PC์์๋ Virtualbox VM ํธํ ์ค์ต์ด ์ด๋ ค์ธ ์ ์์ต๋๋ค.
์ค์ต ํ๊ฒฝ
์๋ฒ OS
์นดํ์นด ์๋ฒ OS๋ก ์ค๋ผํด(Oracle) VirtualBox VM ๊ธฐ๋ฐ์์ Ubuntu Linux(์ฐ๋ถํฌ ๋ฆฌ๋
์ค) 20.04๋ฅผ ์ด์ฉํฉ๋๋ค. ๋ฆฌ๋
์ค๋ฅผ ์ด์ฉํ์ง๋ง ๊ฐ์ ๋จธ์ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ๋๋๋ฏ๋ก Windows/macOS ํ๊ฒฝ ๋ชจ๋์์ ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
VirtualBox๋ Windows/macOS ํ๊ฒฝ์์ ๊ฑฐ์ ๋๋ถ๋ถ ์ค์น ๊ฐ๋ฅํฉ๋๋ค. ๋ค๋ง Mac์ ๊ฒฝ์ฐ ์ต์ M1 ๋ชจ๋ธ์์ VirtualBox๊ฐ ์ค์น๋์ง ์์ผ๋ฏ๋ก UTM๋ฑ์ ๊ฐ์ํ๊ฒฝ์ ์ด์ฉํ์ฌ Ubuntu๋ฅผ ์ค์นํ์
์ผ ํฉ๋๋ค. M1 ๋ชจ๋ธ์ ๊ฒฝ์ฐ ๋ฐ๋์ ๊ฐ์ํ๊ฒฝ์์ Ubuntu๊ฐ ์ค์น๋๋์ง ํ์ธ ํ ๊ฐ์๋ฅผ ์ ํํด ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค.
์ปจํ๋ฃจ์ธํธ ์นดํ์นด
์ปค๋ฎค๋ํฐ ์๋์
์นดํ์นด๋ ์ํ์น ์นดํ์นด(Apache Kafka)๊ฐ ์๋ ์ปจํ๋ฃจ์ธํธ ์นดํ์นด(Confluent Kafka) Community Edition ๋ฒ์ 7.1.2๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ปจํ๋ฃจ์ธํธ๋ ์นดํ์นด๋ฅผ ๋ง๋ ํต์ฌ ์ธ๋ ฅ์ด ์ฃผ์ถ์ด ๋์ด ์ธ์ด ํ์ฌ๋ก, ๊ธฐ์
๊ณ ๊ฐ์ ์ํด ์ฑ๋ฅ ๋ฐ ํธ์์ฑ ์ธก๋ฉด์์ ๋ณด๋ค ํฅ์๋ ๊ธฐ์
์ฉ ์นดํ์นด๋ฅผ ์ ๊ณตํ๊ณ ์์ต๋๋ค. ์ํ์น ์นดํ์นด์ 100% ํธํ๋๋ฉด์๋ ๋ณด๋ค ๋ค์ํ ์นดํ์นด ๋ชจ๋ ๋ฐ ์ผ์ฒดํ๋ Binary๋ฅผ ์ด์ฉํ ์ ์์ต๋๋ค. ์ปจํ๋ฃจ์ธํธ๋ก ๊ฐ๋ ฅํ ๋ถ์ฐํ ์์คํ
์นดํ์นด๋ฅผ ๋์ฑ ํ๋ ฅ์ ์ผ๋ก ํ์ฅ ๊ฐ๋ฅํ ํํ๋ก ์ฌ์ฉํด ๋ณด์ธ์. ์ธํ๋ผ ๊ตฌ์ถ ๋ฐ ์ ์ง ๊ด๋ฆฌ ๋ถ๋ด์ ์ค์ด๊ณ , ๋ ๋น ๋ฅธ ๊ฐ๋ฐ์ ํ ์ ์๋๋ก ๋์์ ์ค ๊ฒ์
๋๋ค.
๊ถ์ฅ PC ์ฌ์
์ ์ฒด ์ค์ต ํ๊ฒฝ ๊ตฌ์ฑ์ผ๋ก 20~30GB์ ์คํ ๋ฆฌ์ง ์ฉ๋, 4GB ์ด์์ RAM์ ๊ฐ์ถ PC ํ๊ฒฝ์ด ์๊ตฌ๋ ์ ์์ต๋๋ค.
Q&A๋ฅผ ํ์ธํด๋ณด์ธ์ ๐ฌ
Q. ์ด์ ๊ฐ์์ธ ์นดํ์นด ์๋ฒฝ ๊ฐ์ด๋ - ์ฝ์ดํธ์ด๋ ์ปค๋ฅํธํธ์ ๋ค์ด์ผ ํ๋์?
๋ณธ ๊ฐ์ ์ค 2๊ฐ ์น์
์ ksqlDB์ Connect์ ์ฐ๋์ ๋ค๋ฃจ๊ณ ์์ต๋๋ค. ์นดํ์นด ์๋ฒฝ ๊ฐ์ด๋ - ์ปค๋ฅํธํธ์ ์๊ฐํ์ง ์์ผ์
จ๋๋ผ๋ ๊ธฐ๋ณธ์ ์ธ Connect์ ๋ํ ์ดํด์ ์ค์ต ๊ฒฝํ์ ์์ผ์
์ผ ํด๋น ์น์
์ค์ต์ ์ดํดํ์ค ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค.
์นดํ์นด ์ฝ์ด์ ๋ํ ์ดํด๋ ํ์์ ์ผ๋ก ํ์ํฉ๋๋ค. ์ด์ ๊ฐ์์ธ ์นดํ์นด ์๋ฒฝ ๊ฐ์ด๋ - ์ฝ์ดํธ์ ์๊ฐํ์๋ฉด ์ข์ต๋๋ค. ๋ค๋ง ์๊ฐํ์ง ์์ผ์
จ๋๋ผ๋ ์นดํ์นด์ ๊ธฐ๋ณธ์ธ Broker, Producer, Consumer์ ํ์ฉ ๊ฒฝํ์ด ์๊ณ ํต์ฌ ๊ฐ๋
์ด ์ ์กํ ์์ผ์๋ค๋ฉด ์ถฉ๋ถํ ๋ณธ ๊ฐ์๋ฅผ ๋ค์ผ์ค ์ ์์ต๋๋ค.
Q. ๊ฐ์ ์๊ฐ์ ์ํด RDBMS SQL๊ฒฝํ์ด ์์ด์ผ ํ๋์?
๋ณธ ๊ฐ์์ ๋ง์ ์ค์ต์ด ์ฟผ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๊ณ ์์ต๋๋ค. ๋๋ฌธ์ ๊ธฐ๋ณธ์ ์ธ RDBMS SQL ๊ตฌ๋ฌธ ๋ฐ Group by์ Join์ ๋ํ ํ์ฉ ๊ฒฝํ์ด ์์ผ์
์ผ ํฉ๋๋ค.