์คํ๋ง ๋ถํธ์ Kafka๋ฅผ ํ์ฉํ ์ค์ ์ฌ๋ก ์ฐ๊ตฌ: ๋ชจ๋ฒ ์ฌ๋ก์ ์ต์ ๋ํฅ
Apache Kafka ๋ ๋๊ท๋ชจ ๋ฐ์ดํฐ ์คํธ๋ฆฌ๋ฐ์ ์ฒ๋ฆฌํ๊ธฐ ์ํ ํ์ ๋๊ตฌ๋ก ์๋ฆฌ ์ก์์ผ๋ฉฐ, ์คํ๋ง ๋ถํธ ์์ ๊ฒฐํฉ์ ์ด๋ฅผ ๋ ์ฝ๊ฒ ํตํฉํ๊ณ ํ์ฅํ ์ ์๊ฒ ํฉ๋๋ค. ์ด ํฌ์คํ ์์๋ ์คํ๋ง ๋ถํธ์ Kafka ๋ฅผ ํ์ฉํ ์ค์ ์ฌ๋ก๋ฅผ ํตํด ํํ ๋ฐ์ํ๋ ๋ฌธ์ ์ ๊ณผ ํด๊ฒฐ ๋ฐฉ๋ฒ, ๊ทธ๋ฆฌ๊ณ ๊ฐ๋ฐ ๋ฐ ๋ฐฐํฌ๋ฅผ ์ํ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์์๋ด ๋๋ค. ๋ํ, ํฅํ ๋ฐ์ ๋ฐฉํฅ๊ณผ ์ต์ ๋ํฅ์ ๋ํด์๋ ๋ค๋ฃฐ ์์ ์ ๋๋ค.
1. ์คํ๋ง ๋ถํธ์ Kafka๋ฅผ ํ์ฉํ ์ค์ ์ฌ๋ก
์คํ๋ง ๋ถํธ์ Kafka๋ฅผ ์ฌ์ฉํ๋ ๋ํ์ ์ธ ์ฌ๋ก๋ ์ค์๊ฐ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์์คํ ์ ๋๋ค. ์ด๋ฅผ ํตํด ๋ก๊ทธ ์ฒ๋ฆฌ, ๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ ๊ตฌ์ถ, ์ค์๊ฐ ์๋ฆผ ์๋น์ค ๋ฑ ๋ค์ํ ๋ถ์ผ์์ Kafka๋ฅผ ํ์ฉํ ์ ์์ต๋๋ค.
์ฌ๋ก 1: ์ค์๊ฐ ๋ก๊ทธ ์ฒ๋ฆฌ ์์คํ
๊ธฐ์ A์์๋ Kafka์ ์คํ๋ง ๋ถํธ๋ฅผ ์ฌ์ฉํ์ฌ ์ค์๊ฐ์ผ๋ก ์๋ฒ ๋ก๊ทธ๋ฅผ ์์งํ๊ณ ์ฒ๋ฆฌํ๋ ์์คํ ์ ๊ตฌ์ถํ์ต๋๋ค. ๊ฐ ์๋ฒ์ ๋ก๊ทธ ๋ Kafka ํ ํฝ์ผ๋ก ์ ์ก๋๊ณ , ์๋น์ ๋ ์ด๋ฅผ ๋ถ์ํ์ฌ ์ด์ ์งํ ๋ฅผ ํ์งํ๋ ๋ฐฉ์์ผ๋ก ์ด์๋์์ต๋๋ค.
์์คํ ์ํคํ ์ฒ
[์๋ฒ ๋ก๊ทธ] -> [Kafka Producer] -> [Kafka Topic] -> [Spring Boot Consumer] -> [์๋ฆผ ์์คํ
]
์ฃผ์ ์ค์
spring:
kafka:
bootstrap-servers: localhost:9092
consumer:
group-id: log-group
auto-offset-reset: earliest
key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
producer:
key-serializer: org.apache.kafka.common.serialization.StringSerializer
value-serializer: org.apache.kafka.common.serialization.StringSerializer
๊ฒฐ๊ณผ
- ์ด์ ์งํ ํ์ง์จ ์ด 90% ์ด์ ํฅ์๋์์ผ๋ฉฐ, ์๋ฒ ๋ค์ดํ์ ์ด ๋ํญ ๊ฐ์ํ์ต๋๋ค.
- ์ค์๊ฐ ์ฒ๋ฆฌ ๋ฅผ ํตํด ๋น ๋ฅธ ๋์์ด ๊ฐ๋ฅํด์ก์ต๋๋ค.
2. ํํ ๋ฐ์ํ๋ ๋ฌธ์ ์ ๊ณผ ํด๊ฒฐ ๋ฐฉ๋ฒ
๋ฌธ์ ์ 1: ๋ฉ์์ง ์์ค ๋ฌธ์
Kafka ํด๋ฌ์คํฐ๊ฐ ๋น์ ์ ์ข ๋ฃ๋๊ฑฐ๋ ๋คํธ์ํฌ ์ฅ์ ๊ฐ ๋ฐ์ํ๋ฉด ๋ฉ์์ง๊ฐ ์์ค ๋ ์ ์์ต๋๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ:
- acks ์ค์ : ํ๋ก๋์์
acks=all
๋ก ์ค์ ํ์ฌ ๋ชจ๋ ๋ณต์ ๋ณธ์ด ๋ฉ์์ง๋ฅผ ๋ฐ์ ๋๊น์ง ๋๊ธฐํ๋๋ก ํฉ๋๋ค. - ๋ฆฌํ๋ฆฌ์ผ์ด์
ํฉํฐ :
replication.factor=3
์ผ๋ก ์ค์ ํ์ฌ ๋ฐ์ดํฐ ๋ณต์ ๋ณธ์ ์ ์งํฉ๋๋ค.
spring:
kafka:
producer:
acks: all
retries: 3
๋ฌธ์ ์ 2: ์คํ์ ๊ด๋ฆฌ ๋ฌธ์
์ปจ์๋จธ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ํ์๋ ์คํ์ ์ด ์ ์ ํ ์ปค๋ฐ๋์ง ์์ผ๋ฉด ์ค๋ณต ์ฒ๋ฆฌ ๋ ๋ฐ์ดํฐ ์ ์ค ์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ:
- ์คํ ์ปค๋ฐ ๋นํ์ฑํ :
enable.auto.commit=false
๋ก ์ค์ ํ๊ณ , ๋ช ์์ ์ผ๋ก ์คํ์ ์ ์ปค๋ฐํ๋๋ก ํฉ๋๋ค.
spring:
kafka:
consumer:
enable-auto-commit: false
๋ฌธ์ ์ 3: ์ฒ๋ฆฌ ์ฑ๋ฅ ๋ฌธ์
Kafka ํด๋ฌ์คํฐ์ ์ฒ๋ฆฌ๋์ด ์ฆ๊ฐ ํ๋ฉด์ ์ฑ๋ฅ์ด ์ ํ๋ ์ ์์ต๋๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ:
- ๋ฐฐ์น ์ฒ๋ฆฌ : ํ๋ก๋์์ ์ปจ์๋จธ์์ ๋ฉ์์ง๋ฅผ ๋ฐฐ์น ์ฒ๋ฆฌ ํ์ฌ ๋คํธ์ํฌ ๋ฆฌ์์ค๋ฅผ ์ ์ฝํฉ๋๋ค.
- ์์ถ ์ฌ์ฉ : Kafka ๋ฉ์์ง์ ๋ํด
compression.type=snappy
๋๋lz4
๋ฅผ ์ฌ์ฉํ์ฌ ๋คํธ์ํฌ ๋์ญํญ์ ์ค์ ๋๋ค.
3. ๊ฐ๋ฐ ๋ฐ ๋ฐฐํฌ๋ฅผ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
Kafka ๊ธฐ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๊ณต์ ์ธ ๊ฐ๋ฐ ๋ฐ ๋ฐฐํฌ๋ฅผ ์ํด์๋ ๋ช ๊ฐ์ง ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
1. ์ ์ ํ ํํฐ์ ์ค์
Kafka๋ ๋ฐ์ดํฐ๋ฅผ ํํฐ์ ์ผ๋ก ๋๋์ด ๋ถ์ฐ ์ฒ๋ฆฌํฉ๋๋ค. ํํฐ์ ์๊ฐ ๋๋ฌด ์ ์ผ๋ฉด ์ฑ๋ฅ์ด ์ ํ๋๊ณ , ๋๋ฌด ๋ง์ผ๋ฉด ๊ด๋ฆฌ ์ค๋ฒํค๋๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์ ์ ํ ํํฐ์ ์ ๋ฅผ ์ค์ ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
2. ๋ฉ์์ง ์์ ๋ณด์ฅ
Kafka๋ ํํฐ์ ๋ด์์ ๋ฉ์์ง ์์๋ฅผ ๋ณด์ฅํ์ง๋ง, ์ฌ๋ฌ ํํฐ์ ์ ๊ฑธ์ณ ์๋ ๊ฒฝ์ฐ ์์๋ฅผ ๋ณด์ฅํ์ง ์์ต๋๋ค. ํค ํํฐ์ ๋ ์ ํตํด ๋ฉ์์ง ์์ ๋ฅผ ๋ณด์ฅํ ์ ์์ต๋๋ค.
3. ๋ชจ๋ํฐ๋ง ๋ฐ ์๋ฆผ ์์คํ ๊ตฌ์ถ
Kafka ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ๋ฅผ ์ค์๊ฐ์ผ๋ก ๋ชจ๋ํฐ๋งํ๊ณ , ์ด์ ๋ฐ์ ์ ๋น ๋ฅธ ๋์ ์ด ๊ฐ๋ฅํ๋๋ก Prometheus ๋ฐ Grafana ์ ๊ฐ์ ๋๊ตฌ๋ฅผ ํ์ฉํ ๋ชจ๋ํฐ๋ง ์์คํ ์ ๊ตฌ์ถํด์ผ ํฉ๋๋ค.
4. ๋ฐฐํฌ ์๋ํ
CI/CD ํ์ดํ๋ผ์ธ ์ ๊ตฌ์ถํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋์ผ๋ก ๋ฐฐํฌํ๊ณ , Kafka ์ค์ ์ ๋ฒ์ ๊ด๋ฆฌํ์ฌ ๋ณ๊ฒฝ ์ฌํญ์ ์ถ์ ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
4. ํฅํ ๋ฐ์ ๋ฐฉํฅ๊ณผ ์ต์ ๋ํฅ
Kafka๋ ๊ณ์ํด์ ๋ฐ์ ํ๋ฉฐ, ์คํธ๋ฆฌ๋ฐ ์ฒ๋ฆฌ ์ ๋ฐ์ดํฐ ํตํฉ ์ ์ํ ๋ค์ํ ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋๊ณ ์์ต๋๋ค.
1. Kafka Streams์ ksqlDB์ ํ์ฅ
Kafka Streams ๋ ์คํธ๋ฆผ ์ฒ๋ฆฌ ๊ธฐ๋ฅ์ ๋์ฑ ์ฝ๊ฒ ์ ๊ณตํ๋ฉฐ, ksqlDB ๋ SQL ๊ธฐ๋ฐ์ผ๋ก ์คํธ๋ฆผ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์๊ฒ ํด์ค๋๋ค. ์ด๋ฅผ ํตํด ์ค์๊ฐ์ผ๋ก ๋ณต์กํ ๋ฐ์ดํฐ ๋ถ์๊ณผ ์ฒ๋ฆฌ๋ฅผ ์ํํ ์ ์์ต๋๋ค.
2. ํด๋ผ์ฐ๋ ๊ธฐ๋ฐ Kafka ์๋น์ค
Confluent Cloud ์ ๊ฐ์ ํด๋ผ์ฐ๋ ๊ธฐ๋ฐ Kafka ์๋น์ค๊ฐ ํ์ฐ๋๋ฉด์, Kafka๋ฅผ ์ง์ ๊ด๋ฆฌํ ํ์ ์์ด ํด๋ผ์ฐ๋์์ ๋ฐ์ดํฐ ์คํธ๋ฆฌ๋ฐ ์ ์ฝ๊ฒ ๊ตฌ์ถํ ์ ์๊ฒ ๋์์ต๋๋ค.
3. ๋ณด์ ๊ฐํ
Kafka์ SSL/TLS ์ง์๊ณผ SASL ์ธ์ฆ ์ด ๋์ฑ ๊ฐํ๋๊ณ ์์ผ๋ฉฐ, ๊ธฐ์ ํ๊ฒฝ์์ ๋ฐ์ดํฐ ์ํธํ ์ ์ฌ์ฉ์ ์ธ์ฆ ์ ํตํ ๋ณด์์ด ์ค์๋๊ณ ์์ต๋๋ค.
์์ฃผ ๋ฌป๋ ์ง๋ฌธ (FAQ)
Q1. ์คํ๋ง ๋ถํธ์ Kafka๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ ์ด์ ๋ ๋ฌด์์ธ๊ฐ์?
A1. ์คํ๋ง ๋ถํธ๋ ์ฝ๊ณ ๋น ๋ฅด๊ฒ Kafka์ ํตํฉ ํ ์ ์๋ ๋ค์ํ ์ค์ ์ ์ ๊ณตํ๋ฉฐ, ๋๊ท๋ชจ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์ ์ ํฉํ Kafka๋ฅผ ์์ฝ๊ฒ ์ ํ๋ฆฌ์ผ์ด์
์ ์ ์ฉํ ์ ์์ต๋๋ค.
Q2. Kafka์์ ๋ฉ์์ง ์์๋ฅผ ๋ณด์ฅํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ๋์?
A2. ํํฐ์
๋ด์์๋ ๋ฉ์์ง ์์๊ฐ ๋ณด์ฅ๋์ง๋ง, ์ฌ๋ฌ ํํฐ์
์ ๊ฑธ์น ๋ฉ์์ง ์์๋ฅผ ๋ณด์ฅํ๋ ค๋ฉด ํค ํํฐ์
๋ ์ ํตํด ๋ฉ์์ง๋ฅผ ํน์ ํํฐ์
์ ๊ณ ์ ์ํค๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํฉ๋๋ค.
Q3. Kafka ํด๋ฌ์คํฐ์์ ๋ฐ์ํ ์ ์๋ ์ผ๋ฐ์ ์ธ ๋ฌธ์ ๋ ๋ฌด์์ธ๊ฐ์?
A3. ๋ฉ์์ง ์์ค, ์คํ์
๊ด๋ฆฌ ๋ฌธ์ , ์ฑ๋ฅ ์ ํ ๋ฑ์ด ๋ฐ์ํ ์ ์์ผ๋ฉฐ, ์ ์ ํ ์ค์ ๊ณผ ๋ชจ๋ํฐ๋ง์ ํตํด ํด๊ฒฐํ ์ ์์ต๋๋ค.
Q4. Kafka ์ ํ๋ฆฌ์ผ์ด์
์ ์ฑ๋ฅ์ ๋ชจ๋ํฐ๋งํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ๋์?
A4. JMX(Java Management Extensions) ๋ฅผ ์ฌ์ฉํ์ฌ Kafka ํด๋ฌ์คํฐ์ ๋ค์ํ ์ฑ๋ฅ ์งํ๋ฅผ ์ถ์ ํ ์ ์์ผ๋ฉฐ, Prometheus ๋ฐ Grafana ๊ฐ์ ๋ชจ๋ํฐ๋ง ๋๊ตฌ๋ฅผ ํตํด ์ค์๊ฐ์ผ๋ก ์ฑ๋ฅ์ ๋ถ์ํ ์ ์์ต๋๋ค.
Q5. ํฅํ Kafka์ ๋ฐ์ ๋ฐฉํฅ์ ๋ฌด์์ธ๊ฐ์?
A5. ์คํธ๋ฆฌ๋ฐ ์ฒ๋ฆฌ ์ ๋ฐ์ดํฐ ํตํฉ ์ ํ์ฅ์ด ์์๋๋ฉฐ, Kafka Streams ์ ksqlDB ๊ฐ์ ๋๊ตฌ๋ค์ด ๋ ๋๋ฆฌ ์ฌ์ฉ๋ ๊ฒ์ผ๋ก ๋ณด์
๋๋ค. ๋ํ, ํด๋ผ์ฐ๋ ๊ธฐ๋ฐ Kafka ์๋น์ค ์ ํ์ฐ๊ณผ ๋ณด์ ๊ธฐ๋ฅ ๊ฐํ๊ฐ ์ฃผ๋ชฉ๋ฐ๊ณ ์์ต๋๋ค.
์ด๋ก์จ ์คํ๋ง ๋ถํธ์ Kafka๋ฅผ ํ์ฉํ ์ค์ ์ฌ๋ก ์ฐ๊ตฌ ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก ์ ๋ํ ํฌ์คํ ์ด ์๋ฃ๋์์ต๋๋ค. ์ด ํฌ์คํ ์ ์ค์ ์ฌ๋ก๋ฅผ ๋ฐํ์ผ๋ก ๋ฌธ์ ํด๊ฒฐ ๋ฐฉ์๊ณผ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์๊ฐํ์ฌ, Kafka์ ์คํ๋ง ๋ถํธ๋ฅผ ๋ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋๋ก ๋์์ค ๊ฒ์ ๋๋ค.
๋๊ธ