Ver3.0 ๐ ์ค์๊ฐ ๋ฐ์ดํฐ ์คํธ๋ฆผ ์ฒ๋ฆฌ ์ํคํ ์ฒ ์๋ฒฝ ๊ฐ์ด๋

๐ ์ค์๊ฐ ๋ฐ์ดํฐ ์คํธ๋ฆผ ์ฒ๋ฆฌ ์ํคํ ์ฒ ์๋ฒฝ ๊ฐ์ด๋
์ด๋น ์๋ฐฑ๋ง ๊ฑด์ ๋ฐ์ดํฐ๋ฅผ ์ค์๊ฐ์ผ๋ก ์ฒ๋ฆฌํ๋ ํ๋ ์์คํ ์ ํต์ฌ ๊ธฐ์ ๐ซ
๐ฏ ์ค์๊ฐ ์คํธ๋ฆผ ์ฒ๋ฆฌ๊ฐ ๋ญ๋ฐ?
์์ฆ ๋ทํ๋ฆญ์ค ๋ณด๋ค๊ฐ "์ด? ์ด๊ฑฐ ๋ด ์ทจํฅ ์ ๊ฒฉ์ธ๋ฐ?" ํ๋ ์ถ์ฒ ๋ฐ์๋ณธ ์ ์์ฃ ? ใ
ใ
ใ
๊ทธ๊ฒ ๋ฐ๋ก ์ค์๊ฐ ๋ฐ์ดํฐ ์คํธ๋ฆผ ์ฒ๋ฆฌ์ ๋ง๋ฒ์ด์์! ๐ฌ
์ค์๊ฐ ๋ฐ์ดํฐ ์คํธ๋ฆผ ์ฒ๋ฆฌ(Real-time Data Stream Processing)๋ ๋ง ๊ทธ๋๋ก ๋ฐ์ดํฐ๊ฐ ์์ฑ๋๋ ์๊ฐ๋ถํฐ ์ฐ์์ ์ผ๋ก ํ๋ฌ๊ฐ๋ ๋ฐ์ดํฐ๋ฅผ ์ฆ๊ฐ์ ์ผ๋ก ๋ถ์ํ๊ณ ์ฒ๋ฆฌํ๋ ๊ธฐ์ ์ด์์. ์ ํต์ ์ธ ๋ฐฐ์น ์ฒ๋ฆฌ(Batch Processing)๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ชจ์๋๋ค๊ฐ ํ ๋ฒ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ด๋ผ๋ฉด, ์คํธ๋ฆผ ์ฒ๋ฆฌ๋ ๋ฐ์ดํฐ๊ฐ ๋ค์ด์ค๋ ์ฆ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ด์ฃ .
2024๋
๊ธฐ์ค์ผ๋ก ์ ์ธ๊ณ์์ ๋งค์ผ ์์ฑ๋๋ ๋ฐ์ดํฐ๋ ์ฝ 328.77 ์์ฌ๋ฐ์ดํธ(EB)์ ๋ฌํ๋ค๊ณ ํด์. ์ด๊ฑด DVD ์ฝ 660์ต ์ฅ ๋ถ๋์ด๋ผ๋๋ฐ... ์์์ด ์ ๊ฐ์ฃ ? ใ
ใ
์ด๋ ๊ฒ ํญ๋ฐ์ ์ผ๋ก ์ฆ๊ฐํ๋ ๋ฐ์ดํฐ๋ฅผ ์ค์๊ฐ์ผ๋ก ์ฒ๋ฆฌํ์ง ์์ผ๋ฉด ๋น์ฆ๋์ค ๊ธฐํ๋ฅผ ๋์น๊ฒ ๋๋ ์๋๊ฐ ๋ ๊ฑฐ์์.
โข ๊ธ์ต ๊ฑฐ๋ ์์คํ : ์ฃผ์ ๊ฑฐ๋, ์ฌ๊ธฐ ํ์ง, ๋ฆฌ์คํฌ ๊ด๋ฆฌ
โข ์์ ๋ฏธ๋์ด: ํธ๋ ๋ ๋ถ์, ์ค์๊ฐ ํผ๋ ์์ฑ
โข IoT ์ผ์ ๋คํธ์ํฌ: ์ค๋งํธ ์ํฐ, ์ ์กฐ์ ๋ชจ๋ํฐ๋ง
โข ์ถ์ฒ ์์คํ : ๊ฐ์ธํ๋ ์ฝํ ์ธ ์ถ์ฒ
โข ๋ก๊ทธ ๋ถ์: ์์คํ ๋ชจ๋ํฐ๋ง, ๋ณด์ ์ํ ํ์ง
๐๏ธ ์คํธ๋ฆผ ์ฒ๋ฆฌ ์ํคํ ์ฒ์ ํต์ฌ ๊ตฌ์ฑ ์์
์ค์๊ฐ ์คํธ๋ฆผ ์ฒ๋ฆฌ ์์คํ ์ ์ฌ๋ฌ ๋ ์ด์ด๋ก ๊ตฌ์ฑ๋์ด ์์ด์. ๊ฐ ๋ ์ด์ด๊ฐ ์ ๊ธฐ์ ์ผ๋ก ์ฐ๊ฒฐ๋์ด ๋ฐ์ดํฐ๊ฐ ๋๊น ์์ด ํ๋ฅด๋๋ก ์ค๊ณ๋์ฃ . ๋ง์น ๊ณ ์๋๋ก์ฒ๋ผ์! ๐ฃ๏ธ
1๏ธโฃ ๋ฐ์ดํฐ ์์ง ๋ ์ด์ด (Data Ingestion Layer)
๊ฐ์ฅ ์ฒซ ๋จ๊ณ๋ ๋ฐ์ดํฐ๋ฅผ ์์งํ๋ ๊ฑฐ์์. ๋ค์ํ ์์ค์์ ๋ฐ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ์์ ์ ์ผ๋ก ๋ฐ์๋ค์ด๋ ๊ฒ ํต์ฌ์ด์ฃ .
์ฃผ์ ๋ฐ์ดํฐ ์์ค ์ ํ:
โข ์ ํ๋ฆฌ์ผ์ด์
๋ก๊ทธ: ์น ์๋ฒ, ๋ชจ๋ฐ์ผ ์ฑ์์ ๋ฐ์ํ๋ ์ด๋ฒคํธ ๋ก๊ทธ
โข IoT ์ผ์ ๋ฐ์ดํฐ: ์จ๋, ์ต๋, ์์น ์ ๋ณด ๋ฑ ์ผ์์์ ์์ง๋๋ ๋ฐ์ดํฐ
โข ์ฌ์ฉ์ ํ๋ ๋ฐ์ดํฐ: ํด๋ฆญ, ์คํฌ๋กค, ๊ตฌ๋งค ๋ฑ์ ์ฌ์ฉ์ ์ธํฐ๋์
โข ์์คํ
๋ฉํธ๋ฆญ: CPU, ๋ฉ๋ชจ๋ฆฌ, ๋คํธ์ํฌ ์ฌ์ฉ๋ ๋ฑ ์์คํ
๋ชจ๋ํฐ๋ง ๋ฐ์ดํฐ
โข ํธ๋์ญ์
๋ฐ์ดํฐ: ๊ธ์ต ๊ฑฐ๋, ์ฃผ๋ฌธ ์ฒ๋ฆฌ ๋ฑ์ ๋น์ฆ๋์ค ํธ๋์ญ์
๋ฐ์ดํฐ ์์ง์ ์ฌ์ฉ๋๋ ๋ํ์ ์ธ ๋๊ตฌ๋ก๋ Apache Flume, Logstash, Filebeat ๋ฑ์ด ์์ด์. ์ด๋ฐ ๋๊ตฌ๋ค์ ๋ค์ํ ์์ค์์ ๋ฐ์ดํฐ๋ฅผ ์์งํด์ ๋ค์ ๋จ๊ณ๋ก ์ ๋ฌํ๋ ์ญํ ์ ํ์ฃ .
๋ฐ์ดํฐ ์์ง ๋จ๊ณ์์๋ ๋คํธ์ํฌ ์ฅ์ ๋ ์ผ์์ ์ธ ์์คํ ๋ค์ดํ์์ ๋๋นํด์ผ ํด์. ๋ฒํผ๋ง๊ณผ ์ฌ์๋ ๋ก์ง์ ๊ตฌํํ๋ ๊ฒ ํ์์ฃ ! ์ค์ ๋ก 2023๋ AWS์ ๋ณด๊ณ ์์ ๋ฐ๋ฅด๋ฉด, ์ ์ ํ ๋ฒํผ๋ง ์ ๋ต์ ์ฌ์ฉํ ์์คํ ์ ๋ฐ์ดํฐ ์์ค๋ฅ ์ด 99.9% ๊ฐ์ํ๋ค๊ณ ํด์.
2๏ธโฃ ๋ฉ์์ง ํ ๋ ์ด์ด (Message Queue Layer)
์์ง๋ ๋ฐ์ดํฐ๋ฅผ ์์๋ก ์ ์ฅํ๊ณ ์ฒ๋ฆฌ ์์คํ
์ผ๋ก ์ ๋ฌํ๋ ์ค๊ฐ ๋ฒํผ ์ญํ ์ ํ๋ ๋ ์ด์ด์์. ์ด๊ฒ ์์ผ๋ฉด ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์๋์ ์์ฑ ์๋์ ๋ถ๊ท ํ์ผ๋ก ์์คํ
์ด ํฐ์ง ์ ์์ด์ ใ
ใ
ใ
๐ฅ
Apache Kafka - ์
๊ณ ํ์ค ๋ฉ์์ง ๋ธ๋ก์ปค
Kafka๋ 2011๋
LinkedIn์์ ๊ฐ๋ฐํ ๋ถ์ฐ ์คํธ๋ฆฌ๋ฐ ํ๋ซํผ์ผ๋ก, ํ์ฌ ๊ฐ์ฅ ๋๋ฆฌ ์ฌ์ฉ๋๋ ๋ฉ์์ง ํ ์์คํ
์ด์์. ์ด๋น ์๋ฐฑ๋ง ๊ฐ์ ๋ฉ์์ง๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ ๋์ ์ฒ๋ฆฌ๋์ด ํน์ง์ด์ฃ .
Kafka์ ํต์ฌ ๊ฐ๋
๋ค:
โข ํ ํฝ(Topic): ๋ฉ์์ง๊ฐ ์ ์ฅ๋๋ ๋
ผ๋ฆฌ์ ์ฑ๋. ์๋ฅผ ๋ค์ด "user-clicks", "order-events" ๊ฐ์ ์ด๋ฆ์ผ๋ก ๊ตฌ๋ถ
โข ํํฐ์
(Partition): ํ ํฝ์ ์ฌ๋ฌ ๊ฐ๋ก ๋๋ ๊ฒ. ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํด์ ์ฑ๋ฅ์ ๋์
โข ํ๋ก๋์(Producer): ๋ฉ์์ง๋ฅผ Kafka์ ๋ณด๋ด๋ ์ ํ๋ฆฌ์ผ์ด์
โข ์ปจ์๋จธ(Consumer): Kafka์์ ๋ฉ์์ง๋ฅผ ์ฝ์ด๊ฐ๋ ์ ํ๋ฆฌ์ผ์ด์
โข ์ปจ์๋จธ ๊ทธ๋ฃน(Consumer Group): ์ฌ๋ฌ ์ปจ์๋จธ๊ฐ ํ๋ ฅํด์ ๋ฉ์์ง๋ฅผ ์ฒ๋ฆฌํ๋ ๋จ์
Kafka์ ๊ฐ๋ ฅํ ์ ์ ๋ฉ์์ง ์์์ฑ(Persistence)์ด์์. ๋ฉ์์ง๋ฅผ ๋์คํฌ์ ์ ์ฅํ๊ธฐ ๋๋ฌธ์ ์ปจ์๋จธ๊ฐ ๋ค์ด๋์ด๋ ๋ฐ์ดํฐ๊ฐ ์ฌ๋ผ์ง์ง ์๊ณ , ๋์ค์ ๋ค์ ์ฝ์ ์ ์์ฃ . ๊ธฐ๋ณธ์ ์ผ๋ก 7์ผ๊ฐ ๋ฉ์์ง๋ฅผ ๋ณด๊ดํ๋๋ฐ, ์ค์ ์ ๋ฐ๋ผ ๋ ๊ธธ๊ฒ ๋ณด๊ดํ ์๋ ์์ด์.
์ต๊ทผ์๋ Apache Pulsar๋ ์ฃผ๋ชฉ๋ฐ๊ณ ์์ด์. Pulsar๋ Yahoo์์ ๊ฐ๋ฐํ ์์คํ ์ผ๋ก, Kafka๋ณด๋ค ๋ ๋์ ๋ฉํฐ ํ ๋์(Multi-tenancy)์ ์ง๋ฆฌ์ ๋ณต์ (Geo-replication) ๊ธฐ๋ฅ์ ์ ๊ณตํด์.
Kafka ์ฅ์ : ์ฑ์ํ ์ํ๊ณ, ํ๋ถํ ์ปค๋ฎค๋ํฐ, ๊ฒ์ฆ๋ ์์ ์ฑ
Pulsar ์ฅ์ : ๋ ๋์ ํ์ฅ์ฑ, ์คํ ๋ฆฌ์ง์ ์ปดํจํ ๋ถ๋ฆฌ, ๋ค์ดํฐ๋ธ ๋ฉํฐ ํ ๋์
2024๋ ๊ธฐ์ค์ผ๋ก Kafka์ ์์ฅ ์ ์ ์จ์ด ์ฝ 70%๋ก ์ฌ์ ํ ์๋์ ์ด์ง๋ง, Pulsar๋ ๋น ๋ฅด๊ฒ ์ฑ์ฅ ์ค์ด์์!
3๏ธโฃ ์คํธ๋ฆผ ์ฒ๋ฆฌ ์์ง ๋ ์ด์ด (Stream Processing Engine Layer)
์ด์ ์ง์ง ํต์ฌ์ด์์! ์ค์๊ฐ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ถ์ํ๊ณ ๋ณํํ๋ ๋๋ ์ญํ ์ ํ๋ ๋ ์ด์ด์ฃ . ๐ง
Apache Flink - ์ง์ ํ ์คํธ๋ฆผ ์ฒ๋ฆฌ์ ๊ฐ์
Flink๋ ๋
์ผ ๋ฒ ๋ฅผ๋ฆฐ ๊ณต๊ณผ๋ํ์์ ์์๋ ํ๋ก์ ํธ๋ก, ์ง์ ํ ์คํธ๋ฆผ ์ฐ์ (Stream-first) ์ํคํ
์ฒ๋ฅผ ๊ฐ์ง ์ฒ๋ฆฌ ์์ง์ด์์. ๋ฐฐ์น ์ฒ๋ฆฌ๋ฅผ ์คํธ๋ฆผ ์ฒ๋ฆฌ์ ํน์ํ ๊ฒฝ์ฐ๋ก ๋ณด๋ ์ฒ ํ์ ๊ฐ์ง๊ณ ์์ฃ .
Flink์ ํต์ฌ ๊ธฐ๋ฅ๋ค:
1) ์ด๋ฒคํธ ํ์ ์ฒ๋ฆฌ (Event Time Processing)
๋ฐ์ดํฐ๊ฐ ์ค์ ๋ก ๋ฐ์ํ ์๊ฐ์ ๊ธฐ์ค์ผ๋ก ์ฒ๋ฆฌํด์. ๋คํธ์ํฌ ์ง์ฐ์ด๋ ์์คํ
์ฅ์ ๋ก ๋ฐ์ดํฐ๊ฐ ๋ฆ๊ฒ ๋์ฐฉํด๋ ์ ํํ ์๊ฐ ์์๋๋ก ์ฒ๋ฆฌํ ์ ์์ฃ . ์๋ฅผ ๋ค์ด, IoT ์ผ์๊ฐ ์คํ๋ผ์ธ ์ํ์๋ค๊ฐ ๋ค์ ์ฐ๊ฒฐ๋๋ฉด์ ๊ณผ๊ฑฐ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด๋ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌํ ์ ์์ด์.
2) ์ํ ๊ด๋ฆฌ (State Management)
Flink๋ ๋ถ์ฐ ํ๊ฒฝ์์๋ ์ํ๋ฅผ ์์ ์ ์ผ๋ก ๊ด๋ฆฌํด์. ์๋ฅผ ๋ค์ด "์ง๋ 1์๊ฐ ๋์์ ํ๊ท ์จ๋"๋ฅผ ๊ณ์ฐํ๋ ค๋ฉด ์ด์ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ์ตํ๊ณ ์์ด์ผ ํ๋๋ฐ, Flink๋ ์ด๋ฐ ์ํ๋ฅผ ํจ์จ์ ์ผ๋ก ์ ์ฅํ๊ณ ๊ด๋ฆฌํ์ฃ . RocksDB๋ฅผ ์ฌ์ฉํด์ ๋์ฉ๋ ์ํ๋ ์ฒ๋ฆฌํ ์ ์์ด์.
3) ์ ํํ ํ ๋ฒ ์ฒ๋ฆฌ (Exactly-Once Semantics)
๊ฐ์ฅ ์ค์ํ ๊ธฐ๋ฅ ์ค ํ๋์์! ์์คํ
์ฅ์ ๊ฐ ๋ฐ์ํด๋ ๊ฐ ๋ฉ์์ง๊ฐ ์ ํํ ํ ๋ฒ๋ง ์ฒ๋ฆฌ๋๋๋ก ๋ณด์ฅํด์. ๊ธ์ต ๊ฑฐ๋ ๊ฐ์ ์ค์ํ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ๋ ํ์์ ์ด์ฃ . Flink๋ ์ฒดํฌํฌ์ธํธ(Checkpoint) ๋ฉ์ปค๋์ฆ์ ํตํด ์ด๋ฅผ ๊ตฌํํด์.
4) ์๋์ฐ ์ฐ์ฐ (Window Operations)
์๊ฐ ๊ธฐ๋ฐ์ด๋ ๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋ฃนํํด์ ์ฒ๋ฆฌํ ์ ์์ด์. ์๋ฅผ ๋ค๋ฉด:
- ํ
๋ธ๋ง ์๋์ฐ(Tumbling Window): 5๋ถ๋ง๋ค ๊ตฌ๋ถ๋๋ ๊ณ ์ ํฌ๊ธฐ ์๋์ฐ
- ์ฌ๋ผ์ด๋ฉ ์๋์ฐ(Sliding Window): 1๋ถ๋ง๋ค ๊ฐฑ์ ๋๋ 5๋ถ ํฌ๊ธฐ ์๋์ฐ
- ์ธ์
์๋์ฐ(Session Window): ์ฌ์ฉ์ ํ๋์ด ์๋ ์๊ฐ์ผ๋ก ๊ตฌ๋ถ๋๋ ๋์ ์๋์ฐ
// Flink ์๋์ฐ ์ฐ์ฐ ์์ (Java)
DataStream<SensorReading> sensorData = ...;
DataStream<Tuple2<String, Double>> avgTemp = sensorData
.keyBy(r -> r.sensorId)
.timeWindow(Time.minutes(5)) // 5๋ถ ์๋์ฐ
.aggregate(new AvgTemperatureAggregator());
Apache Spark Streaming - ๋ง์ดํฌ๋ก ๋ฐฐ์น์ ์ ๊ตฌ์
Spark Streaming์ ์กฐ๊ธ ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํด์. ์ค์๊ฐ ์คํธ๋ฆผ์ ์์ฃผ ์์ ๋ฐฐ์น๋ก ๋๋ ์ ์ฒ๋ฆฌํ๋ ๋ง์ดํฌ๋ก ๋ฐฐ์น(Micro-batch) ๋ฐฉ์์ด์ฃ . ๋ณดํต 0.5์ด์์ 2์ด ์ ๋์ ๊ฐ๊ฒฉ์ผ๋ก ๋ฐฐ์น๋ฅผ ๋ง๋ค์ด์.
Spark์ ์ฅ์ ์ ๋ฐฐ์น ์ฒ๋ฆฌ์ ์คํธ๋ฆผ ์ฒ๋ฆฌ๋ฅผ ๊ฐ์ API๋ก ํ ์ ์๋ค๋ ๊ฑฐ์์. ์ด๋ฏธ Spark๋ก ๋ฐฐ์น ์ฒ๋ฆฌ๋ฅผ ํ๊ณ ์๋ค๋ฉด, ๊ฐ์ ์ฝ๋๋ฒ ์ด์ค๋ก ์คํธ๋ฆผ ์ฒ๋ฆฌ๋ ์ถ๊ฐํ ์ ์์ฃ . 2016๋
์ ๋์จ Structured Streaming์ ๋ ๋์ ์ฑ๋ฅ๊ณผ ์ฌ์ฉ์ฑ์ ์ ๊ณตํด์.
๊ทธ๋ฐ๋ฐ ์์งํ ๋งํ๋ฉด ใ
ใ
ใ
์ง์ง ์ค์๊ฐ์ด ํ์ํ ๊ฒฝ์ฐ(๋ฐ๋ฆฌ์ด ๋จ์ ์ง์ฐ)์๋ Flink๊ฐ ๋ ์ ํฉํ๊ณ , ๋ช ์ด ์ ๋์ ์ง์ฐ์ด ๊ด์ฐฎ๋ค๋ฉด Spark๊ฐ ๋ ํธํ ์ ์์ด์. ํนํ ๋จธ์ ๋ฌ๋ ํ์ดํ๋ผ์ธ๊ณผ ํตํฉํ ๋๋ Spark์ MLlib์ ํ์ฉํ ์ ์์ด์ ์ข์ฃ .
4๏ธโฃ ๋ฐ์ดํฐ ์ ์ฅ ๋ ์ด์ด (Data Storage Layer)
์ฒ๋ฆฌ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ์ฟผ๋ฆฌํ ์ ์๊ฒ ํ๋ ๋ ์ด์ด์์. ์ค์๊ฐ ๋ถ์์ ์ํด์๋ ๋น ๋ฅธ ์ฐ๊ธฐ์ ์ฝ๊ธฐ๊ฐ ๋ชจ๋ ์ค์ํ์ฃ !
์๊ณ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค (Time-Series Database)
์๊ฐ ์์๋ก ๋ฐ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๋ฐ ์ต์ ํ๋ DB์์. ๋ํ์ ์ผ๋ก:
โข InfluxDB: ์คํ์์ค ์๊ณ์ด DB์ ๋ํ์ฃผ์. ์ด๋น ์์ญ๋ง ๊ฑด์ ์ฐ๊ธฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์์ด์. ๋ชจ๋ํฐ๋ง, IoT ๋ฐ์ดํฐ ์ ์ฅ์ ๋ง์ด ์ฌ์ฉ๋์ฃ . InfluxQL์ด๋ผ๋ SQL๊ณผ ์ ์ฌํ ์ฟผ๋ฆฌ ์ธ์ด๋ฅผ ์ ๊ณตํด์ ๋ฐฐ์ฐ๊ธฐ ์ฌ์์.
โข TimescaleDB: PostgreSQL์ ๊ธฐ๋ฐ์ผ๋ก ๋ง๋ค์ด์ง ์๊ณ์ด DB. ๊ธฐ์กด PostgreSQL์ ๋ชจ๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์ผ๋ฉด์๋ ์๊ณ์ด ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ์ต์ ํ๋์ด ์์ด์. ๋ณต์กํ ์กฐ์ธ์ด๋ ํธ๋์ญ์
์ด ํ์ํ ๊ฒฝ์ฐ ์ ์ฉํ์ฃ .
โข Apache Druid: ์ค์๊ฐ ๋ถ์์ ํนํ๋ ์ปฌ๋ผ ๊ธฐ๋ฐ DB. OLAP ์ฟผ๋ฆฌ๋ฅผ ๋ฐ๋ฆฌ์ด ๋จ์๋ก ์ฒ๋ฆฌํ ์ ์์ด์. Netflix, Airbnb ๊ฐ์ ํ์ฌ๋ค์ด ์ค์๊ฐ ๋์๋ณด๋์ ์ฌ์ฉํ๊ณ ์์ฃ .
NoSQL ๋ฐ์ดํฐ๋ฒ ์ด์ค
์ ์ฐํ ์คํค๋ง์ ๋์ ํ์ฅ์ฑ์ด ํ์ํ ๊ฒฝ์ฐ NoSQL์ ์ฌ์ฉํด์:
โข Apache Cassandra: ๋ถ์ฐ ํ๊ฒฝ์์ ๋์ ๊ฐ์ฉ์ฑ๊ณผ ํ์ฅ์ฑ์ ์ ๊ณต. ์ฐ๊ธฐ ์ฑ๋ฅ์ด ํนํ ๋ฐ์ด๋์ ๋ก๊ทธ ๋ฐ์ดํฐ ์ ์ฅ์ ์ ํฉํด์. Netflix๋ ํ๋ฃจ์ 1์กฐ ๊ฑด ์ด์์ ์ด๋ฒคํธ๋ฅผ Cassandra์ ์ ์ฅํ๋ค๊ณ ํด์! ๐ฑ
โข MongoDB: ๋ฌธ์ ๊ธฐ๋ฐ NoSQL DB. JSON ํํ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ ์ข์์. ์คํค๋ง๊ฐ ์์ฃผ ๋ณ๊ฒฝ๋๋ ๊ฒฝ์ฐ๋ ๊ณ์ธต์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๋ค๋ฃฐ ๋ ์ ์ฉํ์ฃ .
โข Redis: ์ธ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ดํฐ ์ ์ฅ์. ์ด๊ณ ์ ์ฝ๊ธฐ/์ฐ๊ธฐ๊ฐ ๊ฐ๋ฅํด์ ์ค์๊ฐ ๋ฆฌ๋๋ณด๋, ์ธ์
๊ด๋ฆฌ, ์บ์ฑ ๋ฑ์ ์ฌ์ฉ๋ผ์. Redis Streams ๊ธฐ๋ฅ์ผ๋ก ๋ฉ์์ง ํ๋ก๋ ํ์ฉํ ์ ์์ด์.
์๊ณ์ด ๋ฐ์ดํฐ + ์ง๊ณ ์ฟผ๋ฆฌ ๋ง์ โ InfluxDB, Druid
๊ด๊ณํ ๊ธฐ๋ฅ ํ์ + ์๊ณ์ด โ TimescaleDB
์ด๊ณ ์ ์ฐ๊ธฐ + ๋ถ์ฐ ํ๊ฒฝ โ Cassandra
์ ์ฐํ ์คํค๋ง + ๋ณต์กํ ์ฟผ๋ฆฌ โ MongoDB
๋ฐ๋ฆฌ์ด ์๋ต + ์บ์ฑ โ Redis
์ค์ ๋ก๋ ์ฌ๋ฌ ์ ์ฅ์๋ฅผ ์กฐํฉํด์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์์. ์๋ฅผ ๋ค์ด ์ค์๊ฐ ๋์๋ณด๋๋ Redis๋ก, ์ฅ๊ธฐ ๋ถ์์ Druid๋ก ์ ์ฅํ๋ ์์ด์ฃ !
5๏ธโฃ ์๊ฐํ ๋ฐ ์๋ฆผ ๋ ์ด์ด (Visualization & Alerting Layer)
์ฒ๋ฆฌ๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ๋์ด ์ดํดํ ์ ์๊ฒ ๋ณด์ฌ์ฃผ๊ณ , ์ด์ ์ํฉ์ ์๋ ค์ฃผ๋ ๋ ์ด์ด์์. ์๋ฌด๋ฆฌ ์ข์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์์คํ
์ด ์์ด๋ ๊ฒฐ๊ณผ๋ฅผ ์ ๋๋ก ๋ณด์ฌ์ฃผ์ง ๋ชปํ๋ฉด ๋ฌด์ฉ์ง๋ฌผ์ด์ฃ ! ๐
์ค์๊ฐ ๋์๋ณด๋ ๋๊ตฌ:
โข Grafana: ๊ฐ์ฅ ์ธ๊ธฐ ์๋ ์คํ์์ค ์๊ฐํ ๋๊ตฌ. ๋ค์ํ ๋ฐ์ดํฐ ์์ค๋ฅผ ์ฐ๊ฒฐํ ์ ์๊ณ , ์๋ฆ๋ค์ด ๋์๋ณด๋๋ฅผ ์ฝ๊ฒ ๋ง๋ค ์ ์์ด์. ์ค์๊ฐ์ผ๋ก ์
๋ฐ์ดํธ๋๋ ์ฐจํธ๋ฅผ ๋ณด๋ฉด์ ์์คํ
์ํ๋ฅผ ๋ชจ๋ํฐ๋งํ ์ ์์ฃ . ์๋ฆผ ๊ธฐ๋ฅ๋ ๋ด์ฅ๋์ด ์์ด์ ์๊ณ๊ฐ์ ๋์ผ๋ฉด Slack์ด๋ ์ด๋ฉ์ผ๋ก ์๋ฆผ์ ๋ฐ์ ์ ์์ด์.
โข Kibana: Elasticsearch์ ํจ๊ป ์ฌ์ฉ๋๋ ์๊ฐํ ๋๊ตฌ. ๋ก๊ทธ ๋ถ์๊ณผ ๊ฒ์์ ํนํ๋์ด ์์ด์. ๋ณต์กํ ์ฟผ๋ฆฌ๋ฅผ ์๊ฐ์ ์ผ๋ก ๋ง๋ค ์ ์๊ณ , ์ค์๊ฐ ๋ก๊ทธ ์คํธ๋ฆผ์ ๋ณผ ์ ์๋ ๊ธฐ๋ฅ๋ ์์ฃ .
โข Apache Superset: Airbnb์์ ๋ง๋ ์คํ์์ค BI ๋๊ตฌ. SQL ๊ธฐ๋ฐ์ผ๋ก ๋ค์ํ ์ฐจํธ๋ฅผ ๋ง๋ค ์ ์๊ณ , ๋์๋ณด๋๋ฅผ ๊ณต์ ํ๊ธฐ ์ฌ์์. ์ต๊ทผ์๋ ์ค์๊ฐ ์ฟผ๋ฆฌ ์ฑ๋ฅ๋ ๋ง์ด ๊ฐ์ ๋์ด์.
์๋ฆผ ์์คํ
:
์ค์๊ฐ ์ฒ๋ฆฌ์ ํต์ฌ์ ๋ฌธ์ ๋ฅผ ๋น ๋ฅด๊ฒ ๊ฐ์งํ๊ณ ๋์ํ๋ ๊ฑฐ์์. ์๋ฆผ ์์คํ
์ ๋ค์๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ์ ๊ณตํด์ผ ํด์:
โข ์๊ณ๊ฐ ๊ธฐ๋ฐ ์๋ฆผ: CPU ์ฌ์ฉ๋ฅ ์ด 80%๋ฅผ ๋์ผ๋ฉด ์๋ฆผ
โข ์ด์ ํ์ง ์๋ฆผ: ๋จธ์ ๋ฌ๋์ผ๋ก ํ์์ ๋ค๋ฅธ ํจํด ๊ฐ์ง
โข ๋ณตํฉ ์กฐ๊ฑด ์๋ฆผ: ์ฌ๋ฌ ์กฐ๊ฑด์ด ๋์์ ๋ง์กฑ๋ ๋ ์๋ฆผ
โข ์๋ฆผ ์ฐ์ ์์: ์ฌ๊ฐ๋์ ๋ฐ๋ผ ๋ค๋ฅธ ์ฑ๋๋ก ์๋ฆผ
โข ์๋ฆผ ํผ๋ก ๋ฐฉ์ง: ๊ฐ์ ์๋ฆผ์ด ๋ฐ๋ณต๋์ง ์๋๋ก ์ ์ด
โ๏ธ ์คํธ๋ฆผ ์ฒ๋ฆฌ์ ํต์ฌ ๊ฐ๋ ๊ณผ ๋์ ๊ณผ์
๐ ์๊ฐ ๊ฐ๋ ์ ์ดํด
์คํธ๋ฆผ ์ฒ๋ฆฌ์์ ๊ฐ์ฅ ํท๊ฐ๋ฆฌ๋ ๊ฒ ์๊ฐ ๊ฐ๋
์ด์์. ์๊ฐ์ด ๋ญ ์ด๋ ต๋๊ณ ์? ใ
ใ
ใ
๋ถ์ฐ ์์คํ
์์๋ ์๊ฐ๋ณด๋ค ๋ณต์กํด์! โฐ
์ธ ๊ฐ์ง ์๊ฐ ๊ฐ๋
:
1) ์ด๋ฒคํธ ํ์ (Event Time)
๋ฐ์ดํฐ๊ฐ ์ค์ ๋ก ๋ฐ์ํ ์๊ฐ์ด์์. ์๋ฅผ ๋ค์ด ์ค๋งํธํฐ์์ ๋ฒํผ์ ํด๋ฆญํ ์๊ฐ์ด์ฃ . ์ด๊ฒ ๊ฐ์ฅ ์ ํํ ์๊ฐ์ด์ง๋ง, ๋คํธ์ํฌ ์ง์ฐ์ด๋ ์์คํ
์ฅ์ ๋ก ์ธํด ๋ฆ๊ฒ ๋์ฐฉํ ์ ์์ด์.
์ค์ ์ฌ๋ก: 2023๋
ํ ์ด์ปค๋จธ์ค ํ์ฌ์์ ๋ชจ๋ฐ์ผ ์ฑ ์ฌ์ฉ์์ ๊ตฌ๋งค ํจํด์ ๋ถ์ํ๋๋ฐ, ์งํ์ฒ ์์ ์ฃผ๋ฌธํ ๋ฐ์ดํฐ๊ฐ ์ง์์ผ๋ก ์ฌ๋ผ์จ ํ์์ผ ์ ์ก๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง์๋์. ์ด๋ฒคํธ ํ์์ ์ฌ์ฉํ์ง ์์๋ค๋ฉด "์งํ์ฒ ์์ ๊ตฌ๋งค๊ฐ ๋ง๋ค"๋ ์ธ์ฌ์ดํธ๋ฅผ ๋์ณค์ ๊ฑฐ์์.
2) ์ฒ๋ฆฌ ํ์ (Processing Time)
๋ฐ์ดํฐ๊ฐ ์คํธ๋ฆผ ์ฒ๋ฆฌ ์์คํ
์ ๋์ฐฉํด์ ์ฒ๋ฆฌ๋๋ ์๊ฐ์ด์์. ๊ตฌํํ๊ธฐ๋ ๊ฐ์ฅ ์ฝ์ง๋ง, ์์คํ
๋ถํ๋ ๋คํธ์ํฌ ์ํฉ์ ๋ฐ๋ผ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง ์ ์์ด์. ์ฌํ ๊ฐ๋ฅํ ๊ฒฐ๊ณผ๋ฅผ ์ป๊ธฐ ์ด๋ ต๋ค๋ ๋จ์ ์ด ์์ฃ .
3) ์ธ์ ์คํธ ํ์ (Ingestion Time)
๋ฐ์ดํฐ๊ฐ ๋ฉ์์ง ํ(์: Kafka)์ ๋ค์ด๊ฐ ์๊ฐ์ด์์. ์ด๋ฒคํธ ํ์๊ณผ ์ฒ๋ฆฌ ํ์์ ์ค๊ฐ ์ ๋ ๋๋ ๊ฐ๋
์ด์ฃ . Kafka๊ฐ ํ์์คํฌํ๋ฅผ ์ฐ์ด์ฃผ๊ธฐ ๋๋ฌธ์ ๋ณ๋ ์ค์ ์์ด ์ฌ์ฉํ ์ ์์ด์.
์ด๋ฒคํธ ํ์ ์ฌ์ฉ ๊ถ์ฅ:
โข ๊ธ์ต ๊ฑฐ๋, ์ฃผ๋ฌธ ์ฒ๋ฆฌ ๋ฑ ์ ํํ ์๊ฐ ์์๊ฐ ์ค์ํ ๊ฒฝ์ฐ
โข ๋ฆ๊ฒ ๋์ฐฉํ๋ ๋ฐ์ดํฐ(Late Data)๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌํด์ผ ํ๋ ๊ฒฝ์ฐ
โข ์ฌํ ๊ฐ๋ฅํ ๊ฒฐ๊ณผ๊ฐ ํ์ํ ๊ฒฝ์ฐ
์ฒ๋ฆฌ ํ์ ์ฌ์ฉ ๊ฐ๋ฅ:
โข ์ค์๊ฐ ๋ชจ๋ํฐ๋ง์ฒ๋ผ "์ง๊ธ ์ด ์๊ฐ"์ด ์ค์ํ ๊ฒฝ์ฐ
โข ๋ฐ์ดํฐ๊ฐ ๊ฑฐ์ ์ค์๊ฐ์ผ๋ก ๋์ฐฉํ๋ ๊ฒฝ์ฐ
โข ๊ตฌํ ๋ณต์ก๋๋ฅผ ๋ฎ์ถ๊ณ ์ถ์ ๊ฒฝ์ฐ
์ค๋ฌด์์๋ ๋๋ถ๋ถ ์ด๋ฒคํธ ํ์์ ์ฌ์ฉํ๋ ๊ฒ ์ข์์. ์ด๊ธฐ ๊ตฌํ์ ์กฐ๊ธ ๋ณต์กํ์ง๋ง, ๋์ค์ ๋ฌธ์ ๊ฐ ํจ์ฌ ์ ์ด์!
๐ช ์๋์ฐ ์ฐ์ฐ์ ์ดํด
๋ฌดํํ ํ๋ฅด๋ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ์ด๋ป๊ฒ ์ง๊ณํ ๊น์? ๋ฐ๋ก ์๋์ฐ(Window)๋ฅผ ์ฌ์ฉํ๋ ๊ฑฐ์์! ์๋์ฐ๋ ์คํธ๋ฆผ์ ์ ํํ ์กฐ๊ฐ์ผ๋ก ๋๋๋ ๋ฐฉ๋ฒ์ด์ฃ .
์ฃผ์ ์๋์ฐ ํ์
:
1) ํ
๋ธ๋ง ์๋์ฐ (Tumbling Window)
๊ณ ์ ๋ ํฌ๊ธฐ๋ก ๊ฒน์น์ง ์๊ฒ ๋๋๋ ์๋์ฐ์์. ์๋ฅผ ๋ค์ด 5๋ถ ํ
๋ธ๋ง ์๋์ฐ๋ 00:00-00:05, 00:05-00:10, 00:10-00:15 ์ด๋ฐ ์์ผ๋ก ๋๋์ฃ .
์ฌ์ฉ ์ฌ๋ก: "๋งค ์๊ฐ๋ง๋ค ์น์ฌ์ดํธ ๋ฐฉ๋ฌธ์ ์ ์ง๊ณ", "5๋ถ๋ง๋ค ํ๊ท ์จ๋ ๊ณ์ฐ"
2) ์ฌ๋ผ์ด๋ฉ ์๋์ฐ (Sliding Window)
์๋์ฐ๊ฐ ์ผ์ ๊ฐ๊ฒฉ์ผ๋ก ์ด๋ํ๋ฉด์ ๊ฒน์น ์ ์๋ ์๋์ฐ์์. ์๋ฅผ ๋ค์ด ํฌ๊ธฐ 10๋ถ, ์ฌ๋ผ์ด๋ 5๋ถ์ด๋ฉด 00:00-00:10, 00:05-00:15, 00:10-00:20 ์ด๋ ๊ฒ ๊ฒน์น๋ฉด์ ์ด๋ํด์.
์ฌ์ฉ ์ฌ๋ก: "์ต๊ทผ 10๋ถ๊ฐ์ ์ด๋ ํ๊ท ", "์ง๋ 1์๊ฐ ๋์์ ์ต๋๊ฐ์ 5๋ถ๋ง๋ค ์
๋ฐ์ดํธ"
3) ์ธ์
์๋์ฐ (Session Window)
ํ๋์ด ์๋ ์๊ฐ(Gap)์ผ๋ก ๊ตฌ๋ถ๋๋ ๋์ ์๋์ฐ์์. ์ฌ์ฉ์๊ฐ ํ๋ํ๋ ๋์์ ํ๋์ ์ธ์
์ผ๋ก ๋ฌถ์ด๊ณ , ์ผ์ ์๊ฐ ๋์ ํ๋์ด ์์ผ๋ฉด ์ธ์
์ด ์ข
๋ฃ๋ผ์.
์ฌ์ฉ ์ฌ๋ก: "์ฌ์ฉ์์ ์น์ฌ์ดํธ ๋ฐฉ๋ฌธ ์ธ์
๋ถ์", "๊ณ ๊ฐ ์๋ด ์ธ์
์ถ์ "
์ค์ ์์ ๋ฅผ ๋ณผ๊น์?
// Flink์์ ์ฌ๋ผ์ด๋ฉ ์๋์ฐ ์ฌ์ฉ ์์
DataStream<Tuple2<String, Integer>> clickStream = ...;
DataStream<Tuple3<String, Long, Integer>> result = clickStream
.keyBy(value -> value.f0) // ์ฌ์ฉ์ ID๋ก ๊ทธ๋ฃนํ
.window(SlidingEventTimeWindows.of(
Time.minutes(10), // ์๋์ฐ ํฌ๊ธฐ: 10๋ถ
Time.minutes(5) // ์ฌ๋ผ์ด๋ ๊ฐ๊ฒฉ: 5๋ถ
))
.aggregate(new ClickCountAggregator());
// ๊ฒฐ๊ณผ: ๊ฐ ์ฌ์ฉ์์ ์ต๊ทผ 10๋ถ๊ฐ ํด๋ฆญ ์๋ฅผ 5๋ถ๋ง๋ค ๊ณ์ฐ
๐ง ์ํฐ๋งํฌ์ ๋ฆ๊ฒ ๋์ฐฉํ๋ ๋ฐ์ดํฐ
์ด๋ฒคํธ ํ์์ ์ฌ์ฉํ ๋ ๊ฐ์ฅ ํฐ ๋ฌธ์ ๋ "์ธ์ ์๋์ฐ๋ฅผ ๋ซ์์ผ ํ๋๊ฐ?"์์. ๋คํธ์ํฌ ์ง์ฐ์ผ๋ก ๋ฐ์ดํฐ๊ฐ ๋ฆ๊ฒ ๋์ฐฉํ ์ ์๋๋ฐ, ๋ฌดํ์ ๊ธฐ๋ค๋ฆด ์๋ ์์์์? ๐ค
์ํฐ๋งํฌ(Watermark)์ ๊ฐ๋
:
์ํฐ๋งํฌ๋ "์ด ์๊ฐ ์ด์ ์ ๋ฐ์ดํฐ๋ ๋๋ถ๋ถ ๋์ฐฉํ๋ค"๋ ์ ํธ์์. ์๋ฅผ ๋ค์ด ์ํฐ๋งํฌ๊ฐ 10:05:00์ด๋ฉด, 10:05:00 ์ด์ ์ด๋ฒคํธ๋ ๊ฑฐ์ ๋ค ๋์ฐฉํ๋ค๊ณ ํ๋จํ๋ ๊ฑฐ์ฃ .
์ํฐ๋งํฌ ์์ฑ ์ ๋ต:
1) ๊ณ ์ ์ง์ฐ ์ํฐ๋งํฌ (Fixed Delay Watermark)
๊ฐ์ฅ ์ต๊ทผ ์ด๋ฒคํธ ํ์์์ ๊ณ ์ ๋ ์๊ฐ์ ๋บ ๊ฐ์ ์ํฐ๋งํฌ๋ก ์ฌ์ฉํด์. ์๋ฅผ ๋ค์ด 5์ด ์ง์ฐ์ ์ค์ ํ๋ฉด, ํ์ฌ ์๊ฐ์ด 10:00:10์ด๊ณ ๊ฐ์ฅ ์ต๊ทผ ์ด๋ฒคํธ๊ฐ 10:00:08์ด๋ฉด, ์ํฐ๋งํฌ๋ 10:00:03์ด ๋ผ์.
2) ๋ฐฑ๋ถ์์ ๊ธฐ๋ฐ ์ํฐ๋งํฌ (Percentile-based Watermark)
๊ณผ๊ฑฐ ๋ฐ์ดํฐ์ ์ง์ฐ ํจํด์ ๋ถ์ํด์ ์ํฐ๋งํฌ๋ฅผ ๋์ ์ผ๋ก ์กฐ์ ํด์. ์๋ฅผ ๋ค์ด 95%์ ๋ฐ์ดํฐ๊ฐ 5์ด ์ด๋ด์ ๋์ฐฉํ๋ค๋ฉด, 5์ด ์ง์ฐ์ ์ฌ์ฉํ๋ ์์ด์ฃ .
๋ฆ๊ฒ ๋์ฐฉํ๋ ๋ฐ์ดํฐ(Late Data) ์ฒ๋ฆฌ ๋ฐฉ๋ฒ:
โข ๋ฌด์ํ๊ธฐ: ๊ฐ์ฅ ๊ฐ๋จํ์ง๋ง ๋ฐ์ดํฐ ์์ค ๋ฐ์
โข ํ์ฉ ์ง์ฐ ์๊ฐ ์ค์ : ์๋์ฐ๊ฐ ๋ซํ ํ์๋ ์ผ์ ์๊ฐ ๋์ ๋ฆ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ ๊ฒฐ๊ณผ๋ฅผ ์
๋ฐ์ดํธ
โข ์ฌ์ด๋ ์์ํ: ๋ฆ์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๋ ์คํธ๋ฆผ์ผ๋ก ๋ถ๋ฆฌํด์ ๋์ค์ ์ฒ๋ฆฌ
์ค๋ฌด ํ: ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ํ์ฉ ์ง์ฐ ์๊ฐ์ ์ค์ ํ๋ ๊ฒ ์ข์์. Flink์์๋ allowedLateness() ๋ฉ์๋๋ก ์ฝ๊ฒ ์ค์ ํ ์ ์์ฃ .
// ๋ฆ๊ฒ ๋์ฐฉํ๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์์
DataStream<Event> events = ...;
SingleOutputStreamOperator<Result> result = events
.keyBy(Event::getUserId)
.window(TumblingEventTimeWindows.of(Time.minutes(5)))
.allowedLateness(Time.minutes(1)) // 1๋ถ๊น์ง ๋ฆ์ ๋ฐ์ดํฐ ํ์ฉ
.sideOutputLateData(lateDataTag) // ๊ทธ ์ดํ ๋ฐ์ดํฐ๋ ์ฌ์ด๋ ์์ํ์ผ๋ก
.aggregate(new MyAggregateFunction());
// ๋ฆ๊ฒ ๋์ฐฉํ ๋ฐ์ดํฐ ๋ณ๋ ์ฒ๋ฆฌ
DataStream<Event> lateEvents = result.getSideOutput(lateDataTag);
๐ฏ ์ ํํ ํ ๋ฒ ์ฒ๋ฆฌ (Exactly-Once Semantics)
๋ถ์ฐ ์์คํ
์์ ๊ฐ์ฅ ์ด๋ ค์ด ๋ฌธ์ ์ค ํ๋๊ฐ ๋ฉ์์ง ์ฒ๋ฆฌ ๋ณด์ฅ์ด์์. ์์คํ
์ฅ์ ๊ฐ ๋ฐ์ํ์ ๋ ๋ฉ์์ง๊ฐ ์ค๋ณต ์ฒ๋ฆฌ๋๊ฑฐ๋ ๋๋ฝ๋์ง ์๋๋ก ํ๋ ๊ฒ ์ ๋ง ์ด๋ ต๊ฑฐ๋ ์! ๐
์ธ ๊ฐ์ง ์ฒ๋ฆฌ ๋ณด์ฅ ์์ค:
1) At-Most-Once (์ต๋ ํ ๋ฒ)
๋ฉ์์ง๊ฐ ํ ๋ฒ ์ฒ๋ฆฌ๋๊ฑฐ๋ ์์ ์ฒ๋ฆฌ๋์ง ์์ ์ ์์ด์. ๊ฐ์ฅ ๋น ๋ฅด์ง๋ง ๋ฐ์ดํฐ ์์ค ๊ฐ๋ฅ์ฑ์ด ์์ฃ . ๋ก๊ทธ ์์ง์ฒ๋ผ ์ผ๋ถ ๋ฐ์ดํฐ ์์ค์ด ๊ด์ฐฎ์ ๊ฒฝ์ฐ์ ์ฌ์ฉํด์.
2) At-Least-Once (์ต์ ํ ๋ฒ)
๋ฉ์์ง๊ฐ ์ต์ ํ ๋ฒ์ ์ฒ๋ฆฌ๋์ง๋ง, ์ค๋ณต ์ฒ๋ฆฌ๋ ์ ์์ด์. ๋ง์ ์์คํ
์ด ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณตํ๋ ์์ค์ด์ฃ . ๋ฉฑ๋ฑ์ฑ(Idempotency)์ด ๋ณด์ฅ๋๋ ์ฐ์ฐ์ด๋ผ๋ฉด ๊ด์ฐฎ์์.
3) Exactly-Once (์ ํํ ํ ๋ฒ)
๋ฉ์์ง๊ฐ ์ ํํ ํ ๋ฒ๋ง ์ฒ๋ฆฌ๋ผ์. ๊ฐ์ฅ ์ด๋ ต์ง๋ง ๊ธ์ต ๊ฑฐ๋ ๊ฐ์ ์ค์ํ ๋ฐ์ดํฐ์๋ ํ์์ ์ด์ฃ . Flink๋ ์ฒดํฌํฌ์ธํธ์ 2๋จ๊ณ ์ปค๋ฐ(Two-Phase Commit)์ ํตํด ์ด๋ฅผ ๊ตฌํํด์.
Flink์ Exactly-Once ๊ตฌํ ์๋ฆฌ:
Flink๋ ์ฃผ๊ธฐ์ ์ผ๋ก ์ฒดํฌํฌ์ธํธ๋ฅผ ์์ฑํด์. ์ฒดํฌํฌ์ธํธ๋ ์ ์ฒด ์์คํ
์ ์ผ๊ด๋ ์ค๋
์ท์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋ผ์. ์ฅ์ ๊ฐ ๋ฐ์ํ๋ฉด ๊ฐ์ฅ ์ต๊ทผ ์ฒดํฌํฌ์ธํธ๋ก ๋ณต๊ตฌํ์ฃ .
์ฒดํฌํฌ์ธํธ ๊ณผ์ :
1. ์์ค์์ ๋ฐฐ๋ฆฌ์ด(Barrier)๋ฅผ ์์ฑํด์ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ์ฝ์
2. ๋ฐฐ๋ฆฌ์ด๊ฐ ๊ฐ ์คํผ๋ ์ดํฐ๋ฅผ ํต๊ณผํ๋ฉด์ ์ํ๋ฅผ ์ ์ฅ
3. ๋ชจ๋ ์ฑํฌ๊ฐ ๋ฐฐ๋ฆฌ์ด๋ฅผ ๋ฐ์ผ๋ฉด ์ฒดํฌํฌ์ธํธ ์๋ฃ
4. ์ฅ์ ๋ฐ์ ์ ๋ง์ง๋ง ์ฒดํฌํฌ์ธํธ๋ถํฐ ์ฌ์์
2024๋
๊ธฐ์ค์ผ๋ก Flink์ ์ฒดํฌํฌ์ธํธ ์ค๋ฒํค๋๋ ์ ์ฒด ์ฒ๋ฆฌ๋์ ์ฝ 5% ๋ฏธ๋ง์ด๋ผ๊ณ ํด์. ์ฑ๋ฅ ์ ํ๊ฐ ํฌ์ง ์์ผ๋ฉด์๋ ๊ฐ๋ ฅํ ๋ณด์ฅ์ ์ ๊ณตํ๋ ๊ฑฐ์ฃ !
์๋ฒฝํ Exactly-Once๋ ์ฌ์ค ๋ถ๊ฐ๋ฅํด์! ์ธ๋ถ ์์คํ (DB, ํ์ผ ์์คํ ๋ฑ)๊น์ง ํฌํจํ๋ฉด ๋์ฑ ์ด๋ ต์ฃ . ๊ทธ๋์ ์ค์ ๋ก๋:
โข ์คํธ๋ฆผ ์ฒ๋ฆฌ ๋ด๋ถ: Exactly-Once ๋ณด์ฅ
โข ์ธ๋ถ ์์คํ ์ฐ๊ธฐ: ํธ๋์ญ์ ์ง์ ์์คํ ์ฌ์ฉ ๋๋ ๋ฉฑ๋ฑ์ฑ ๋ณด์ฅ
์๋ฅผ ๋ค์ด Kafka, PostgreSQL ๊ฐ์ ํธ๋์ญ์ ์ง์ ์์คํ ์ ์ธ ๋๋ 2๋จ๊ณ ์ปค๋ฐ์ผ๋ก Exactly-Once๋ฅผ ๋ณด์ฅํ ์ ์์ด์. ํ์ง๋ง ์ผ๋ฐ ํ์ผ ์์คํ ์ด๋ REST API ํธ์ถ์ ์ด๋ ค์ธ ์ ์์ฃ .
๐ ๏ธ ์ค์ ์ํคํ ์ฒ ์ค๊ณ ํจํด
๐ ๋๋ค ์ํคํ ์ฒ (Lambda Architecture)
๋๋ค ์ํคํ
์ฒ๋ Nathan Marz๊ฐ 2011๋
์ ์ ์ํ ๋น
๋ฐ์ดํฐ ์ฒ๋ฆฌ ์ํคํ
์ฒ์์. ๋ฐฐ์น ๋ ์ด์ด์ ์คํผ๋ ๋ ์ด์ด๋ฅผ ๊ฒฐํฉํด์ ์ ํ์ฑ๊ณผ ์ค์๊ฐ์ฑ์ ๋ชจ๋ ์ก์ผ๋ ค๋ ์๋์ฃ ! ๐ฏ
๋๋ค ์ํคํ
์ฒ์ ์ธ ๊ฐ์ง ๋ ์ด์ด:
1) ๋ฐฐ์น ๋ ์ด์ด (Batch Layer)
๋ชจ๋ ์๋ณธ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ , ์ฃผ๊ธฐ์ ์ผ๋ก ์ ์ฒด ๋ฐ์ดํฐ์
์ ๋ํ ๋ฐฐ์น ๋ทฐ๋ฅผ ์์ฑํด์. ์ ํํ์ง๋ง ๋๋ ค์. Hadoop, Spark ๊ฐ์ ๋ฐฐ์น ์ฒ๋ฆฌ ์์คํ
์ ์ฌ์ฉํ์ฃ .
2) ์คํผ๋ ๋ ์ด์ด (Speed Layer)
์ต๊ทผ ๋ฐ์ดํฐ๋ง ์ค์๊ฐ์ผ๋ก ์ฒ๋ฆฌํด์ ๋น ๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ์ ๊ณตํด์. ๋ฐฐ์น ๋ ์ด์ด๊ฐ ์ฒ๋ฆฌํ์ง ๋ชปํ ์ต์ ๋ฐ์ดํฐ๋ฅผ ๋ณด์ํ๋ ์ญํ ์ด์ฃ . Flink, Storm ๊ฐ์ ์คํธ๋ฆผ ์ฒ๋ฆฌ ์์คํ
์ ์ฌ์ฉํด์.
3) ์๋น ๋ ์ด์ด (Serving Layer)
๋ฐฐ์น ๋ทฐ์ ์ค์๊ฐ ๋ทฐ๋ฅผ ํฉ์ณ์ ์ฟผ๋ฆฌ์ ์๋ตํด์. ์ฌ์ฉ์๋ ์ด ๋ ์ด์ด๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์กฐํํ์ฃ .
๋๋ค ์ํคํ
์ฒ์ ์ฅ๋จ์ :
์ฅ์ :
โข ๋ฐฐ์น ๋ ์ด์ด๋ก ์ ํ์ฑ ๋ณด์ฅ
โข ์คํผ๋ ๋ ์ด์ด๋ก ์ค์๊ฐ์ฑ ํ๋ณด
โข ์ฅ์ ๋ณต๊ตฌ๊ฐ ์ฉ์ด (๋ฐฐ์น ๋ ์ด์ด๊ฐ ๋ฐฑ์
์ญํ )
๋จ์ :
โข ๋ ๊ฐ์ ์ฒ๋ฆฌ ํ์ดํ๋ผ์ธ์ ์ ์งํด์ผ ํด์ ๋ณต์กํจ
โข ๊ฐ์ ๋ก์ง์ ๋ฐฐ์น์ ์คํธ๋ฆผ ๋ ๋ฒ ๊ตฌํํด์ผ ํจ
โข ์ด์ ๋น์ฉ์ด ๋์
์์งํ ๋งํ๋ฉด ใ
ใ
ใ
๋๋ค ์ํคํ
์ฒ๋ ์ด๋ก ์ ์ผ๋ก๋ ์ข์๋ฐ ์ค์ ๋ก ์ด์ํ๊ธฐ๊ฐ ์ ๋ง ํ๋ค์ด์. ๊ทธ๋์ ์์ฆ์ ์นดํ ์ํคํ
์ฒ๊ฐ ๋ ์ธ๊ธฐ ์์ฃ !
๐ ์นดํ ์ํคํ ์ฒ (Kappa Architecture)
์นดํ ์ํคํ
์ฒ๋ Jay Kreps(Kafka ์ฐฝ์์)๊ฐ ์ ์ํ ๋ ๋จ์ํ ์ํคํ
์ฒ์์. "๋ฐฐ์น ๋ ์ด์ด ์์ด ์คํธ๋ฆผ ์ฒ๋ฆฌ๋ง์ผ๋ก ๋ชจ๋ ๊ฑธ ํด๊ฒฐํ์!"๋ ์์ด๋์ด์ฃ . ๐ก
์นดํ ์ํคํ
์ฒ์ ํต์ฌ ์์น:
โข ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์ด๋ฒคํธ ์คํธ๋ฆผ์ผ๋ก ์ทจ๊ธ
โข ๋จ์ผ ์คํธ๋ฆผ ์ฒ๋ฆฌ ํ์ดํ๋ผ์ธ๋ง ์ ์ง
โข ์ฌ์ฒ๋ฆฌ๊ฐ ํ์ํ๋ฉด ์ฒ์๋ถํฐ ๋ค์ ์คํธ๋ฆผ ์ฒ๋ฆฌ
โข ๋ฉ์์ง ํ(Kafka)์ ์ถฉ๋ถํ ๊ธด ๋ณด๊ด ๊ธฐ๊ฐ ์ค์
์นดํ ์ํคํ
์ฒ์ ์๋ ๋ฐฉ์:
1. ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ Kafka์ ์ ์ฅ (์: 30์ผ ๋ณด๊ด)
2. ์คํธ๋ฆผ ์ฒ๋ฆฌ ์ ํ๋ฆฌ์ผ์ด์
์ด Kafka์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ ์ฒ๋ฆฌ
3. ๋ก์ง ๋ณ๊ฒฝ์ด ํ์ํ๋ฉด ์ ๋ฒ์ ์ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฐฐํฌ
4. ์ ์ ํ๋ฆฌ์ผ์ด์
์ด Kafka์ ์ฒ์๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๋ค์ ์ฝ์ด์ ์ฒ๋ฆฌ
5. ์ ๊ฒฐ๊ณผ๊ฐ ์ค๋น๋๋ฉด ํธ๋ํฝ์ ์ ๋ฒ์ ์ผ๋ก ์ ํ
์นดํ vs ๋๋ค ๋น๊ต:
| ํน์ฑ | ๋๋ค ์ํคํ ์ฒ | ์นดํ ์ํคํ ์ฒ |
|---|---|---|
| ๋ณต์ก๋ | ๋์ (๋ ๊ฐ ํ์ดํ๋ผ์ธ) | ๋ฎ์ (๋จ์ผ ํ์ดํ๋ผ์ธ) |
| ์ ์ง๋ณด์ | ์ด๋ ค์ | ์ฌ์ |
| ์ง์ฐ ์๊ฐ | ๋ฐฐ์น: ๋์, ์คํธ๋ฆผ: ๋ฎ์ | ์ผ๊ด๋๊ฒ ๋ฎ์ |
| ์ ํ์ฑ | ๋ฐฐ์น ๋ ์ด์ด๋ก ๋ณด์ฅ | ์ฌ์ฒ๋ฆฌ๋ก ๋ณด์ฅ |
| ๋น์ฉ | ๋์ | ์ค๊ฐ |
| ์ ํฉํ ๊ฒฝ์ฐ | ๋ณต์กํ ๋ฐฐ์น ๋ถ์ ํ์ | ๋๋ถ๋ถ์ ์ค์๊ฐ ์ฒ๋ฆฌ |
2024๋ ํธ๋ ๋: ์ต๊ทผ ์กฐ์ฌ์ ๋ฐ๋ฅด๋ฉด ์๋ก ๊ตฌ์ถ๋๋ ์ค์๊ฐ ์ฒ๋ฆฌ ์์คํ ์ ์ฝ 70%๊ฐ ์นดํ ์ํคํ ์ฒ๋ฅผ ์ฑํํ๊ณ ์๋์. ๋จ์ํจ์ด ์ต๊ณ ์ฃ ! ใ ใ
๐ ์ด๋ฒคํธ ์์ฑ (Event Sourcing)
์ด๋ฒคํธ ์์ฑ์ ์ ํ๋ฆฌ์ผ์ด์
์ ์ํ ๋ณํ๋ฅผ ์ด๋ฒคํธ์ ์ํ์ค๋ก ์ ์ฅํ๋ ํจํด์ด์์. ํ์ฌ ์ํ๋ง ์ ์ฅํ๋ ๊ฒ ์๋๋ผ, ๊ทธ ์ํ์ ์ด๋ฅด๊ธฐ๊น์ง์ ๋ชจ๋ ๋ณํ๋ฅผ ๊ธฐ๋กํ๋ ๊ฑฐ์ฃ ! ๐
์ด๋ฒคํธ ์์ฑ์ ํต์ฌ ๊ฐ๋
:
์ ํต์ ์ธ ๋ฐฉ์์์๋ "์ฌ์ฉ์ ์์ก: 10,000์"์ฒ๋ผ ํ์ฌ ์ํ๋ง ์ ์ฅํด์. ํ์ง๋ง ์ด๋ฒคํธ ์์ฑ์์๋:
โข "๊ณ์ข ๊ฐ์ค: 0์"
โข "์
๊ธ: +10,000์"
โข "์ถ๊ธ: -3,000์"
โข "์
๊ธ: +3,000์"
์ด๋ฐ ์์ผ๋ก ๋ชจ๋ ์ด๋ฒคํธ๋ฅผ ์ ์ฅํ๊ณ , ํ์ํ ๋ ์ด๋ฒคํธ๋ฅผ ์ฌ์(Replay)ํด์ ํ์ฌ ์ํ๋ฅผ ๊ณ์ฐํด์.
์ด๋ฒคํธ ์์ฑ์ ์ฅ์ :
โข ์๋ฒฝํ ๊ฐ์ฌ ๋ก๊ทธ: ๋ชจ๋ ๋ณํ๊ฐ ๊ธฐ๋ก๋์ด ์์ด์ "์ธ์ , ์ ์ด๋ ๊ฒ ๋๋์ง" ์ถ์ ๊ฐ๋ฅ
โข ์๊ฐ ์ฌํ: ๊ณผ๊ฑฐ ํน์ ์์ ์ ์ํ๋ฅผ ์ฌ๊ตฌ์ฑํ ์ ์์
โข ์ด๋ฒคํธ ์ฌ์: ์๋ก์ด ๋ทฐ๋ ํ๋ก์ ์
์ ๋ง๋ค ๋ ์ด๋ฒคํธ๋ฅผ ๋ค์ ์ฌ์ํ๋ฉด ๋จ
โข ๋๋ฒ๊น
์ฉ์ด: ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ์ ๋ ์ด๋ฒคํธ๋ฅผ ์ฌ์ํด์ ์ฌํ ๊ฐ๋ฅ
์ด๋ฒคํธ ์์ฑ์ ๋จ์ :
โข ์ด๋ฒคํธ๊ฐ ๊ณ์ ์์ฌ์ ์คํ ๋ฆฌ์ง ๋น์ฉ ์ฆ๊ฐ
โข ํ์ฌ ์ํ๋ฅผ ์ป์ผ๋ ค๋ฉด ์ด๋ฒคํธ๋ฅผ ์ฌ์ํด์ผ ํด์ ๋๋ฆด ์ ์์
โข ์ด๋ฒคํธ ์คํค๋ง ๋ณ๊ฒฝ์ด ์ด๋ ค์
โข ํ์ต ๊ณก์ ์ด ๊ฐํ๋ฆ
์ค๋ฌด์์๋ ์ด๋ฒคํธ ์์ฑ๊ณผ CQRS(Command Query Responsibility Segregation)๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์์. ์ฐ๊ธฐ๋ ์ด๋ฒคํธ๋ก ํ๊ณ , ์ฝ๊ธฐ๋ ์ต์ ํ๋ ๋ทฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฑฐ์ฃ !
์ํ ์์คํ : ๋ชจ๋ ๊ฑฐ๋ ๋ด์ญ์ ์ด๋ฒคํธ๋ก ์ ์ฅ. ๊ท์ ์ค์์ ๊ฐ์ฌ์ ํ์์
์ด์ปค๋จธ์ค: ์ฃผ๋ฌธ ์ํ ๋ณํ๋ฅผ ์ด๋ฒคํธ๋ก ์ถ์ . "์ฃผ๋ฌธ ์์ฑ โ ๊ฒฐ์ ์๋ฃ โ ๋ฐฐ์ก ์์ โ ๋ฐฐ์ก ์๋ฃ"
๊ฒ์: ํ๋ ์ด์ด์ ๋ชจ๋ ํ๋์ ์ด๋ฒคํธ๋ก ๊ธฐ๋ก. ์นํ ํ์ง์ ๋ฆฌํ๋ ์ด ๊ธฐ๋ฅ์ ํ์ฉ
ํ์ ๋๊ตฌ: ๋ฌธ์ ํธ์ง ์ด๋ ฅ์ ์ด๋ฒคํธ๋ก ์ ์ฅ. ๋ฒ์ ๊ด๋ฆฌ์ ์ถฉ๋ ํด๊ฒฐ์ ์ฌ์ฉ
์ฌ๋ฅ๋ท ๊ฐ์ ํ๋ซํผ์์๋ ๊ฑฐ๋ ๋ด์ญ, ๋ฆฌ๋ทฐ ์์ฑ, ํฌ์ธํธ ์ ๋ฆฝ ๋ฑ์ ์ด๋ฒคํธ ์์ฑ์ผ๋ก ๊ด๋ฆฌํ๋ฉด ํฌ๋ช ์ฑ๊ณผ ์ ๋ขฐ์ฑ์ ๋์ผ ์ ์์ด์!
๐ CQRS ํจํด
CQRS(Command Query Responsibility Segregation)๋ ์ฝ๊ธฐ์ ์ฐ๊ธฐ๋ฅผ ๋ถ๋ฆฌํ๋ ํจํด์ด์์. ์ ํต์ ์ผ๋ก๋ ํ๋์ ๋ชจ๋ธ๋ก ์ฝ๊ธฐ์ ์ฐ๊ธฐ๋ฅผ ๋ชจ๋ ์ฒ๋ฆฌํ๋๋ฐ, CQRS๋ ์ด๋ฅผ ๋ถ๋ฆฌํ์๋ ๊ฑฐ์ฃ ! โ๏ธ
CQRS์ ํต์ฌ ์์ด๋์ด:
์ปค๋งจ๋ ๋ชจ๋ธ (Command Model):
โข ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๋ ์์
๋ด๋น
โข ๋น์ฆ๋์ค ๋ก์ง๊ณผ ๊ฒ์ฆ ํฌํจ
โข ์ ๊ทํ๋ ์คํค๋ง ์ฌ์ฉ
โข ์: "์ฃผ๋ฌธ ์์ฑ", "์ฌ๊ณ ๊ฐ์", "๊ฒฐ์ ์ฒ๋ฆฌ"
์ฟผ๋ฆฌ ๋ชจ๋ธ (Query Model):
โข ๋ฐ์ดํฐ๋ฅผ ์ฝ๋ ์์
๋ด๋น
โข ์ฝ๊ธฐ์ ์ต์ ํ๋ ๋น์ ๊ทํ ์คํค๋ง
โข ์ฌ๋ฌ ๊ฐ์ ์ฝ๊ธฐ ๋ชจ๋ธ ๊ฐ๋ฅ
โข ์: "์ฃผ๋ฌธ ๋ชฉ๋ก ์กฐํ", "๋์๋ณด๋ ํต๊ณ", "๊ฒ์ ๊ฒฐ๊ณผ"
CQRS + ์ด๋ฒคํธ ์์ฑ ์กฐํฉ:
์ด ๋ ํจํด์ ํจ๊ป ์ฌ์ฉํ๋ฉด ์๋์ง๊ฐ ์์ฒญ๋์!
1. ์ปค๋งจ๋๊ฐ ๋ค์ด์ค๋ฉด ์ด๋ฒคํธ๋ฅผ ์์ฑํด์ ์ด๋ฒคํธ ์คํ ์ด์ ์ ์ฅ
2. ์ด๋ฒคํธ ์คํธ๋ฆผ์ ๊ตฌ๋
ํ๋ ์ฌ๋ฌ ํ๋ก์ ํฐ(Projector)๊ฐ ๊ฐ์์ ์ฝ๊ธฐ ๋ชจ๋ธ์ ์
๋ฐ์ดํธ
3. ์ฟผ๋ฆฌ๋ ์ต์ ํ๋ ์ฝ๊ธฐ ๋ชจ๋ธ์์ ๋น ๋ฅด๊ฒ ์๋ต
์๋ฅผ ๋ค์ด ์ด์ปค๋จธ์ค์์:
โข ์ฃผ๋ฌธ ์ด๋ฒคํธ โ "์ฃผ๋ฌธ ๋ชฉ๋ก ๋ทฐ", "์ฌ๊ณ ํํฉ ๋ทฐ", "๋งค์ถ ํต๊ณ ๋ทฐ" ๋ฑ ์ฌ๋ฌ ๋ทฐ๋ฅผ ๋์์ ์
๋ฐ์ดํธ
โข ๊ฐ ๋ทฐ๋ ์์ ์ ์ฉ๋์ ๋ง๊ฒ ์ต์ ํ๋ ์คํค๋ง ์ฌ์ฉ
โข ์๋ก์ด ๋ทฐ๊ฐ ํ์ํ๋ฉด ์ด๋ฒคํธ๋ฅผ ์ฌ์ํด์ ์์ฑ
๐ ์ค์ ๊ตฌํ ์ฌ๋ก์ ๋ฒ ์คํธ ํ๋ํฐ์ค
๐ณ ์ฌ๋ก 1: ์ค์๊ฐ ์ฌ๊ธฐ ํ์ง ์์คํ
๊ธ์ต๊ถ์์ ๊ฐ์ฅ ์ค์ํ ์ค์๊ฐ ์ฒ๋ฆฌ ์ฌ๋ก ์ค ํ๋๊ฐ ์ฌ๊ธฐ ํ์ง์์. ์ ์ฉ์นด๋ ๊ฑฐ๋๊ฐ ๋ฐ์ํ๋ ์๊ฐ ์ฌ๊ธฐ ์ฌ๋ถ๋ฅผ ํ๋จํด์ผ ํ๋๊น์! ๐
์์คํ
์๊ตฌ์ฌํญ:
โข ๊ฑฐ๋ ๋ฐ์ ํ 100ms ์ด๋ด์ ์ฌ๊ธฐ ์ฌ๋ถ ํ๋จ
โข ์ด๋น ์๋ง ๊ฑด์ ๊ฑฐ๋ ์ฒ๋ฆฌ
โข ์คํ(False Positive)๊ณผ ๋ฏธํ(False Negative) ์ต์ํ
โข ์๋ก์ด ์ฌ๊ธฐ ํจํด์ ๋น ๋ฅด๊ฒ ๋์
์ํคํ
์ฒ ๊ตฌ์ฑ:
1) ๋ฐ์ดํฐ ์์ง:
โข ์นด๋ ๊ฒฐ์ ๋จ๋ง๊ธฐ, ์จ๋ผ์ธ ๊ฒฐ์ ๊ฒ์ดํธ์จ์ด์์ ๊ฑฐ๋ ๋ฐ์ดํฐ ์์ง
โข Kafka๋ก ์ค์๊ฐ ์คํธ๋ฆฌ๋ฐ (ํํฐ์
: ์นด๋ ๋ฒํธ ํด์๊ฐ ๊ธฐ์ค)
โข ์ด๋น ์ฝ 50,000๊ฑด์ ๊ฑฐ๋ ์ฒ๋ฆฌ
2) ์ค์๊ฐ ํน์ง ์ถ์ถ:
Flink๋ก ๋ค์๊ณผ ๊ฐ์ ํน์ง๋ค์ ์ค์๊ฐ์ผ๋ก ๊ณ์ฐํด์:
โข ์ต๊ทผ 1์๊ฐ ๋์์ ๊ฑฐ๋ ํ์
โข ์ต๊ทผ 24์๊ฐ ๋์์ ์ด ๊ฑฐ๋ ๊ธ์ก
โข ํ์์ ๋ค๋ฅธ ์ง์ญ์์์ ๊ฑฐ๋ ์ฌ๋ถ
โข ์งง์ ์๊ฐ ๋ด ์ฌ๋ฌ ์ฅ์์์์ ๊ฑฐ๋ (๋ฌผ๋ฆฌ์ ์ผ๋ก ๋ถ๊ฐ๋ฅํ ํจํด)
โข ํ์ ๊ฑฐ๋ ํจํด๊ณผ์ ํธ์ฐจ
3) ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ ์ ์ฉ:
โข ์ค์๊ฐ์ผ๋ก ์ถ์ถ๋ ํน์ง์ ML ๋ชจ๋ธ์ ์
๋ ฅ
โข Gradient Boosting ๋ชจ๋ธ๋ก ์ฌ๊ธฐ ํ๋ฅ ๊ณ์ฐ
โข ๋ชจ๋ธ์ ๋งค์ผ ๋ฐค ์๋ก์ด ๋ฐ์ดํฐ๋ก ์ฌํ์ต
โข A/B ํ
์คํธ๋ก ์ ๋ชจ๋ธ ์ฑ๋ฅ ๊ฒ์ฆ ํ ๋ฐฐํฌ
4) ์์ฌ๊ฒฐ์ ๋ฐ ์ก์
:
โข ์ฌ๊ธฐ ํ๋ฅ ์ด ๋์ผ๋ฉด (์: 80% ์ด์) ๊ฑฐ๋ ์ฐจ๋จ
โข ์ค๊ฐ ํ๋ฅ ์ด๋ฉด (์: 50-80%) ์ถ๊ฐ ์ธ์ฆ ์์ฒญ
โข ๋ฎ์ ํ๋ฅ ์ด๋ฉด ๊ฑฐ๋ ์น์ธ
โข ๋ชจ๋ ๊ฒฐ์ ์ ๋ก๊ทธ๋ก ๊ธฐ๋กํ์ฌ ๋์ค์ ๋ถ์
์ค์ ์ฑ๊ณผ:
ํ ๊ธ๋ก๋ฒ ์นด๋์ฌ์ ์ฌ๋ก๋ฅผ ๋ณด๋ฉด, ์ค์๊ฐ ์ฌ๊ธฐ ํ์ง ์์คํ
๋์
ํ:
โข ์ฌ๊ธฐ ํ์ง์จ 45% ํฅ์
โข ์คํ๋ฅ 30% ๊ฐ์
โข ํ๊ท ์๋ต ์๊ฐ 85ms
โข ์ฐ๊ฐ ์ฝ 1์ต ๋ฌ๋ฌ์ ์ฌ๊ธฐ ์์ค ๋ฐฉ์ง
์ง์ง ๋๋ฐ์ด์ฃ ? ใ
ใ
ใ
์ค์๊ฐ ์ฒ๋ฆฌ์ ์๋ ฅ์ ๋ณด์ฌ์ฃผ๋ ์ฌ๋ก์์!
// Flink๋ก ๊ตฌํํ ์ฌ๊ธฐ ํ์ง ํน์ง ์ถ์ถ ์์
DataStream<Transaction> transactions = ...;
DataStream<FraudFeatures> features = transactions
.keyBy(Transaction::getCardNumber)
.window(SlidingEventTimeWindows.of(Time.hours(1), Time.minutes(5)))
.aggregate(new FraudFeatureAggregator());
// ํน์ง ๊ณ์ฐ ๋ก์ง
public class FraudFeatureAggregator
implements AggregateFunction<Transaction, FeatureAccumulator, FraudFeatures> {
@Override
public FraudFeatures getResult(FeatureAccumulator acc) {
return new FraudFeatures(
acc.transactionCount,
acc.totalAmount,
acc.uniqueLocations.size(),
calculateVelocity(acc.locations, acc.timestamps),
calculateDeviation(acc.amounts, acc.historicalAverage)
);
}
}
๐บ ์ฌ๋ก 2: Netflix์ ์ค์๊ฐ ์ถ์ฒ ์์คํ
Netflix๋ ์ ์ธ๊ณ 2์ต ๋ช
์ด์์ ์ฌ์ฉ์์๊ฒ ๊ฐ์ธํ๋ ์ฝํ
์ธ ๋ฅผ ์ถ์ฒํ๋๋ฐ, ์ด๊ฒ ๋ค ์ค์๊ฐ ์คํธ๋ฆผ ์ฒ๋ฆฌ ๋๋ถ์ด์์! ๐ฌ
Netflix์ ์ค์๊ฐ ์ฒ๋ฆฌ ๊ท๋ชจ:
โข ์ด๋น ์ฝ 500๋ง ๊ฐ์ ์ด๋ฒคํธ ์ฒ๋ฆฌ
โข ํ๋ฃจ 4์กฐ ๊ฐ ์ด์์ ์ด๋ฒคํธ
โข ์๋ฐฑ ๊ฐ์ Kafka ํด๋ฌ์คํฐ ์ด์
โข ํํ๋ฐ์ดํธ ๊ท๋ชจ์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ
์ค์๊ฐ ์ถ์ฒ ํ์ดํ๋ผ์ธ:
1) ์ด๋ฒคํธ ์์ง:
์ฌ์ฉ์์ ๋ชจ๋ ํ๋์ ์ค์๊ฐ์ผ๋ก ์์งํด์:
โข ์์ ์ฌ์, ์ผ์์ ์ง, ๋๊ฐ๊ธฐ
โข ๊ฒ์ ์ฟผ๋ฆฌ
โข ํ์ ์
๋ ฅ
โข ๋ง์ฐ์ค ํธ๋ฒ (์ด๋ค ์ธ๋ค์ผ์ ๊ด์ฌ์ ๋ณด์ด๋์ง)
โข ์์ฒญ ์๋ฃ์จ
2) ์ค์๊ฐ ํน์ง ์
๋ฐ์ดํธ:
Flink์ Spark Streaming์ผ๋ก ์ฌ์ฉ์ ํ๋กํ์ ์ค์๊ฐ์ผ๋ก ์
๋ฐ์ดํธํด์:
โข ์ ํธ ์ฅ๋ฅด ์
๋ฐ์ดํธ
โข ์์ฒญ ํจํด ๋ถ์ (์ฃผ๋ง vs ํ์ผ, ๋ฎ vs ๋ฐค)
โข ์ต๊ทผ ๊ด์ฌ์ฌ ์ถ์
โข ์ ์ฌ ์ฌ์ฉ์ ๊ทธ๋ฃน ์ฌ๊ณ์ฐ
3) ์ค์๊ฐ ์ถ์ฒ ์์ฑ:
โข ์ฌ์ฉ์๊ฐ ์ฑ์ ์ด ๋๋ง๋ค ์ค์๊ฐ์ผ๋ก ์ถ์ฒ ๋ชฉ๋ก ์์ฑ
โข A/B ํ
์คํธ๋ก ์ฌ๋ฌ ์ถ์ฒ ์๊ณ ๋ฆฌ์ฆ ๋์ ์คํ
โข ์ปจํ
์คํธ ๊ณ ๋ ค (์๊ฐ๋, ๋๋ฐ์ด์ค, ์์น)
โข ๊ฐ์ธํ๋ ์ธ๋ค์ผ ์ ํ
4) ํผ๋๋ฐฑ ๋ฃจํ:
โข ์ถ์ฒ ๊ฒฐ๊ณผ์ ๋ํ ์ฌ์ฉ์ ๋ฐ์์ ์ฆ์ ์์ง
โข ํด๋ฆญ๋ฅ , ์์ฒญ ์๊ฐ ๋ฑ์ ์ค์๊ฐ์ผ๋ก ๋ถ์
โข ์ฑ๊ณผ๊ฐ ๋ฎ์ ์ถ์ฒ์ ์ฆ์ ๊ต์ฒด
โข ์จ๋ผ์ธ ํ์ต์ผ๋ก ๋ชจ๋ธ ์ง์์ ๊ฐ์
Netflix์ ๊ธฐ์ ์คํ:
โข ๋ฉ์์ง ํ: Apache Kafka
โข ์คํธ๋ฆผ ์ฒ๋ฆฌ: Apache Flink, Spark Streaming
โข ์ ์ฅ์: Cassandra, Elasticsearch, Redis
โข ๋ชจ๋ํฐ๋ง: Atlas (์์ฒด ๊ฐ๋ฐ)
โข ์ค์ผ์คํธ๋ ์ด์
: Kubernetes
Netflix๋ ์ค์๊ฐ ์ฒ๋ฆฌ ๋๋ถ์ ์ฌ์ฉ์์ 75% ์ด์์ด ์ถ์ฒ ์ฝํ
์ธ ๋ฅผ ์์ฒญํ๋ค๊ณ ํด์. ์ถ์ฒ ์์คํ
์ด ์์๋ค๋ฉด Netflix๋ ์ง๊ธ์ฒ๋ผ ์ฑ๊ณตํ์ง ๋ชปํ์ ๊ฑฐ์์!
1. ์๊ฒ ์์ํ๊ณ ์ ์ง์ ์ผ๋ก ํ์ฅ: Netflix๋ ์ฒ์๋ถํฐ ์ด๋ ๊ฒ ํฐ ๊ท๋ชจ๋ ์๋์์ด์. ์์ ํ์ผ๋ฟ ํ๋ก์ ํธ๋ก ์์ํด์ ๊ฒ์ฆ ํ ํ์ฅํ์ฃ .
2. ์คํจ๋ฅผ ์ ์ ๋ก ์ค๊ณ: ๋ถ์ฐ ์์คํ ์ ์ธ์ ๋ ์คํจํ ์ ์์ด์. Netflix๋ Chaos Engineering์ผ๋ก ์ผ๋ถ๋ฌ ์ฅ์ ๋ฅผ ์ผ์ผ์ผ์ ์์คํ ์ ํ ์คํธํด์.
3. ๊ด์ฐฐ ๊ฐ๋ฅ์ฑ(Observability)์ด ํต์ฌ: ์๋ฐฑ ๊ฐ์ ๋ง์ดํฌ๋ก์๋น์ค๊ฐ ํ๋ ฅํ๋ ํ๊ฒฝ์์๋ ๋ฌด์จ ์ผ์ด ์ผ์ด๋๋์ง ๋ณผ ์ ์์ด์ผ ํด์. ๋ก๊น , ๋ฉํธ๋ฆญ, ํธ๋ ์ด์ฑ์ด ํ์์ฃ .
4. ์ง์์ ์ธ ์คํ: A/B ํ ์คํธ๋ก ๋ชจ๋ ๋ณ๊ฒฝ์ฌํญ์ ๊ฒ์ฆํด์. ๋ฐ์ดํฐ ๊ธฐ๋ฐ ์์ฌ๊ฒฐ์ ์ด ์ค์ํ์ฃ !
๐ญ ์ฌ๋ก 3: ์ค๋งํธ ํฉํ ๋ฆฌ์ IoT ๋ชจ๋ํฐ๋ง
์ ์กฐ์
์์๋ ์ค์๊ฐ ์คํธ๋ฆผ ์ฒ๋ฆฌ๊ฐ ํ๋ช
์ ์ผ์ผํค๊ณ ์์ด์. ์์ฒ ๊ฐ์ ์ผ์์์ ๋ฐ์ดํฐ๋ฅผ ์์งํด์ ์ค๋น ๊ณ ์ฅ์ ์์ธกํ๊ณ ์์ฐ ํจ์จ์ ์ต์ ํํ๋ ๊ฑฐ์ฃ ! ๐ญ
์ค๋งํธ ํฉํ ๋ฆฌ ๋ชจ๋ํฐ๋ง ์์คํ
:
1) ์ผ์ ๋ฐ์ดํฐ ์์ง:
โข ์จ๋, ์ง๋, ์๋ ฅ, ์ ๋ ฅ ์๋น ๋ฑ ๋ค์ํ ์ผ์
โข ์ผ์๋น ์ด๋น 10-100ํ ๋ฐ์ดํฐ ์ ์ก
โข ๊ณต์ฅ ํ๋์ ์์ฒ~์๋ง ๊ฐ์ ์ผ์
โข MQTT ํ๋กํ ์ฝ๋ก ๋ฐ์ดํฐ ์ ์ก
2) ์ฃ์ง ์ปดํจํ
:
๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ํด๋ผ์ฐ๋๋ก ๋ณด๋ด๋ฉด ๋คํธ์ํฌ ๋น์ฉ์ด ๋๋ฌด ๋์์. ๊ทธ๋์ ๊ณต์ฅ ๋ด๋ถ์ ์ฃ์ง ์๋ฒ๋ฅผ ๋๊ณ 1์ฐจ ์ฒ๋ฆฌ๋ฅผ ํด์:
โข ์ด์์น ํํฐ๋ง
โข ๋ฐ์ดํฐ ์์ถ
โข ๊ฐ๋จํ ์ง๊ณ (1๋ถ ํ๊ท ๊ฐ ๋ฑ)
โข ๊ธด๊ธ ์๋ฆผ์ ์ฆ์ ์ฒ๋ฆฌ
3) ํด๋ผ์ฐ๋ ์คํธ๋ฆผ ์ฒ๋ฆฌ:
์ฃ์ง์์ ์ ์ฒ๋ฆฌ๋ ๋ฐ์ดํฐ๋ฅผ ํด๋ผ์ฐ๋๋ก ๋ณด๋ด์ ๊ณ ๊ธ ๋ถ์์ ์ํํด์:
โข ์ฌ๋ฌ ์ผ์ ๋ฐ์ดํฐ ์๊ด๊ด๊ณ ๋ถ์
โข ๋จธ์ ๋ฌ๋์ผ๋ก ์ค๋น ๊ณ ์ฅ ์์ธก
โข ์์ฐ ๋ผ์ธ ์ ์ฒด ์ต์ ํ
โข ํ์ง ์ด์ ํ์ง
4) ์์ธก ์ ๋น (Predictive Maintenance):
์ค์๊ฐ ๋ฐ์ดํฐ์ ๋จธ์ ๋ฌ๋์ ๊ฒฐํฉํด์ ์ค๋น ๊ณ ์ฅ์ ๋ฏธ๋ฆฌ ์์ธกํด์:
โข ์ง๋ ํจํด ๋ณํ๋ก ๋ฒ ์ด๋ง ๋ง๋ชจ ๊ฐ์ง
โข ์จ๋ ์์น์ผ๋ก ๊ณผ์ด ์ํ ์์ธก
โข ์ ๋ ฅ ์๋น ํจํด์ผ๋ก ํจ์จ ์ ํ ํ์
โข ๊ณ ์ฅ ๋ฐ์ 2-4์ฃผ ์ ์ ์๋ฆผ
์ค์ ํจ๊ณผ:
ํ ์๋์ฐจ ๋ถํ ์ ์กฐ์ฌ์ ์ฌ๋ก:
โข ๊ณํ๋์ง ์์ ๋ค์ดํ์ 40% ๊ฐ์
โข ์ ์ง๋ณด์ ๋น์ฉ 25% ์ ๊ฐ
โข ์์ฐ ํจ์จ 15% ํฅ์
โข ์ ํ ๋ถ๋๋ฅ 30% ๊ฐ์
โข ํฌ์ ํ์ ๊ธฐ๊ฐ 18๊ฐ์
์ด ์ ๋๋ฉด ํฌ์ํ ๋งํ์ฃ ? ใ
ใ
๐ฎ ์ฌ๋ก 4: ์จ๋ผ์ธ ๊ฒ์์ ์ค์๊ฐ ๋งค์นญ ์์คํ
์จ๋ผ์ธ ๊ฒ์์์ ํ๋ ์ด์ด๋ฅผ ๋น ๋ฅด๊ณ ๊ณต์ ํ๊ฒ ๋งค์นญํ๋ ๊ฒ๋ ์ค์๊ฐ ์คํธ๋ฆผ ์ฒ๋ฆฌ์ ์ค์ํ ์์ฉ ๋ถ์ผ์์! ๐ฎ
๊ฒ์ ๋งค์นญ ์์คํ
์ ์๊ตฌ์ฌํญ:
โข ์๋ฐฑ๋ง ๋ช
์ ๋์ ์ ์์ ์ฒ๋ฆฌ
โข ๋งค์นญ ๋๊ธฐ ์๊ฐ ์ต์ํ (๋ชฉํ: 30์ด ์ด๋ด)
โข ์ค๋ ฅ์ด ๋น์ทํ ํ๋ ์ด์ด๋ผ๋ฆฌ ๋งค์นญ
โข ์ง์ญ๋ณ ์๋ฒ ๊ณ ๋ ค (๋ฎ์ ๋ ์ดํด์)
โข ์นํ
์์ฌ ํ๋ ์ด์ด ๊ฒฉ๋ฆฌ
์ค์๊ฐ ๋งค์นญ ํ์ดํ๋ผ์ธ:
1) ํ๋ ์ด์ด ์ํ ์ถ์ :
โข ํ์ฌ ์จ๋ผ์ธ ์ํ
โข ์ค๋ ฅ ๋ฑ๊ธ (MMR - Matchmaking Rating)
โข ์ต๊ทผ ๊ฒ์ ์ฑ์
โข ์ ํธ ๊ฒ์ ๋ชจ๋
โข ํํฐ ๊ตฌ์ฑ (ํผ์ vs ์น๊ตฌ๋ค๊ณผ ํจ๊ป)
2) ์ค์๊ฐ ํ ๊ด๋ฆฌ:
Redis Streams๋ฅผ ์ฌ์ฉํด์ ๋งค์นญ ํ๋ฅผ ๊ด๋ฆฌํด์:
โข ์ค๋ ฅ๋๋ณ๋ก ์ฌ๋ฌ ํ ์ด์
โข ๋๊ธฐ ์๊ฐ์ด ๊ธธ์ด์ง๋ฉด ๋งค์นญ ๋ฒ์ ํ๋
โข ์ง์ญ๋ณ ํ ์ฐ์ ์์ ์กฐ์
โข ํํฐ ํฌ๊ธฐ๋ณ ๋ณ๋ ํ
3) ๋งค์นญ ์๊ณ ๋ฆฌ์ฆ:
Flink๋ก ์ค์๊ฐ ๋งค์นญ์ ์ํํด์:
โข ์ค๋ ฅ ์ฐจ์ด ์ต์ํ
โข ๋๊ธฐ ์๊ฐ ๊ณ ๋ ค (์ค๋ ๊ธฐ๋ค๋ฆฐ ํ๋ ์ด์ด ์ฐ์ )
โข ํ ๋ฐธ๋ฐ์ค ์กฐ์
โข ์ต๊ทผ ํจ๊ป ํ๋ ์ดํ ํ๋ ์ด์ด ํํผ
4) ๋์ ๋์ด๋ ์กฐ์ :
๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ์ค์๊ฐ์ผ๋ก ๋ถ์ํด์ MMR์ ์
๋ฐ์ดํธํด์:
โข ์นํจ ๊ฒฐ๊ณผ
โข ๊ฐ์ธ ์ฑ์ (ํฌ/๋ฐ์ค, ์ ์ ๋ฑ)
โข ์๋ ํ ์ค๋ ฅ
โข ์ฐ์น/์ฐํจ ๊ณ ๋ ค
์ฑ๋ฅ ์ต์ ํ:
โข ์ธ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ก ๋ฐ๋ฆฌ์ด ๋จ์ ๋งค์นญ
โข ์ง์ญ๋ณ ๋ถ์ฐ ์ฒ๋ฆฌ๋ก ํ์ฅ์ฑ ํ๋ณด
โข ์บ์ฑ์ผ๋ก DB ๋ถํ ์ต์ํ
โข ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ก ์๋ต ์๊ฐ ๋จ์ถ
์ฌ๋ฅ๋ท ๊ฐ์ ํ๋ซํผ์์๋ ์ค์๊ฐ ๋งค์นญ ๊ธฐ์ ์ ํ์ฉํ ์ ์์ด์. ์๋ฅผ ๋ค์ด "์ง๊ธ ๋น์ฅ ์์ด ํํ ๋ ์จ์ ๋ฐ๊ณ ์ถ์ ํ์"๊ณผ "์ง๊ธ ์๊ฐ์ด ์๋ ์์ด ๊ฐ์ฌ"๋ฅผ ์ค์๊ฐ์ผ๋ก ๋งค์นญํ๋ ๊ฑฐ์ฃ . ์์น, ์ค๋ ฅ, ์ ํธ๋, ๊ฐ๊ฒฉ๋ ๋ฑ์ ๊ณ ๋ คํด์ ์ต์ ์ ๋งค์นญ์ ์ฐพ์ ์ ์์ด์!
๐ง ์ฑ๋ฅ ์ต์ ํ์ ๋ชจ๋ํฐ๋ง
โก ์ฑ๋ฅ ์ต์ ํ ์ ๋ต
์ค์๊ฐ ์คํธ๋ฆผ ์ฒ๋ฆฌ ์์คํ
์ ์ฑ๋ฅ์ ์ต์ ํํ๋ ๊ฑด ์ ๋ง ์ค์ํด์. ์ฒ๋ฆฌ๋์ด ๋ถ์กฑํ๋ฉด ๋ฐ์ดํฐ๊ฐ ๋ฐ๋ฆฌ๊ณ , ์ง์ฐ ์๊ฐ์ด ๊ธธ์ด์ง๋ฉด ์ค์๊ฐ์ ์๋ฏธ๊ฐ ์์ด์ง๋๊น์! ๐จ
1) ํํฐ์
๋ ์ต์ ํ
์ ์ ํ ํํฐ์
ํค ์ ํ:
ํํฐ์
ํค๋ ๋ฐ์ดํฐ๋ฅผ ์ด๋ป๊ฒ ๋ถ์ฐํ ์ง ๊ฒฐ์ ํด์. ์๋ชป ์ ํํ๋ฉด ํน์ ํํฐ์
์ ๋ฐ์ดํฐ๊ฐ ๋ชฐ๋ ค์ ๋ณ๋ชฉ์ด ๋ฐ์ํ์ฃ .
์ข์ ํํฐ์
ํค์ ์กฐ๊ฑด:
โข ๋ฐ์ดํฐ๊ฐ ๊ท ๋ฑํ๊ฒ ๋ถ์ฐ๋จ
โข ๊ด๋ จ๋ ๋ฐ์ดํฐ๊ฐ ๊ฐ์ ํํฐ์
์ ๋ชจ์
โข ์นด๋๋๋ฆฌํฐ(๊ณ ์ ๊ฐ ๊ฐ์)๊ฐ ์ถฉ๋ถํ ๋์
์์:
โ ๋์ ์ ํ: ๊ตญ๊ฐ ์ฝ๋ (ํน์ ๊ตญ๊ฐ์ ๋ฐ์ดํฐ ์ง์ค)
โ
์ข์ ์ ํ: ์ฌ์ฉ์ ID ํด์๊ฐ (๊ท ๋ฑ ๋ถ์ฐ)
ํํฐ์
๊ฐ์ ๊ฒฐ์ :
โข ๋๋ฌด ์ ์ผ๋ฉด: ๋ณ๋ ฌ ์ฒ๋ฆฌ ๋ถ์กฑ, ํ์ฅ์ฑ ์ ํ
โข ๋๋ฌด ๋ง์ผ๋ฉด: ์ค๋ฒํค๋ ์ฆ๊ฐ, ๊ด๋ฆฌ ๋ณต์ก๋ ์์น
โข ๊ถ์ฅ: (๋ชฉํ ์ฒ๋ฆฌ๋ / ํํฐ์
๋น ์ฒ๋ฆฌ๋) ร 1.5
โข Kafka ๊ธฐ์ค: ํํฐ์
๋น 10-50 MB/s ์ฒ๋ฆฌ ๊ฐ๋ฅ
2) ์ํ ๊ด๋ฆฌ ์ต์ ํ
์ํ๊ฐ ํฐ ๊ฒฝ์ฐ ์ฑ๋ฅ์ ํฐ ์ํฅ์ ๋ฏธ์ณ์. Flink์์ ์ํ ๊ด๋ฆฌ๋ฅผ ์ต์ ํํ๋ ๋ฐฉ๋ฒ:
RocksDB ํ๋:
Flink๋ ๋์ฉ๋ ์ํ๋ฅผ ์ํด RocksDB๋ฅผ ์ฌ์ฉํด์. ๊ธฐ๋ณธ ์ค์ ์ ํ๋ํ๋ฉด ์ฑ๋ฅ์ด ํฌ๊ฒ ํฅ์๋ผ์.
// RocksDB ์ํ ๋ฐฑ์๋ ์ค์
EmbeddedRocksDBStateBackend backend = new EmbeddedRocksDBStateBackend();
// ๋ธ๋ก ์บ์ ํฌ๊ธฐ ์ฆ๊ฐ (๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ ์ฆ๊ฐํ์ง๋ง ์ฑ๋ฅ ํฅ์)
backend.setPredefinedOptions(PredefinedOptions.SPINNING_DISK_OPTIMIZED_HIGH_MEM);
// ์ฆ๋ถ ์ฒดํฌํฌ์ธํธ ํ์ฑํ (์ฒดํฌํฌ์ธํธ ์๊ฐ ๋จ์ถ)
backend.enableIncrementalCheckpointing(true);
env.setStateBackend(backend);
// ์ฒดํฌํฌ์ธํธ ์ค์
env.enableCheckpointing(60000); // 1๋ถ๋ง๋ค
env.getCheckpointConfig().setMinPauseBetweenCheckpoints(30000);
env.getCheckpointConfig().setCheckpointTimeout(300000);
์ํ TTL ์ค์ :
์ค๋๋ ์ํ๋ฅผ ์๋์ผ๋ก ์ ๋ฆฌํด์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ฝํ ์ ์์ด์.
// ์ํ TTL ์ค์ ์์
StateTtlConfig ttlConfig = StateTtlConfig
.newBuilder(Time.days(7)) // 7์ผ ํ ๋ง๋ฃ
.setUpdateType(StateTtlConfig.UpdateType.OnCreateAndWrite)
.setStateVisibility(StateTtlConfig.StateVisibility.NeverReturnExpired)
.build();
ValueStateDescriptor<String> descriptor =
new ValueStateDescriptor<>("my-state", String.class);
descriptor.enableTimeToLive(ttlConfig);
ValueState<String> state = getRuntimeContext().getState(descriptor);
3) ๋คํธ์ํฌ ์ต์ ํ
๋ฐฐ์น ์ฒ๋ฆฌ:
๊ฐ๋ณ ๋ฉ์์ง๋ฅผ ํ๋์ฉ ๋ณด๋ด๋ ๋์ ์ฌ๋ฌ ๋ฉ์์ง๋ฅผ ๋ชจ์์ ๋ณด๋ด๋ฉด ๋คํธ์ํฌ ์ค๋ฒํค๋๊ฐ ์ค์ด๋ค์ด์.
Kafka ํ๋ก๋์ ์ค์ :
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
// ๋ฐฐ์น ํฌ๊ธฐ ์ฆ๊ฐ (๊ธฐ๋ณธ: 16KB)
props.put("batch.size", 65536); // 64KB
// ๋ฐฐ์น๊ฐ ์ฐฐ ๋๊น์ง ๋๊ธฐ ์๊ฐ (๊ธฐ๋ณธ: 0ms)
props.put("linger.ms", 10); // 10ms
// ์์ถ ํ์ฑํ
props.put("compression.type", "snappy"); // ๋๋ lz4, gzip
// ๋ฒํผ ๋ฉ๋ชจ๋ฆฌ ์ฆ๊ฐ
props.put("buffer.memory", 67108864); // 64MB
์์ถ ์ฌ์ฉ:
๋คํธ์ํฌ ๋์ญํญ์ด ๋ณ๋ชฉ์ธ ๊ฒฝ์ฐ ์์ถ์ ์ฌ์ฉํ๋ฉด ์ฒ๋ฆฌ๋์ด ํฌ๊ฒ ํฅ์๋ผ์.
์์ถ ์๊ณ ๋ฆฌ์ฆ ๋น๊ต:
โข snappy: ๋น ๋ฅธ ์์ถ/ํด์ , ์ค๊ฐ ์์ถ๋ฅ (๊ถ์ฅ)
โข lz4: ๋งค์ฐ ๋น ๋ฆ, ๋ฎ์ ์์ถ๋ฅ
โข gzip: ๋๋ฆผ, ๋์ ์์ถ๋ฅ
โข zstd: ๊ท ํ์กํ ์ฑ๋ฅ (Kafka 2.1+)
4) ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ
JVM ํ ํฌ๊ธฐ ์กฐ์ :
Flink๋ JVM ์์์ ๋์ํ๋ฏ๋ก ํ ํฌ๊ธฐ๊ฐ ์ค์ํด์. ํ์ง๋ง ๋๋ฌด ํฌ๋ฉด GC ์๊ฐ์ด ๊ธธ์ด์ ธ์.
๊ถ์ฅ ์ค์ :
โข TaskManager ํ: ์ ์ฒด ๋ฉ๋ชจ๋ฆฌ์ 40-50%
โข ๋๋จธ์ง๋ ์คํํ ๋ฉ๋ชจ๋ฆฌ๋ก (RocksDB, ๋คํธ์ํฌ ๋ฒํผ ๋ฑ)
โข G1GC ์ฌ์ฉ ๊ถ์ฅ
๊ฐ์ฒด ์ฌ์ฌ์ฉ:
๊ฐ์ฒด ์์ฑ/์๋ฉธ์ ์ค์ด๋ฉด GC ๋ถ๋ด์ด ๊ฐ์ํด์.
// ๋์ ์: ๋งค๋ฒ ์ ๊ฐ์ฒด ์์ฑ
public class MyMapFunction implements MapFunction<String, Tuple2<String, Integer>> {
@Override
public Tuple2<String, Integer> map(String value) {
return new Tuple2<>(value, value.length()); // ๋งค๋ฒ ์ ๊ฐ์ฒด!
}
}
// ์ข์ ์: ๊ฐ์ฒด ์ฌ์ฌ์ฉ
public class MyMapFunction implements MapFunction<String, Tuple2<String, Integer>> {
private Tuple2<String, Integer> reuse = new Tuple2<>();
@Override
public Tuple2<String, Integer> map(String value) {
reuse.f0 = value;
reuse.f1 = value.length();
return reuse; // ๊ฐ์ ๊ฐ์ฒด ์ฌ์ฌ์ฉ!
}
}
๐ ๋ชจ๋ํฐ๋ง๊ณผ ์๋ฆผ
์ค์๊ฐ ์ฒ๋ฆฌ ์์คํ
์ 24/7 ์ด์๋๋ฏ๋ก ์ฒ ์ ํ ๋ชจ๋ํฐ๋ง์ด ํ์์์! ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด ์ฆ์ ์์์ฐจ๋ฆฌ๊ณ ๋์ํด์ผ ํ์ฃ . ๐จ
ํต์ฌ ๋ชจ๋ํฐ๋ง ๋ฉํธ๋ฆญ:
1) ์ฒ๋ฆฌ๋ ๋ฉํธ๋ฆญ:
โข ์ด๋น ์ฒ๋ฆฌ ๋ ์ฝ๋ ์ (Records/sec)
โข ์ด๋น ์ฒ๋ฆฌ ๋ฐ์ดํธ ์ (Bytes/sec)
โข ํํฐ์
๋ณ ์ฒ๋ฆฌ๋ ๋ถํฌ
โข ํ๋ก๋์/์ปจ์๋จธ ์ฒ๋ฆฌ๋
2) ์ง์ฐ ์๊ฐ ๋ฉํธ๋ฆญ:
โข End-to-end ์ง์ฐ ์๊ฐ (๋ฐ์ดํฐ ์์ฑ๋ถํฐ ์ฒ๋ฆฌ ์๋ฃ๊น์ง)
โข ์ฒ๋ฆฌ ์ง์ฐ ์๊ฐ (Processing Latency)
โข ๋ฐฑํ๋ ์
(Backpressure) ๋ฐ์ ์ฌ๋ถ
โข ์ํฐ๋งํฌ ์ง์ฐ
3) ๋ฆฌ์์ค ์ฌ์ฉ๋ฅ :
โข CPU ์ฌ์ฉ๋ฅ
โข ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ฅ (ํ/์คํํ)
โข ๋คํธ์ํฌ ๋์ญํญ
โข ๋์คํฌ I/O
4) ์์คํ
๊ฑด๊ฐ๋:
โข ์ฒดํฌํฌ์ธํธ ์ฑ๊ณต๋ฅ
โข ์ฌ์์ ํ์
โข ์คํจํ ์์
์
โข ์ปจ์๋จธ ๋(Lag) - Kafka์์ ์ฒ๋ฆฌํ์ง ๋ชปํ ๋ฉ์์ง ์
๋ชจ๋ํฐ๋ง ๋๊ตฌ ์คํ:
| ๋๊ตฌ | ์ฉ๋ | ํน์ง |
|---|---|---|
| Prometheus | ๋ฉํธ๋ฆญ ์์ง | ์๊ณ์ด DB, ๊ฐ๋ ฅํ ์ฟผ๋ฆฌ ์ธ์ด |
| Grafana | ์๊ฐํ | ์๋ฆ๋ค์ด ๋์๋ณด๋, ์๋ฆผ ๊ธฐ๋ฅ |
| ELK Stack | ๋ก๊ทธ ๋ถ์ | Elasticsearch + Logstash + Kibana |
| Jaeger | ๋ถ์ฐ ํธ๋ ์ด์ฑ | ์์ฒญ ํ๋ฆ ์ถ์ , ๋ณ๋ชฉ ์ง์ ํ์ |
| Kafka Manager | Kafka ๋ชจ๋ํฐ๋ง | ํ ํฝ/ํํฐ์ ๊ด๋ฆฌ, ์ปจ์๋จธ ๋ ํ์ธ |
| Flink Dashboard | Flink ๋ชจ๋ํฐ๋ง | ์์ ์ํ, ๋ฐฑํ๋ ์ , ์ฒดํฌํฌ์ธํธ |
์๋ฆผ ์ค์ ๋ฒ ์คํธ ํ๋ํฐ์ค:
1) ์๋ฆผ ์ฐ์ ์์ ๊ตฌ๋ถ:
โข P0 (๊ธด๊ธ): ์์คํ
๋ค์ด, ๋ฐ์ดํฐ ์์ค - ์ฆ์ ์ ํ/SMS
โข P1 (๋์): ์ฑ๋ฅ ์ ํ, ์๋ฌ์จ ์ฆ๊ฐ - Slack ์๋ฆผ
โข P2 (์ค๊ฐ): ๊ฒฝ๊ณ ์์ค - ์ด๋ฉ์ผ
โข P3 (๋ฎ์): ์ ๋ณด์ฑ ์๋ฆผ - ๋์๋ณด๋๋ง
2) ์๋ฆผ ํผ๋ก ๋ฐฉ์ง:
โข ๊ฐ์ ์๋ฆผ ๋ฐ๋ณต ๋ฐฉ์ง (์: 5๋ถ ๋ด ์ค๋ณต ์๋ฆผ ๋ฌด์)
โข ์๋ฆผ ๊ทธ๋ฃนํ (์ฌ๋ฌ ๊ด๋ จ ์๋ฆผ์ ํ๋๋ก)
โข ์๋ ๋ณต๊ตฌ ์ ์๋ฆผ ํด์
โข ์ผ๊ฐ ์๋ฆผ ์ต์ํ (์ ๋ง ๊ธด๊ธํ ๊ฒ๋ง)
3) ์คํ ๊ฐ๋ฅํ ์๋ฆผ:
์๋ฆผ์๋ ๋ค์ ์ ๋ณด๊ฐ ํฌํจ๋์ด์ผ ํด์:
โข ๋ฌด์์ด ๋ฌธ์ ์ธ๊ฐ?
โข ์ด๋์ ๋ฐ์ํ๋๊ฐ?
โข ์ธ์ ์์๋๋๊ฐ?
โข ์ด๋ป๊ฒ ํด๊ฒฐํ๋๊ฐ? (๋ฐ๋ถ ๋งํฌ)
โข ๊ด๋ จ ๋์๋ณด๋/๋ก๊ทธ ๋งํฌ
๋์ ์๋ฆผ:
"Error in production"
โ ๋ญ๊ฐ ๋ฌธ์ ์ธ์ง, ์ด๋์ ๋ฐ์ํ๋์ง ์ ์ ์์ ๐ฑ
์ข์ ์๋ฆผ:
"[P1] Kafka Consumer Lag > 100K messages
โข Topic: user-events
โข Consumer Group: analytics-processor
โข Current Lag: 150,234 messages
โข Started: 2024-01-15 14:32 KST
โข Runbook: https://wiki.company.com/kafka-lag
โข Dashboard: https://grafana.company.com/kafka"
โ ํ์ํ ๋ชจ๋ ์ ๋ณด๊ฐ ํฌํจ๋์ด ์์! โ
๐ ํธ๋ฌ๋ธ์ํ ๊ฐ์ด๋
์ค์๊ฐ ์ฒ๋ฆฌ ์์คํ
์์ ์์ฃผ ๋ฐ์ํ๋ ๋ฌธ์ ๋ค๊ณผ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ ๋ฆฌํด๋ณผ๊ฒ์! ๐ ๏ธ
๋ฌธ์ 1: ๋ฐฑํ๋ ์
(Backpressure)
์ฆ์:
โข ์ฒ๋ฆฌ ์๋๊ฐ ๋ฐ์ดํฐ ์ ์
์๋๋ฅผ ๋ฐ๋ผ๊ฐ์ง ๋ชปํจ
โข ์ง์ฐ ์๊ฐ์ด ๊ณ์ ์ฆ๊ฐ
โข ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ์ฆ๊ฐ
์์ธ:
โข ๋ค์ด์คํธ๋ฆผ ์ฒ๋ฆฌ๊ฐ ๋๋ฆผ (DB ์ฐ๊ธฐ, ์ธ๋ถ API ํธ์ถ ๋ฑ)
โข ๋ฆฌ์์ค ๋ถ์กฑ (CPU, ๋ฉ๋ชจ๋ฆฌ)
โข ๋นํจ์จ์ ์ธ ์๊ณ ๋ฆฌ์ฆ
ํด๊ฒฐ ๋ฐฉ๋ฒ:
โข ๋ณ๋ ฌ๋ ์ฆ๊ฐ (ํํฐ์
/ํ์คํฌ ์ ๋๋ฆฌ๊ธฐ)
โข ๋น๋๊ธฐ I/O ์ฌ์ฉ
โข ๋ฐฐ์น ์ฒ๋ฆฌ๋ก ์ ํ
โข ์บ์ฑ ํ์ฉ
โข ๋ถํ์ํ ์ฐ์ฐ ์ ๊ฑฐ
๋ฌธ์ 2: ๋ฐ์ดํฐ ์คํ (Data Skew)
์ฆ์:
โข ํน์ ํํฐ์
/ํ์คํฌ๋ง ๊ณผ๋ถํ
โข ์ ์ฒด ์ฒ๋ฆฌ ์๋๊ฐ ๋๋ฆฐ ํํฐ์
์ ์ํด ์ ํ๋จ
โข ๋ฆฌ์์ค ํ์ฉ๋ฅ ๋ถ๊ท ํ
์์ธ:
โข ํํฐ์
ํค๊ฐ ๋ถ๊ท ๋ฑํ๊ฒ ๋ถ์ฐ๋จ
โข ํซ ํค(Hot Key) ์กด์ฌ (ํน์ ํค์ ๋ฐ์ดํฐ ์ง์ค)
ํด๊ฒฐ ๋ฐฉ๋ฒ:
โข ํํฐ์
ํค ์ฌ์ค๊ณ (ํด์ ํจ์ ์ฌ์ฉ)
โข ํซ ํค ๋ถ์ฐ (ํค์ ๋๋ค ์ ๋ฏธ์ฌ ์ถ๊ฐ)
โข ๋ฆฌํํฐ์
๋
โข ์ํ๋ง์ผ๋ก ํซ ํค ์๋ณ ํ ๋ณ๋ ์ฒ๋ฆฌ
๋ฌธ์ 3: ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ (Out of Memory)
์ฆ์:
โข OutOfMemoryError ๋ฐ์
โข ์ฆ์ GC๋ก ์ธํ ์ฑ๋ฅ ์ ํ
โข ์์
์ฌ์์ ๋ฐ๋ณต
์์ธ:
โข ์ํ ํฌ๊ธฐ๊ฐ ๋๋ฌด ํผ
โข ์๋์ฐ ํฌ๊ธฐ๊ฐ ๋๋ฌด ํผ
โข ๋ฉ๋ชจ๋ฆฌ ๋์
โข ํ ํฌ๊ธฐ ๋ถ์กฑ
ํด๊ฒฐ ๋ฐฉ๋ฒ:
โข RocksDB ์ํ ๋ฐฑ์๋ ์ฌ์ฉ (์คํํ)
โข ์ํ TTL ์ค์
โข ์๋์ฐ ํฌ๊ธฐ ์ถ์
โข ํ ํฌ๊ธฐ ์ฆ๊ฐ
โข ๋ฉ๋ชจ๋ฆฌ ํ๋กํ์ผ๋ง์ผ๋ก ๋์ ์ฐพ๊ธฐ
์ค๋ฌด์์๋ ์ด๋ฐ ๋ฌธ์ ๋ค์ด ๋ณตํฉ์ ์ผ๋ก ๋ฐ์ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์์ ใ
ใ
ใ
๊ทธ๋์ ์ฒด๊ณ์ ์ธ ๋ชจ๋ํฐ๋ง๊ณผ ๋ก๊น
์ด ์ ๋ง ์ค์ํ์ฃ !
๐ ๋ฏธ๋ ํธ๋ ๋์ ๋ฐ์ ๋ฐฉํฅ
๐ค AI/ML๊ณผ์ ํตํฉ
์ค์๊ฐ ์คํธ๋ฆผ ์ฒ๋ฆฌ์ ๋จธ์ ๋ฌ๋์ ๊ฒฐํฉ์ ์ด๋ฏธ ํ์ค์ด ๋๊ณ ์์ด์. ์์ผ๋ก๋ ๋์ฑ ๊ธด๋ฐํ๊ฒ ํตํฉ๋ ๊ฑฐ์์! ๐
์จ๋ผ์ธ ํ์ต (Online Learning):
์ ํต์ ์ธ ๋จธ์ ๋ฌ๋์ ๋ฐฐ์น๋ก ๋ชจ๋ธ์ ํ์ตํ์ง๋ง, ์จ๋ผ์ธ ํ์ต์ ๋ฐ์ดํฐ๊ฐ ๋ค์ด์ฌ ๋๋ง๋ค ๋ชจ๋ธ์ ์
๋ฐ์ดํธํด์.
์ฅ์ :
โข ์ต์ ๋ฐ์ดํฐ ํจํด์ ์ฆ์ ๋ฐ์
โข ๊ฐ๋
๋๋ฆฌํํธ(Concept Drift)์ ๋น ๋ฅด๊ฒ ์ ์
โข ์ฌํ์ต ์ฃผ๊ธฐ ๋ถํ์
์ ์ฉ ์ฌ๋ก:
โข ์ค์๊ฐ ์ถ์ฒ ์์คํ
โข ์ฌ๊ธฐ ํ์ง (์๋ก์ด ์ฌ๊ธฐ ํจํด ํ์ต)
โข ์ด์ ํ์ง (์ ์ ํจํด ๋ณํ ์ถ์ )
โข ๊ฐ์ธํ ๊ด๊ณ
์คํธ๋ฆผ ML ํ๋ ์์ํฌ:
โข River (Python): ์จ๋ผ์ธ ํ์ต ๋ผ์ด๋ธ๋ฌ๋ฆฌ
โข Flink ML: Flink ๊ธฐ๋ฐ ๋จธ์ ๋ฌ๋
โข Spark MLlib Streaming: Spark ์คํธ๋ฆฌ๋ฐ ML
โข TensorFlow Extended (TFX): ํ๋ก๋์
ML ํ์ดํ๋ผ์ธ
2024๋
ํธ๋ ๋: MLOps์ ์คํธ๋ฆผ ์ฒ๋ฆฌ์ ํตํฉ์ด ๊ฐ์ํ๋๊ณ ์์ด์. ๋ชจ๋ธ ๋ฐฐํฌ, ๋ชจ๋ํฐ๋ง, A/B ํ
์คํธ๊ฐ ๋ชจ๋ ์ค์๊ฐ ํ์ดํ๋ผ์ธ์ ํตํฉ๋๋ ์ถ์ธ์ฃ !
โ๏ธ ์๋ฒ๋ฆฌ์ค ์คํธ๋ฆผ ์ฒ๋ฆฌ
์๋ฒ ๊ด๋ฆฌ ์์ด ์คํธ๋ฆผ ์ฒ๋ฆฌ๋ฅผ ํ ์ ์๋ ์๋ฒ๋ฆฌ์ค ํ๋ซํผ์ด ์ธ๊ธฐ๋ฅผ ์ป๊ณ ์์ด์! โ๏ธ
์ฃผ์ ์๋ฒ๋ฆฌ์ค ์คํธ๋ฆผ ์ฒ๋ฆฌ ์๋น์ค:
AWS Kinesis Data Analytics:
โข SQL์ด๋ Apache Flink๋ก ์คํธ๋ฆผ ์ฒ๋ฆฌ
โข ์๋ ์ค์ผ์ผ๋ง
โข ์ฌ์ฉํ ๋งํผ๋ง ๋น์ฉ ์ง๋ถ
โข Lambda์ ์ฝ๊ฒ ํตํฉ
Google Cloud Dataflow:
โข Apache Beam ๊ธฐ๋ฐ
โข ๋ฐฐ์น์ ์คํธ๋ฆผ ํตํฉ ๋ชจ๋ธ
โข ์๋ ๋ฆฌ์์ค ๊ด๋ฆฌ
โข BigQuery์ ๊ธด๋ฐํ ํตํฉ
Azure Stream Analytics:
โข SQL ๊ธฐ๋ฐ ์คํธ๋ฆผ ์ฒ๋ฆฌ
โข IoT Hub์ ํตํฉ
โข Power BI๋ก ์ค์๊ฐ ์๊ฐํ
โข ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ ํตํฉ
์๋ฒ๋ฆฌ์ค์ ์ฅ๋จ์ :
์ฅ์ :
โข ์ธํ๋ผ ๊ด๋ฆฌ ๋ถํ์
โข ์๋ ์ค์ผ์ผ๋ง
โข ๋น ๋ฅธ ๊ฐ๋ฐ ์๋
โข ์ด๊ธฐ ๋น์ฉ ๋ฎ์
๋จ์ :
โข ๋ฒค๋ ์ข
์
โข ๋ณต์กํ ๋ก์ง ๊ตฌํ ์ ํ
โข ๋๊ท๋ชจ์์๋ ๋น์ฉ ์ฆ๊ฐ
โข ๋๋ฒ๊น
์ด๋ ค์
๊ฐ์ธ์ ์ผ๋ก๋ ใ
ใ
ใ
ํ๋กํ ํ์
์ด๋ ์ค์ ๊ท๋ชจ ํ๋ก์ ํธ์๋ ์๋ฒ๋ฆฌ์ค๊ฐ ์ข์ง๋ง, ๋๊ท๋ชจ ํ๋ก๋์
ํ๊ฒฝ์์๋ ์์ง ์์ฒด ํด๋ฌ์คํฐ๊ฐ ๋ ๋์ ๊ฒ ๊ฐ์์!
๐ ์ฃ์ง ์ปดํจํ ๊ณผ์ ์ตํฉ
5G์ IoT์ ๋ฐ์ ์ผ๋ก ์ฃ์ง ์ปดํจํ
์ด ์ค์ํด์ง๊ณ ์์ด์. ๋ฐ์ดํฐ๋ฅผ ํด๋ผ์ฐ๋๋ก ๋ณด๋ด์ง ์๊ณ ์ฃ์ง์์ ๋ฐ๋ก ์ฒ๋ฆฌํ๋ ๊ฑฐ์ฃ ! ๐ก
์ฃ์ง ์คํธ๋ฆผ ์ฒ๋ฆฌ์ ํ์์ฑ:
โข ์ด์ ์ง์ฐ ์๊ตฌ์ฌํญ (์์จ์ฃผํ, ์ฐ์
์๋ํ)
โข ๋คํธ์ํฌ ๋์ญํญ ์ ์ฝ
โข ํ๋ผ์ด๋ฒ์ ๋ณดํธ (๋ฏผ๊ฐํ ๋ฐ์ดํฐ๋ฅผ ๋ก์ปฌ์์ ์ฒ๋ฆฌ)
โข ์คํ๋ผ์ธ ๋์ ๊ฐ๋ฅ
์ฃ์ง-ํด๋ผ์ฐ๋ ํ์ด๋ธ๋ฆฌ๋ ์ํคํ
์ฒ:
์ฃ์ง ๋ ์ด์ด:
โข ์ค์๊ฐ ์์ฌ๊ฒฐ์ (๋ฐ๋ฆฌ์ด ๋จ์)
โข ๋ฐ์ดํฐ ํํฐ๋ง ๋ฐ ์์ถ
โข ๊ฐ๋จํ ์ง๊ณ
โข ๊ธด๊ธ ์๋ฆผ
ํด๋ผ์ฐ๋ ๋ ์ด์ด:
โข ๋ณต์กํ ๋ถ์
โข ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ ํ์ต
โข ์ฅ๊ธฐ ์ ์ฅ
โข ์ ์ฒด ์์คํ
์ต์ ํ
์ฃ์ง ์คํธ๋ฆผ ์ฒ๋ฆฌ ํ๋ ์์ํฌ:
โข Apache Edgent: IoT ์ฃ์ง ๋ถ์
โข KubeEdge: Kubernetes ๊ธฐ๋ฐ ์ฃ์ง ์ปดํจํ
โข AWS IoT Greengrass: AWS ์ฃ์ง ๋ฐํ์
โข Azure IoT Edge: Azure ์ฃ์ง ์๋น์ค
์ค์ ์ฌ๋ก: ์์จ์ฃผํ์ฐจ๋ ์ฃ์ง์์ ์ค์๊ฐ ์ฅ์ ๋ฌผ ๊ฐ์ง๋ฅผ ํ๊ณ , ํด๋ผ์ฐ๋์์๋ ์ ์ฒด ๊ตํต ํจํด์ ๋ถ์ํด์ ๊ฒฝ๋ก๋ฅผ ์ต์ ํํด์!
๐ ๋ณด์๊ณผ ํ๋ผ์ด๋ฒ์
์ค์๊ฐ ๋ฐ์ดํฐ ์ฒ๋ฆฌ์์ ๋ณด์์ ์ ์ ๋ ์ค์ํด์ง๊ณ ์์ด์. ํนํ GDPR, CCPA ๊ฐ์ ๊ฐ์ธ์ ๋ณด ๋ณดํธ ๊ท์ ๊ฐ ๊ฐํ๋๋ฉด์์! ๐
์คํธ๋ฆผ ์ฒ๋ฆฌ ๋ณด์ ๊ณ ๋ ค์ฌํญ:
1) ์ ์ก ์ค ์ํธํ:
โข TLS/SSL๋ก ๋คํธ์ํฌ ํต์ ์ํธํ
โข Kafka์์ SSL ์ค์
โข ์๋ํฌ์๋ ์ํธํ
2) ์ ์ฅ ์ ์ํธํ:
โข ๋์คํฌ ์ํธํ
โข ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ํธํ
โข ๋ฐฑ์
์ํธํ
3) ์ ๊ทผ ์ ์ด:
โข ์ธ์ฆ (Authentication): ๋๊ฐ ์ ๊ทผํ๋๊ฐ?
โข ์ธ๊ฐ (Authorization): ๋ฌด์์ ํ ์ ์๋๊ฐ?
โข ๊ฐ์ฌ ๋ก๊น
(Audit Logging): ๋๊ฐ ๋ฌด์์ ํ๋๊ฐ?
4) ๋ฐ์ดํฐ ๋ง์คํน:
โข ๋ฏผ๊ฐํ ์ ๋ณด ์๋ ๋ง์คํน
โข ํ๋ ๋ ๋ฒจ ์ํธํ
โข ํ ํฐํ (Tokenization)
ํ๋ผ์ด๋ฒ์ ๋ณดํธ ๊ธฐ์ :
์ฐจ๋ฑ ํ๋ผ์ด๋ฒ์ (Differential Privacy):
๊ฐ์ธ ์ ๋ณด๋ฅผ ๋ณดํธํ๋ฉด์๋ ํต๊ณ์ ๋ถ์์ ๊ฐ๋ฅํ๊ฒ ํ๋ ๊ธฐ์ ์ด์์. ๋ฐ์ดํฐ์ ๋
ธ์ด์ฆ๋ฅผ ์ถ๊ฐํด์ ๊ฐ์ธ์ ์๋ณํ ์ ์๊ฒ ๋ง๋ค์ง๋ง, ์ ์ฒด ํจํด์ ์ ์งํ์ฃ .
์ฐํฉ ํ์ต (Federated Learning):
๋ฐ์ดํฐ๋ฅผ ์ค์์ผ๋ก ๋ชจ์ผ์ง ์๊ณ , ๊ฐ ์ฃ์ง ๋๋ฐ์ด์ค์์ ๋ชจ๋ธ์ ํ์ตํ ํ ๋ชจ๋ธ ํ๋ผ๋ฏธํฐ๋ง ๊ณต์ ํ๋ ๋ฐฉ์์ด์์. Google์ด ์ค๋งํธํฐ ํค๋ณด๋ ํ์ต์ ์ฌ์ฉํ๊ณ ์์ฃ !
2024๋
๊ท์ ๋ํฅ: EU์ AI Act, ๋ฏธ๊ตญ์ ์ฃผ๋ณ ํ๋ผ์ด๋ฒ์ ๋ฒ์ ๋ฑ์ผ๋ก ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ๋ํ ๊ท์ ๊ฐ ๊ฐํ๋๊ณ ์์ด์. ์ค์๊ฐ ์ฒ๋ฆฌ ์์คํ
๋ ์ด๋ฐ ๊ท์ ๋ฅผ ์ค์ํด์ผ ํ์ฃ !
๐ฏ ์ค์๊ฐ ๋ฐ์ดํฐ ๋ฉ์ (Data Mesh)
๋ฐ์ดํฐ ๋ฉ์๋ ์ต๊ทผ ๋ ์ค๋ฅด๋ ๋ฐ์ดํฐ ์ํคํ
์ฒ ํจ๋ฌ๋ค์์ด์์. ์ค์ ์ง์ค์ ๋ฐ์ดํฐ ํ๋ซํผ ๋์ , ๋๋ฉ์ธ๋ณ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ถ์ฐ ๊ด๋ฆฌํ๋ ๊ฑฐ์ฃ ! ๐ธ๏ธ
๋ฐ์ดํฐ ๋ฉ์์ 4๊ฐ์ง ์์น:
1) ๋๋ฉ์ธ ์์ ๊ถ (Domain Ownership):
๊ฐ ๋น์ฆ๋์ค ๋๋ฉ์ธ์ด ์์ ์ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ณ ๊ด๋ฆฌํด์. ์๋ฅผ ๋ค์ด ์ฃผ๋ฌธ ๋๋ฉ์ธ์ ์ฃผ๋ฌธ ๋ฐ์ดํฐ๋ฅผ, ๋ฐฐ์ก ๋๋ฉ์ธ์ ๋ฐฐ์ก ๋ฐ์ดํฐ๋ฅผ ์ฑ
์์ง๋ ๊ฑฐ์ฃ .
2) ๋ฐ์ดํฐ๋ฅผ ์ ํ์ผ๋ก (Data as a Product):
๋ฐ์ดํฐ๋ฅผ ๋ค๋ฅธ ํ์ด ์ฌ์ฉํ ์ ์๋ ์ ํ์ผ๋ก ์ทจ๊ธํด์. API์ฒ๋ผ ๋ช
ํํ ์ธํฐํ์ด์ค์ SLA๋ฅผ ์ ๊ณตํ์ฃ .
3) ์
ํ์๋น์ค ํ๋ซํผ (Self-serve Platform):
๊ฐ ๋๋ฉ์ธ์ด ๋
๋ฆฝ์ ์ผ๋ก ๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ์ ๊ตฌ์ถํ ์ ์๋ ํ๋ซํผ์ ์ ๊ณตํด์. ์ค์ ํ์ ์์กดํ์ง ์๊ณ ์!
4) ์ฐํฉ ๊ฑฐ๋ฒ๋์ค (Federated Governance):
์ ์ฒด ์กฐ์ง์ ๋ฐ์ดํฐ ํ์ค๊ณผ ์ ์ฑ
์ ์ ํ๋, ๊ฐ ๋๋ฉ์ธ์ด ์์จ์ ์ผ๋ก ๊ตฌํํด์.
์ค์๊ฐ ๋ฐ์ดํฐ ๋ฉ์ ๊ตฌํ:
โข ๊ฐ ๋๋ฉ์ธ์ด ์์ ์ Kafka ํ ํฝ ๊ด๋ฆฌ
โข ๋๋ฉ์ธ ๊ฐ ์ด๋ฒคํธ ์คํธ๋ฆผ ๊ณต์
โข ์คํค๋ง ๋ ์ง์คํธ๋ฆฌ๋ก ํธํ์ฑ ๋ณด์ฅ
โข ๋ฐ์ดํฐ ์นดํ๋ก๊ทธ๋ก ๋ฐ๊ฒฌ ๊ฐ๋ฅ์ฑ ํฅ์
์์ง ์ด๊ธฐ ๋จ๊ณ์ง๋ง, ๋๊ท๋ชจ ์กฐ์ง์์๋ ๋ฐ์ดํฐ ๋ฉ์๊ฐ ํ์ฐ๋๊ณ ์์ด์. ํนํ ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ
์ฒ์ ์ ๋ง์๋จ์ด์ง์ฃ !
1. ์ค์๊ฐ์ด ๊ธฐ๋ณธ์ด ๋ ๊ฒ: ๋ฐฐ์น ์ฒ๋ฆฌ๋ ์ ์ ์ค์ด๋ค๊ณ , ๋๋ถ๋ถ์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๊ฐ ์ค์๊ฐ์ผ๋ก ์ ํ๋ ๊ฑฐ์์.
2. AI ๋ค์ดํฐ๋ธ ์คํธ๋ฆผ ์ฒ๋ฆฌ: ์คํธ๋ฆผ ์ฒ๋ฆฌ ์์ง์ AI/ML์ด ๊ธฐ๋ณธ ๊ธฐ๋ฅ์ผ๋ก ํตํฉ๋ ๊ฑฐ์์.
3. ์ฃ์ง-ํด๋ผ์ฐ๋ ์ฐ์์ฒด: ์ฃ์ง์ ํด๋ผ์ฐ๋์ ๊ฒฝ๊ณ๊ฐ ๋ชจํธํด์ง๊ณ , ๋ฐ์ดํฐ๊ฐ ์์ ๋กญ๊ฒ ์ด๋ํ ๊ฑฐ์์.
4. ์๋ํ๋ ์ต์ ํ: AI๊ฐ ์๋์ผ๋ก ํ์ดํ๋ผ์ธ์ ์ต์ ํํ๊ณ , ๋ฆฌ์์ค๋ฅผ ์กฐ์ ํ ๊ฑฐ์์.
5. ์์ ์ปดํจํ : ์์ง ๋จผ ๋ฏธ๋์ง๋ง, ์์ ์ปดํจํ ์ด ํน์ ์คํธ๋ฆผ ์ฒ๋ฆฌ ์์ ์ ํ์ ํ ์ ์์ด์!
๐ ํ์ต ๋ก๋๋งต๊ณผ ๋ฆฌ์์ค
๐ ๋จ๊ณ๋ณ ํ์ต ๊ฐ์ด๋
์ค์๊ฐ ์คํธ๋ฆผ ์ฒ๋ฆฌ๋ฅผ ๋ง์คํฐํ๋ ค๋ฉด ์ฒด๊ณ์ ์ธ ํ์ต์ด ํ์ํด์. ์ด๋ณด์๋ถํฐ ์ ๋ฌธ๊ฐ๊น์ง ๋จ๊ณ๋ณ ๋ก๋๋งต์ ์ ์ํด๋ณผ๊ฒ์! ๐
1๋จ๊ณ: ๊ธฐ์ด ๋ค์ง๊ธฐ (1-2๊ฐ์)
ํ์ ์ง์:
โข ๋ถ์ฐ ์์คํ
๊ธฐ์ด (CAP ์ ๋ฆฌ, ์ผ๊ด์ฑ ๋ชจ๋ธ)
โข ๋คํธ์ํน ๊ธฐ์ด (TCP/IP, HTTP)
โข ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ธฐ์ด (SQL, NoSQL)
โข ํ๋ก๊ทธ๋๋ฐ ์ธ์ด (Java, Python, Scala ์ค ํ๋)
ํ์ต ์๋ฃ:
โข "Designing Data-Intensive Applications" by Martin Kleppmann (ํ๋
์!)
โข Coursera: "Cloud Computing Concepts"
โข YouTube: ๋ถ์ฐ ์์คํ
๊ฐ์
2๋จ๊ณ: ๋ฉ์์ง ํ ๋ง์คํฐ (2-3๊ฐ์)
Apache Kafka ์ง์ค ํ์ต:
โข Kafka ์ํคํ
์ฒ ์ดํด
โข ํ๋ก๋์/์ปจ์๋จธ API ์ค์ต
โข ํํฐ์
, ๋ฆฌํ๋ฆฌ์ผ์ด์
๊ฐ๋
โข Kafka Streams ๊ธฐ์ด
์ค์ต ํ๋ก์ ํธ:
โข ๊ฐ๋จํ ๋ก๊ทธ ์์ง ์์คํ
๊ตฌ์ถ
โข ์ค์๊ฐ ๋์๋ณด๋ ๋ง๋ค๊ธฐ
โข ์ด๋ฒคํธ ๊ธฐ๋ฐ ๋ง์ดํฌ๋ก์๋น์ค ๊ตฌํ
ํ์ต ์๋ฃ:
โข Confluent ๊ณต์ ๋ฌธ์ ๋ฐ ํํ ๋ฆฌ์ผ
โข "Kafka: The Definitive Guide" by Neha Narkhede
โข Udemy: "Apache Kafka Series"
3๋จ๊ณ: ์คํธ๋ฆผ ์ฒ๋ฆฌ ์์ง (3-4๊ฐ์)
Apache Flink ๋๋ Spark Streaming:
โข ์คํธ๋ฆผ ์ฒ๋ฆฌ ๊ฐ๋
(์๋์ฐ, ์ํฐ๋งํฌ, ์ํ ๊ด๋ฆฌ)
โข DataStream API ๋ง์คํฐ
โข ์๊ฐ ์ฒ๋ฆฌ (Event Time, Processing Time)
โข ์ ํํ ํ ๋ฒ ์ฒ๋ฆฌ ๊ตฌํ
์ค์ต ํ๋ก์ ํธ:
โข ์ค์๊ฐ ๋ถ์ ํ์ดํ๋ผ์ธ ๊ตฌ์ถ
โข ์ด์ ํ์ง ์์คํ
๊ฐ๋ฐ
โข ์ค์๊ฐ ์ง๊ณ ๋์๋ณด๋
ํ์ต ์๋ฃ:
โข Apache Flink ๊ณต์ ๋ฌธ์
โข "Stream Processing with Apache Flink" by Fabian Hueske
โข DataArtisans (Flink ๊ฐ๋ฐ์ฌ) ๋ธ๋ก๊ทธ
4๋จ๊ณ: ๊ณ ๊ธ ์ฃผ์ (4-6๊ฐ์)
์ฌํ ํ์ต:
โข ๋๋ค/์นดํ ์ํคํ
์ฒ ์ค๊ณ
โข ์ด๋ฒคํธ ์์ฑ๊ณผ CQRS
โข ์ฑ๋ฅ ์ต์ ํ ๊ธฐ๋ฒ
โข ์ฅ์ ๋ณต๊ตฌ ์ ๋ต
โข ๋ณด์๊ณผ ํ๋ผ์ด๋ฒ์
์ค์ ํ๋ก์ ํธ:
โข ํ๋ก๋์
์์ค์ ์ค์๊ฐ ์ฒ๋ฆฌ ์์คํ
๊ตฌ์ถ
โข ๋๊ท๋ชจ ๋ฐ์ดํฐ ์ฒ๋ฆฌ (TB ๋จ์)
โข ๋ฉํฐ ํด๋ฌ์คํฐ ์ด์
5๋จ๊ณ: ์ ๋ฌธ๊ฐ ๋๊ธฐ (์ง์์ )
์ง์์ ํ์ต:
โข ์ต์ ๊ธฐ์ ํธ๋ ๋ ํ๋ก์ฐ
โข ์คํ์์ค ๊ธฐ์ฌ
โข ์ปจํผ๋ฐ์ค ์ฐธ์ (Kafka Summit, Flink Forward)
โข ๋ธ๋ก๊ทธ ์์ฑ ๋ฐ ์ง์ ๊ณต์
โข ์ปค๋ฎค๋ํฐ ํ๋
์ฌ๋ฅ๋ท ๊ฐ์ ํ๋ซํผ์์ ์์ ์ ์ง์์ ๊ณต์ ํ๋ฉด์ ๋ฐฐ์ฐ๋ ๊ฒ๋ ์ข์ ๋ฐฉ๋ฒ์ด์์! ๊ฐ๋ฅด์น๋ฉด์ ๋ ๊น์ด ์ดํดํ๊ฒ ๋๊ฑฐ๋ ์ ใ
ใ
๐ ๏ธ ์ค์ต ํ๊ฒฝ ๊ตฌ์ถ
์ด๋ก ๋ง ๊ณต๋ถํ๋ฉด ์ฌ๋ฏธ์์ฃ ! ์ง์ ์์ผ๋ก ๋ง์ ธ๋ด์ผ ์ง์ง ์ค๋ ฅ์ด ๋์ด์. ๋ก์ปฌ ํ๊ฒฝ์์ ์ค์ตํ ์ ์๋ ๋ฐฉ๋ฒ์ ์๋ ค๋๋ฆด๊ฒ์! ๐ป
Docker Compose๋ก ๊ฐ๋จํ ์์ํ๊ธฐ:
# docker-compose.yml
version: '3'
services:
zookeeper:
image: confluentinc/cp-zookeeper:latest
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
kafka:
image: confluentinc/cp-kafka:latest
depends_on:
- zookeeper
ports:
- "9092:9092"
environment:
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
flink-jobmanager:
image: flink:latest
ports:
- "8081:8081"
command: jobmanager
environment:
- JOB_MANAGER_RPC_ADDRESS=flink-jobmanager
flink-taskmanager:
image: flink:latest
depends_on:
- flink-jobmanager
command: taskmanager
environment:
- JOB_MANAGER_RPC_ADDRESS=flink-jobmanager
# ์คํ: docker-compose up -d
์ด๋ ๊ฒ ํ๋ฉด ๋ก์ปฌ์์ Kafka์ Flink๋ฅผ ๋ฐ๋ก ์ฌ์ฉํ ์ ์์ด์! ๐
ํด๋ผ์ฐ๋ ๋ฌด๋ฃ ํฐ์ด ํ์ฉ:
โข AWS Free Tier: Kinesis, Lambda
โข Google Cloud Free Tier: Dataflow, Pub/Sub
โข Azure Free Tier: Stream Analytics, Event Hubs
ํด๋ผ์ฐ๋ ์๋น์ค๋ฅผ ์ฌ์ฉํ๋ฉด ์ธํ๋ผ ๊ด๋ฆฌ ์์ด ๋ฐ๋ก ์ค์ตํ ์ ์์ด์. ๋จ, ๋น์ฉ์ด ๋ฐ์ํ ์ ์์ผ๋ ์ฃผ์ํ์ธ์!
๐ ์ปค๋ฎค๋ํฐ์ ๋ฆฌ์์ค
ํผ์ ๊ณต๋ถํ๋ฉด ํ๋ค ๋๊ฐ ์์ฃ . ์ปค๋ฎค๋ํฐ์ ์ฐธ์ฌํ๋ฉด ๋์์ ๋ฐ์ ์ ์๊ณ , ์ต์ ์ ๋ณด๋ ๋น ๋ฅด๊ฒ ์ป์ ์ ์์ด์! ๐ฅ
์จ๋ผ์ธ ์ปค๋ฎค๋ํฐ:
โข Confluent Community Slack
โข Apache Flink ๋ฉ์ผ๋ง ๋ฆฌ์คํธ
โข Reddit: r/apachekafka, r/dataengineering
โข Stack Overflow: kafka, apache-flink ํ๊ทธ
โข ํ๊ตญ ๋ฐ์ดํฐ ์์ง๋์ด๋ง ์ปค๋ฎค๋ํฐ
๋ธ๋ก๊ทธ์ ๋ด์ค๋ ํฐ:
โข Confluent Blog
โข Apache Flink Blog
โข Netflix Tech Blog
โข Uber Engineering Blog
โข Data Engineering Weekly
์ปจํผ๋ฐ์ค:
โข Kafka Summit (์ฐ 2ํ)
โข Flink Forward (์ฐ 2ํ)
โข Strata Data Conference
โข QCon
โข ๊ตญ๋ด: DEVIEW, if kakao
์ ์ฉํ ๋๊ตฌ๋ค:
โข Kafka UI: ์นดํ์นด ๊ด๋ฆฌ ์น ์ธํฐํ์ด์ค
โข Kafdrop: ์นดํ์นด ํ ํฝ ๋ธ๋ผ์ฐ์
โข Flink Dashboard: ์์
๋ชจ๋ํฐ๋ง
โข Schema Registry UI: ์คํค๋ง ๊ด๋ฆฌ
์ค์๊ฐ ์คํธ๋ฆผ ์ฒ๋ฆฌ๋ ๊ณ์ ๋ฐ์ ํ๋ ๋ถ์ผ๋ผ์ ์ง์์ ์ธ ํ์ต์ด ํ์ํด์. ํ์ง๋ง ํ ๋ฒ ๋ง์คํฐํ๋ฉด ์ ๋ง ๊ฐ๋ ฅํ ๋ฌด๊ธฐ๊ฐ ๋์ฃ ! ๐ช
๐ฌ ๋ง๋ฌด๋ฆฌํ๋ฉฐ
์... ์ฌ๊ธฐ๊น์ง ์ฝ์ผ์
จ๋ค๋ฉด ์ ๋ง ๋๋จํ์ธ์! ๐ ์ค์๊ฐ ๋ฐ์ดํฐ ์คํธ๋ฆผ ์ฒ๋ฆฌ ์ํคํ
์ฒ์ ๋ํด ์ ๋ง ๋ง์ ๋ด์ฉ์ ๋ค๋ค๋ค์.
ํต์ฌ๋ง ๋ค์ ์ ๋ฆฌํ๋ฉด:
1. ์ค์๊ฐ ์ฒ๋ฆฌ๋ ์ ํ์ด ์๋ ํ์: ํ๋ ๋น์ฆ๋์ค์์ ์ค์๊ฐ ์ธ์ฌ์ดํธ๋ ๊ฒฝ์๋ ฅ์ ํต์ฌ์ด์์.
2. ์ํคํ
์ฒ ์ ํ์ด ์ค์: ๋๋ค vs ์นดํ, ๋ฐฐ์น vs ์คํธ๋ฆผ - ์ํฉ์ ๋ง๋ ์ ํ์ด ํ์ํด์.
3. ๋๊ตฌ๋ณด๋ค ๊ฐ๋
: Kafka, Flink ๊ฐ์ ๋๊ตฌ๋ ๊ณ์ ๋ฐ๋์ง๋ง, ๊ธฐ๋ณธ ๊ฐ๋
์ ๋ณํ์ง ์์์.
4. ์ค์ ๊ฒฝํ์ด ์ต๊ณ : ์ด๋ก ๋ง์ผ๋ก๋ ๋ถ์กฑํด์. ์ง์ ๋ง๋ค์ด๋ณด๊ณ ์คํจํด๋ณด๋ฉด์ ๋ฐฐ์์ผ ํด์.
5. ์ปค๋ฎค๋ํฐ์ ํจ๊ป: ํผ์ ํ๋ฉด ํ๋ค์ด์. ์ปค๋ฎค๋ํฐ์ ์ฐธ์ฌํ๊ณ ์ง์์ ๊ณต์ ํ์ธ์!
์ค์๊ฐ ์คํธ๋ฆผ ์ฒ๋ฆฌ๋ ์ ๋ง ๋งค๋ ฅ์ ์ธ ๋ถ์ผ์์. ์ด๋น ์๋ฐฑ๋ง ๊ฑด์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ณ , ์ฆ๊ฐ์ ์ธ ์ธ์ฌ์ดํธ๋ฅผ ์ ๊ณตํ๊ณ , ๋น์ฆ๋์ค ๊ฐ์น๋ฅผ ์ฐฝ์ถํ๋ ๊ฒ... ์ ๋ง ๋ฉ์ง์ง ์๋์? ๐
์ฒ์์๋ ์ด๋ ต๊ฒ ๋๊ปด์ง ์ ์์ด์. ๋ถ์ฐ ์์คํ
, ๋ฉ์์ง ํ, ์คํธ๋ฆผ ์ฒ๋ฆฌ ์์ง... ๋ฐฐ์์ผ ํ ๊ฒ ์ ๋ง ๋ง๊ฑฐ๋ ์. ํ์ง๋ง ํ๋์ฉ ์ฐจ๊ทผ์ฐจ๊ทผ ๋ฐฐ์๊ฐ๋ค ๋ณด๋ฉด ์ด๋์ ์ ๋ฌธ๊ฐ๊ฐ ๋์ด ์์ ๊ฑฐ์์!
์ฌ๋ฅ๋ท ๊ฐ์ ํ๋ซํผ์์ ์์ ์ ์ง์์ ๊ณต์ ํ๊ฑฐ๋, ๋ค๋ฅธ ์ ๋ฌธ๊ฐ์๊ฒ ๋ฐฐ์ฐ๋ ๊ฒ๋ ์ข์ ๋ฐฉ๋ฒ์ด์์. ๊ฐ๋ฅด์น๋ฉด์ ๋ฐฐ์ฐ๊ณ , ๋ฐฐ์ฐ๋ฉด์ ์ฑ์ฅํ๋ ๊ฑฐ์ฃ ! ๐ฑ
๋ง์ง๋ง์ผ๋ก, ์ค์๊ฐ ์คํธ๋ฆผ ์ฒ๋ฆฌ๋ ๊ณ์ ์งํํ๋ ๋ถ์ผ์์. ์๋ก์ด ๊ธฐ์ ๊ณผ ํจํด์ด ๊ณ์ ๋์ค๊ณ ์์ฃ . ํธ๊ธฐ์ฌ์ ์์ง ๋ง๊ณ , ๊ณ์ ๋ฐฐ์ฐ๊ณ , ์คํํ๊ณ , ๋์ ํ์ธ์!
์ฌ๋ฌ๋ถ์ ์ค์๊ฐ ์คํธ๋ฆผ ์ฒ๋ฆฌ ์ฌ์ ์ ์ด ๊ธ์ด ์กฐ๊ธ์ด๋ผ๋ ๋์์ด ๋์์ผ๋ฉด ์ข๊ฒ ์ด์. ์ง๋ฌธ์ด๋ ํผ๋๋ฐฑ์ด ์๋ค๋ฉด ์ธ์ ๋ ์ปค๋ฎค๋ํฐ์์ ๋๋ ์! ๐
ํ์ดํ
! ๐ชโจ
์ค์๊ฐ ์คํธ๋ฆผ ์ฒ๋ฆฌ์ ์ธ๊ณ๋ ๋ฌด๊ถ๋ฌด์งํฉ๋๋ค.
์ค๋ ๋ฐฐ์ด ๋ด์ฉ์ ๋ฐํ์ผ๋ก ๋ด์ผ์ ๋ ๋์ ์์คํ ์ ๋ง๋ค์ด๋ณด์ธ์! ๐
๊ด๋ จ ํค์๋
๋๊ธ 0
์ง์์ธ์ ์ฒ - ์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
- ์ ์๊ถ ๋ฐ ์์ ๊ถ: ๋ณธ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ๋ ์ AI ๊ธฐ์ ๋ก ์์ฑ๋์์ผ๋ฉฐ, ๋ํ๋ฏผ๊ตญ ์ ์๊ถ๋ฒ ๋ฐ ๊ตญ์ ์ ์๊ถ ํ์ฝ์ ์ํด ๋ณดํธ๋ฉ๋๋ค.
- AI ์์ฑ ์ปจํ ์ธ ์ ๋ฒ์ ์ง์: ๋ณธ AI ์์ฑ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ์ง์ ์ฐฝ์๋ฌผ๋ก ์ธ์ ๋๋ฉฐ, ๊ด๋ จ ๋ฒ๊ท์ ๋ฐ๋ผ ์ ์๊ถ ๋ณดํธ๋ฅผ ๋ฐ์ต๋๋ค.
- ์ฌ์ฉ ์ ํ: ์ฌ๋ฅ๋ท์ ๋ช ์์ ์๋ฉด ๋์ ์์ด ๋ณธ ์ปจํ ์ธ ๋ฅผ ๋ณต์ , ์์ , ๋ฐฐํฌ, ๋๋ ์์ ์ ์ผ๋ก ํ์ฉํ๋ ํ์๋ ์๊ฒฉํ ๊ธ์ง๋ฉ๋๋ค.
- ๋ฐ์ดํฐ ์์ง ๊ธ์ง: ๋ณธ ์ปจํ ์ธ ์ ๋ํ ๋ฌด๋จ ์คํฌ๋ํ, ํฌ๋กค๋ง, ๋ฐ ์๋ํ๋ ๋ฐ์ดํฐ ์์ง์ ๋ฒ์ ์ ์ฌ์ ๋์์ด ๋ฉ๋๋ค.
- AI ํ์ต ์ ํ: ์ฌ๋ฅ๋ท์ AI ์์ฑ ์ปจํ ์ธ ๋ฅผ ํ AI ๋ชจ๋ธ ํ์ต์ ๋ฌด๋จ ์ฌ์ฉํ๋ ํ์๋ ๊ธ์ง๋๋ฉฐ, ์ด๋ ์ง์ ์ฌ์ฐ๊ถ ์นจํด๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.

๋๊ธ ์์ฑ
์ด ๊ธ์ ๋ํ ์ฌ๋ฌ๋ถ์ ์๊ฐ์ ๋ค๋ ค์ฃผ์ธ์
๋ก๊ทธ์ธ์ด ํ์ํฉ๋๋ค
๋๊ธ์ ์์ฑํ๋ ค๋ฉด ๋จผ์ ๋ก๊ทธ์ธํด์ฃผ์ธ์.