์๋ก
๊ธฐ์กด ๋ฐ์ดํฐ ์์คํ ์ ๊ตฌ์กฐ๋ ๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ end-to-end๋ก ์ง์ ์ฐ๊ฒฐ๋์ด ์์์ต๋๋ค. ์ด๋ฌํ ๊ตฌ์กฐ๋ ๊ฐ๋จํ์ง๋ง ๊ฐ๊ฐ์ ๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ์ด ๋ถ๋ฆฌ๋์ด ์์ด, ์๊ตฌ์ฌํญ์ด ์ฆ๊ฐํจ์ ๋ฐ๋ผ ์์คํ ์ ๋ณต์ก๋๋ฅผ ๋์ด๋ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์๊ณ , ํฌ๊ฒ ์๋์ ๊ฐ์ ๋ฌธ์ ์ ๋ค์ด ๋ฐ์ํ์ต๋๋ค.
์์คํ ๋ณต์ก๋์ ์ฆ๊ฐ
- ์ค์ํ๋ ๋ฐ์ดํฐ ์ ์ก ์์ญ์ด ์์ด, ๋ฐ์ดํฐ์ ํ๋ฆ์ ํ์ ํ๊ธฐ ์ด๋ ต๊ณ , ์์คํ ๊ด๋ฆฌ๊ฐ ๋ณต์กํจ.
- ์์คํ ์ ์ผ๋ถ๋ถ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด, ์ฐ๊ฒฐ๋ ๋ชจ๋ ์ ํ๋ฆฌ์ผ์ด์ ๋ค์ ํ์ธํด์ผ ํจ.
๋ฐ์ดํฐ ์ผ๊ด์ฑ ์ ์ง์ ์ด๋ ค์
- ๋ฐ์ดํฐ๊ฐ ์ฌ๋ฌ ์์คํ ๊ณผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ถ์ฐ๋์ด ์๋ ๊ฒฝ์ฐ, ํ ์์คํ ์์ ๋ณ๊ฒฝ๋ ๋ฐ์ดํฐ๊ฐ ๋ค๋ฅธ ์์คํ ์ ์ฆ์ ๋ฐ์๋์ง ์์ ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ์ ์ ์งํ๊ธฐ ์ด๋ ค์.
๋ฐ์ดํฐ ์ค์๊ฐ ์ฒ๋ฆฌ์ ์ด๋ ค์
- ์ ํต์ ์ธ ๋ฉ์์ง ํ ์์คํ ์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๋๋ถ๋ถ ๋ฐฐ์น ์ฒ๋ฆฌ ๋ฐฉ์์ ์ฌ์ฉํจ.
- ์ด๋ ๋ฐ์ดํฐ๋ฅผ ์ค์๊ฐ์ผ๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์ด๋ ต๋ค๋ ๊ฒ์ ์๋ฏธ.
ํ์ฅ์ฑ ์ ํ
- ๋๋ถ๋ถ์ ์ ํต์ ์ธ ๋ฉ์์ง ํ ์์คํ ์ ํ์ ๋ ๋ฆฌ์์ค ๋ด์์ ์๋ํ๋ฏ๋ก, ๋๋์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐ ์ ํ์ด ์์.
- ๋ฐ์ดํฐ์ ์์ด ์ฆ๊ฐํ๋ฉด์ ์์คํ ์ ํ์ฅํด์ผ ํ๋ ์ํฉ์์ ์ด๋ฐ ์ ํ์ด ํฐ ๋ฌธ์ ๊ฐ ๋ ์ ์์.
์ํ์น ์นดํ์นด(Apache Kafka)๋ ์ด๋ฐ ๋ฌธ์ ์ ๋ค์ ํด๊ฒฐํ๊ธฐ ์ํด ๋งํฌ๋์ธ์์ ๊ฐ๋ฐ๋์๊ณ , ํ์ฌ๋ Apache Software Foundation์ ์คํ ์์ค ํ๋ก์ ํธ๋ก ์ ์ง ๊ด๋ฆฌ๋๋ ๋ถ์ฐ ์คํธ๋ฆฌ๋ฐ ํ๋ซํผ์ ๋๋ค.
Kafka์ ๊ธฐ๋ณธ ๊ตฌ์กฐ
Kafka๋ ํฌ๊ฒ ์๋์ ๋ค ๊ฐ์ง์ ํต์ฌ ๊ตฌ์ฑ ์์๋ก ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค.
1. ํ๋ก๋์(Producer)
ํ๋ก๋์๋ Kafka์ ๋ฉ์์ง๋ฅผ ๋ฐํํ๋ ์ญํ ์ ํ๋ ์ปดํฌ๋ํธ์ ๋๋ค.
ํ๋ก๋์๋ ๋ค์ํ ๋ฐ์ดํฐ ์์ค๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ Kafka์ ํน์ ํ ํฝ์ ๋ฉ์์ง๋ฅผ ๋ฐํํฉ๋๋ค.
2. ๋ธ๋ก์ปค(Broker)
๋ธ๋ก์ปค๋ Kafka์ ํต์ฌ ์๋ฒ ์ปดํฌ๋ํธ๋ก, ํ๋ก๋์๋ก๋ถํฐ ๋ฉ์์ง๋ฅผ ๋ฐ์์ ์ ์ฅํ๊ณ , ์ปจ์๋จธ์๊ฒ ๋ฉ์์ง๋ฅผ ์ ๋ฌํ๋ ์ญํ ์ ํฉ๋๋ค.
Kafka ํด๋ฌ์คํฐ๋ ์ฌ๋ฌ ๋ธ๋ก์ปค๋ค๋ก ๊ตฌ์ฑ๋๋ฉฐ, ๊ฐ ๋ธ๋ก์ปค๋ ํ๋ ์ด์์ ํ ํฝ์ ๋ฉ์์ง๋ฅผ ์ ์ฅํ๊ณ ๊ด๋ฆฌํฉ๋๋ค.
3. ํ ํฝ(Topic)
ํ ํฝ์ Kafka์์ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฅํ๋ ๋จ์์ ๋๋ค.
ํ๋ก๋์๋ ๋ฉ์์ง๋ฅผ ํน์ ํ ํฝ์ ๋ฐํํ๊ณ , ์ปจ์๋จธ๋ ํ ํฝ์ ๊ตฌ๋ ํ์ฌ ๋ฉ์์ง๋ฅผ ์๋นํฉ๋๋ค. ํ ํฝ์ ์ฌ๋ฌ ํํฐ์ ์ผ๋ก ๋๋์ด์ง ์ ์๊ณ , ์ด๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ๊ฐ ํํฐ์ ์ ์์๊ฐ ๋ณด์ฅ๋ ๋ฉ์์ง ์คํธ๋ฆผ์ ์ ๊ณตํ๋ฉฐ, ๋ธ๋ก์ปค๊ฐ ํด๋ฌ์คํฐ ๋ด์์ ํํฐ์ ์ ๋ถ์ฐํ์ฌ ์ ์ฅํฉ๋๋ค.
4. ์ปจ์๋จธ(Consumer)
์ปจ์๋จธ๋ Kafka์ ํน์ ํ ํฝ์ ๊ตฌ๋ ํ๊ณ , ํด๋น ํ ํฝ์ ๋ฉ์์ง๋ฅผ ์๋นํ๋ ์ญํ ์ ํ๋ ์ปดํฌ๋ํธ์ ๋๋ค.
์ปจ์๋จธ๋ ํ๋ ์ด์์ ํ ํฝ์ ๊ตฌ๋ ํ ์ ์์ผ๋ฉฐ, ํ ํฝ์ ํํฐ์ ์ ๋์์ ์๋นํ ์ ์์ต๋๋ค.
Kafka์ Zookeeper์ ๊ด๊ณ
Kafka๋ Apache Zookeeper๋ฅผ ์ฌ์ฉํ์ฌ ํด๋ฌ์คํฐ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค. Zookeeper๋ ๋ธ๋ก์ปค, ํ ํฝ, ํํฐ์ ๋ฑ Kafka์ ๋ฉํ๋ฐ์ดํฐ ์ ๋ณด๋ฅผ ์ ์ฅํ๊ณ ๊ด๋ฆฌํ์ฌ Kafka ํด๋ฌ์คํฐ์ ์ํ๋ฅผ ์ผ๊ด๋๊ฒ ์ ์งํ๊ณ , ๋ธ๋ก์ปค์ ์คํจ ๋ฐ ๋ณต๊ตฌ๋ฅผ ๊ฐ์งํ๋ ๋ฑ์ ์ญํ ์ ์ํํฉ๋๋ค. ๋ฐ๋ผ์ Kafka๋ฅผ ๋์ฐ๊ธฐ ์ํด์๋ Zookeeper๊ฐ ๋ฐ๋์ ์คํ๋์ด์ผ ํฉ๋๋ค.
ํ์ง๋ง ํํฐ์ ์ด 100,000๊ฐ๊ฐ ๋์์ ๋ Kafka ํด๋ฌ์คํฐ์ ์ค์ผ์ผ๋ง ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ณ , ์ ์ง๋ณด์์ ์ค์ ๊ทธ๋ฆฌ๊ณ ์์ ์ฑ ๊ฐ์ ์ ์ํด ์ต๊ทผ Kafka๋ Zookeeper์ ์์กด์ฑ์ ์ค์ด๊ธฐ ์ํ ๋ ธ๋ ฅ์ ํ๊ณ ์์ต๋๋ค.
์ค์ ๋ก Kafka 3.x๋ถํฐ๋ Zookeeper ์์ด ์นดํ์นด๋ฅผ ๊ตฌ๋ํ ์ ์๋ Kraft(Kafka Raft Metadata mode) ๋ชจ๋๊ฐ ์ถ๊ฐ๋์์ผ๋ฉฐ Kafka 4.0๋ถํฐ๋ Zookeeper์ ์์กด์ฑ์ ์์ ํ ์ง์ด ์ค์ง KRaft๋ง ์ง์๋๋ ๋ฒ์ ์ผ๋ก ์ถ์๋ ์์ ์ ๋๋ค.(https://www.confluent.io/blog/kafka-without-zookeeper-a-sneak-peek/)
RabbitMQ์์ ์ฐจ์ด
RabbitMQ์ Kafka์ ๊ฐ์ฅ ํฐ ์ฐจ์ด์ ์ RabbitMQ๋ ์ ํต์ ์ธ ๋ฉ์์ง ๋ธ๋ก์ปค(Message Broker)์ด๊ณ , Kafka๋ ์ด๋ฒคํธ ์คํธ๋ฆฌ๋ฐ ํ๋ซํผ(Event Streaming Platform)์ด๋ผ๋ ์ ์ ๋๋ค.
์์ ๊ฐ์ด ๋ฐํ์(Publisher)๊ฐ Message Exchange์ ๋ฉ์์ง๋ฅผ ๋ณด๋ด๋ฉด, ๊ตฌ๋ ์(Subscriber)๊ฐ ๋ฉ์์ง๋ฅผ ๊ตฌ๋ ํฉ๋๋ค. ์ฌ๋ฌ ๊ฐ์ Publisher๊ฐ Message Exchange์ ๋ฉ์์ง๋ฅผ ๋ณด๋ด๋ฉด, ์ ํด์ง ๊ท์น์ ๋ฐ๋ผ์ ํ์ Routing์ด ๋๊ณ , Consumer๋ค์ด ๋ฉ์์ง๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.(์ฌ๊ธฐ์ Kafka์ ๋ค๋ฅธ ์ ์ Kafka๋ ํ๋ฅผ ๊ตฌํํ์ง ์๋๋ค๋ ์ ์ ๋๋ค. Kafka๋ ์์์ ๋ดค๋ฏ์ด ํ ํฝ(Topic)์ผ๋ก ๋ถ๋ฆฌ๋ ์นดํ ๊ณ ๋ฆฌ์ ๋ฐ์ดํฐ ์งํฉ์ ์ ์ฅํ๋ฉฐ, ๊ฐ๊ฐ์ ํ ํฝ์ ๋ถํ ๋ ๋ฉ์์ง ๋ก๊ทธ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.)
๊ทธ๋ฆฌ๊ณ ์ปจ์๋จธ๊ฐ ๋ฉ์์ง๋ฅผ ๊ฐ์ ธ๊ฐ๋ฉด ํ์๋ ๋ ์ด์ ๋จ์ง ์๊ณ ์ฌ๋ผ์ง๊ฒ ๋ฉ๋๋ค. ์ด๋ฌํ ์ ํต์ ์ธ ๋ฉ์์ง ๋ธ๋ก์ปค์ ํํ๋ ์๋น์์ ๋ฉ์์ง ๋ธ๋ก์ปค์ ๊ฒฐํฉ๋ ฅ์ด ๋์์ง๊ฒ ๋์ด ํ์ ์๋น์ค์ ํธ๋ํฝ์ด ์ฆ๊ฐํ์์ ๋ ์ํ์ ์ผ๋ก ํ์ฅํ๋ ๋ฐ์ ์ด๋ ค์์ด ์์์ผ๋ฉฐ, ์ด๋ฒคํธ ๋ฉ์์ง๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์ ๋ฌ๋์๋ค๊ณ ํ๋จ๋ ๊ฒฝ์ฐ ์ด ๋ฉ์์ง๋ ํ์์ ์ญ์ ๋์ด ๋ฒ๋ฆฌ๊ธฐ ๋๋ฌธ์ ํ์ ๋ค์ ์ด๋ฒคํธ๋ฅผ ๋ฐ๊ธฐ๊ฐ ์ด๋ ต๋ค๋ ๋จ์ ์ด ์กด์ฌํ์ต๋๋ค.
์นดํ์นด๋ ์ด๋ฌํ ๋จ์ ์ ๊ทน๋ณตํ๋ฉฐ ์๊ธด ์ด๋ฒคํธ ์คํธ๋ฆฌ๋ฐ ํ๋ซํผ์ผ๋ก์จ, ๋ฉ์์ง ๋ธ๋ก์ปค์ ์ด๋ฒคํธ ์คํธ๋ฆฌ๋ฐ ํ๋ซํผ ๋ชจ๋ ์ด๋ฒคํธ๋ฅผ ์์ ํ๊ณ , ์ด๊ฒ์ ์๋น์์๊ฒ ์ ๋ฌํ๋ ๋ฐ์ ๋ชฉ์ ์ ๋๊ณ ์์ง๋ง ์๋ ๋ฐฉ์์ ํฐ ์ฐจ์ด๊ฐ ์์ต๋๋ค.
์ด๋ฒคํธ ์คํธ๋ฆฌ๋ฐ ํ๋ซํผ์ ๋ฉ์์ง ๋ธ๋ก์ปค์ ๋ค๋ฅด๊ฒ ํ ํฝ(Topic)์ด๋ผ๋ ๊ฒ์ด Event Streamer์ ์ ์ฅ๋ฉ๋๋ค. Event producer๊ฐ ์ด๋ฒคํธ๋ฅผ ์์ฑํ๋ฉด, ํ ํฝ์ด๋ผ๊ณ ๋ถ๋ฆฌ๋ ์ด๋ฒคํธ์ ๋ ์ฝ๋ ๋ก๊ทธ๋ฅผ streamer์ ์์๋๋ก ๊ธฐ๋กํ๊ฒ ๋ฉ๋๋ค. ๊ทธ ํ ํด๋น ํ ํฝ์ ๊ตฌ๋ (subscribe)ํ ์ปจ์๋จธ์๊ฒ ์ ๋ฌํ๊ฒ ๋ฉ๋๋ค. ๋ํ ์ด ํ ํฝ์ ์ปจ์๋จธ๊ฐ ๊ฐ์ ธ๊ฐ ํ์๋ ์ด๋ฒคํธ ์คํธ๋ฆผ์์ ๊ณ์ ํ ํฝ์ ์ ์งํ๊ธฐ ๋๋ฌธ์ ์ฅ์ ๋ฐ์ ์ํฉ์์๋ ์ด๋ฒคํธ๋ฅผ ๋ค์ ๋ฐํํ ์ ์์ต๋๋ค.
Kafka vs RabbitMQ | RabbitMQ | Kafka |
์ฑ๋ฅ | ์ด๋น 4,000 ~ 10,000๊ฐ์ ๋ฉ์์ง ์ฒ๋ฆฌ ๊ฐ๋ฅ | ์ด๋น 1,000,000 ๊ฐ์ ๋ฉ์์ง ์ฒ๋ฆฌ ๊ฐ๋ฅ |
๋ฉ์์ง ์๋ช ์ฃผ๊ธฐ | ์๋น๋๋ ์๊ฐ ์ญ์ | ์ ์ฑ ๊ธฐ๋ฐ(์ค์ ํ ๊ธฐ๊ฐ๋งํผ) |
ํธ๋์ญ์ ๋ฐ์ดํฐ | ์ค๋ณต ๋ฉ์์ง ๋ฐ์ก ๋ฐ ๋ฉ์์ง ์์ค ๊ฐ๋ฅ์ฑ ์กด์ฌ | ์์ ๋ณด์ฅ ๋ฐ ๋ฉ์์ง ์ ์ค ๊ฐ๋ฅ์ฑ์ด ์ ์ |
์ด์ ๋ฐ์ดํฐ | ๋ผ์ฐํ , ํด๋ฌ์คํฐ๋ง, ๋ฉ์์ง ํ์ธ ๋ฑ์ ์ด์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ๊ฐ์ | ๋๋์ ์ค์๊ฐ ๋ก๊ทธ ๋๋ ์คํธ๋ฆผ ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ๊ฐ์ |
ํด๋ฌ์คํฐ๋ง | ํด๋ฌ์คํฐ๋ง ์ง์, ๋ ธ๋ ๊ฐ ๋ฉ์์ง ๋ณต์ ๋ก ๊ณ ๊ฐ์ฉ์ฑ ์ ๊ณต | ํด๋ฌ์คํฐ๋ง ์ง์, ์๋ ๋ณต์ ์ ํํฐ์ ๋์ ํตํด ๊ณ ๊ฐ์ฉ์ฑ ๋ฐ ์ฅ์ ๋ณต๊ตฌ ๊ธฐ๋ฅ ์ ๊ณต |
๋ฉ์์ง ๋ชจ๋ธ | Queue์ Topic ๋ชจ๋ธ ์ง์ | Topic ๋ชจ๋ธ๋ง ์ง์ |
์ค์ผ์ผ๋ง | ์ค์ผ์ผ ์ ์ ์ ํฉ | ์ค์ผ์ผ ์์์ ์ ํฉ, ๋๋์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ ๋์ ํ์ฅ์ฑ |
๋ ์์ธํ ์ฐจ์ด์ ์ ๋งํฌ์์ ํ์ธ ๊ฐ๋ฅํฉ๋๋ค.
Spring Boot + Kafka ์ฐ๋
ํ ์คํธ ํ๊ฒฝ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- Spring Boot 2.7 + Java 11 + gradle
- Docker kafka & Zookeeper
๊นํ๋ธ: https://github.com/dkswnkk/Spring-Playground/tree/main/kafka-run-practice
Producer Application Project
1. ์์กด์ฑ ์ถ๊ฐ
// kafka
implementation 'org.springframework.kafka:spring-kafka'
2. Producer Config ์ค์
@Configuration
public class KafkaProducerConfig {
@Bean
public ProducerFactory<String, Object> producerFactory() {
Map<String, Object> config = new HashMap<>();
config.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
config.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
config.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
return new DefaultKafkaProducerFactory<>(config);
}
@Bean
public KafkaTemplate<String, Object> kafkaTemplate() {
return new KafkaTemplate<>(producerFactory());
}
}
์ค์ ๋ ์์ฑ์ ๋ํ ์ค๋ช ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- BOOTSTRAP_SERVERS_CONFIG: Producer๊ฐ ์ฒ์์ผ๋ก ์ฐ๊ฒฐํ Kafka ๋ธ๋ก์ปค์ ์์น๋ฅผ ์ค์ ํฉ๋๋ค. ํ์ฌ ์ฝ๋์ ๊ฒฝ์ฐ localhost์ 9092 ํฌํธ์ ์์นํ๋๋ก ์ค์ ํ์ต๋๋ค.
- KEY_SERIALIZER_CLASS_CONFIG & VALUE_SERIALIZER_CLASS_CONFIG: Producer๊ฐ Key์ Value ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ Kafka ๋ธ๋ก์ปค๋ก ์ ์กํ๊ธฐ ์ ์ ๋ฐ์ดํฐ๋ฅผ byte array๋ก ๋ณํํ๋ ๋ฐ ์ฌ์ฉํ๋ ์ง๋ ฌํ ๋ฉ์ปค๋์ฆ์ ์ค์ ํฉ๋๋ค. Kafka๋ ๋คํธ์ํฌ๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๊ธฐ ๋๋ฌธ์, ๊ฐ์ฒด๋ฅผ byte array๋ก ๋ณํํ๋ ์ง๋ ฌํ ๊ณผ์ ์ด ํ์ํฉ๋๋ค. ๋ฐ๋ผ์, StringSerializer๋ฅผ ์ฌ์ฉํด ์ง๋ ฌํํ์ต๋๋ค.
KafkaTemplate๋ Spring Kafka์์ ์ ๊ณตํ๋ Kafka Producer๋ฅผ Wrapping ํ ํด๋์ค์ ๋๋ค. KafkaTemplate๋ Kafka์ ๋ฉ์์ง๋ฅผ ๋ณด๋ด๋ ์ฌ๋ฌ ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ฉฐ, ์ด ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ธ๋ก์ปค๋ก ๋ฉ์์ง๋ฅผ ๋ณด๋ด๊ธฐ ์ํด ์ง์ Kafka Producer API๋ฅผ ์ฌ์ฉํ๋ ๋์ , send์ ๊ฐ์ ๋ฉ์๋๋ฅผ ํตํด ๋ ํธ๋ฆฌํ๊ณ ๊ฐ๊ฒฐํ ์ฝ๋๋ก ๋ฉ์์ง๋ฅผ ๋ณด๋ผ ์ ์์ต๋๋ค.
3. Producer ์์ฑ
package com.example.kafkarunpractice.producer;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.stereotype.Component;
@Component
public class TestProducer {
private final KafkaTemplate<String, Object> kafkaTemplate;
public TestProducer(KafkaTemplate<String, Object> kafkaTemplate) {
this.kafkaTemplate = kafkaTemplate;
}
public void create() {
kafkaTemplate.send("topic", "say hello~");
}
}
Consumer Application Project
1. ์์กด์ฑ ์ถ๊ฐ
// kafka
implementation 'org.springframework.kafka:spring-kafka'
2. Consumer Config ์ค์
@Configuration
public class KafkaConsumerConfig {
@Bean
public ConsumerFactory<String, Object> consumerFactory() {
Map<String, Object> config = new HashMap<>();
config.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
config.put(ConsumerConfig.GROUP_ID_CONFIG, "group_1");
config.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
config.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
return new DefaultKafkaConsumerFactory<>(config);
}
@Bean
public ConcurrentKafkaListenerContainerFactory<String, Object> kafkaListenerContainerFactory() {
ConcurrentKafkaListenerContainerFactory<String, Object> factory = new ConcurrentKafkaListenerContainerFactory<>();
factory.setConsumerFactory(consumerFactory());
return factory;
}
}
ConsumerConfig.GROUP_ID_CONFIG๋ Consumer๊ฐ ์ํ Consumer ๊ทธ๋ฃน์ ID๋ฅผ ์ค์ ํฉ๋๋ค. Consumer ๊ทธ๋ฃน์ ๊ฐ์ ํ ํฝ์ ์๋นํ๋ Consumer๋ค์ ๊ทธ๋ฃน์ผ๋ก, ๊ทธ๋ฃน ๋ด์ ๋ชจ๋ Consumer๋ ํ ํฝ์ ์๋ก ๋ค๋ฅธ ํํฐ์ ์์ ๋ฉ์์ง๋ฅผ ์ฝ์ด ๋ค์ ๋๋ค.
์ด๋ฅผ ํตํด ๋ฉ์์ง ์ฒ๋ฆฌ๋ฅผ ๋ณ๋ ฌํ ํ์ฌ ์ฒ๋ฆฌ ์๋๋ฅผ ํฅ์์ํฌ ์ ์์ผ๋ฉฐ, Consumer๊ฐ ์คํจํ ๊ฒฝ์ฐ ๋ค๋ฅธ Consumer๊ฐ ํด๋น Consumer์ ํํฐ์ ์ ์ฒ๋ฆฌํ์ฌ ๊ณ ๊ฐ์ฉ์ฑ์ ์ ๊ณตํ ์ ์์ต๋๋ค. ConcurrentKafkaListenerContainerFactory๋ Spring์ @KafkaListener ์ด๋ ธํ ์ด์ ์ด ๋ถ์ ๋ฉ์๋์ ์ฃผ์ ๋์ด ์ฌ์ฉ๋๋ฉฐ, ๋ฉ์์ง๋ฅผ ๋์์ ์ฒ๋ฆฌํ ์ ์๋ ๋ฉ์์ง ๋ฆฌ์ค๋ ์ปจํ ์ด๋๋ฅผ ์์ฑํฉ๋๋ค.
3. Consumer ์์ฑ
@Component
public class TestConsumer {
@KafkaListener(topics = "topic", groupId = "group_1")
public void listener(Object data) {
System.out.println(data);
}
}
Kafka & Zookeeper ์คํ
docker-compose.yml ์ค์
version: '2'
services:
zookeeper:
image: wurstmeister/zookeeper
container_name: zookeeper
ports:
- "2181:2181"
kafka:
image: wurstmeister/kafka:2.12-2.5.0
container_name: kafka
ports:
- "9092:9092"
environment:
KAFKA_ADVERTISED_HOST_NAME: 127.0.0.1
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
volumes:
- /var/run/docker.sock:/var/run/docker.sock
Docker Compose๋ฅผ ์ด์ฉํ์ฌ Kafka์ Zookeeper๋ฅผ ๋์ปค ์ปจํ ์ด๋๋ก ์คํ์ํต๋๋ค. Zookeeper๋ ๊ธฐ๋ณธ์ ์ผ๋ก 2181 ํฌํธ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ์ปดํฌ์ฆ ์คํ: docker-compose up -d
- ์ปดํฌ์ฆ ์ข ๋ฃ: docker-compose down
ํ ์คํธ
Consumer Application Project๋ฅผ ์คํํ๊ณ , Produce Application Project์์ ์์ฑํ ์๋์ ํ ์คํธ ๋ฉ์๋๋ฅผ ์คํํ์ต๋๋ค.
@SpringBootTest
class TestProducerTest {
@Autowired
private TestProducer testProducer;
@Test
void test() {
testProducer.create();
}
}
์ ์์ ์ผ๋ก Producer Application์์ ๋ฐํํ ํ ํฝ์ด Consumer Application์์ ์๋น๋๋ ๊ฑธ ํ์ธํ ์ ์์ต๋๋ค.
๊ฐ์ด ๋ณด๋ฉด ์ข์ ๊ธ
'BackEnd๐ฑ > Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
WebClient์์ ์๋ฌ ์ฒ๋ฆฌ์ ์ฌ์๋ํ๋ ๋ฐฉ๋ฒ (0) | 2023.08.03 |
---|---|
Spring Batch๋? ๊ฐ๋จํ ๊ฐ๋ ๊ณผ ์ฝ๋ ์ดํด๋ณด๊ธฐ (0) | 2023.07.29 |
์คํ๋ง์์ @Async๋ฅผ ์ฌ์ฉํ ๋ ์ฃผ์์ (4) | 2023.07.24 |
์คํ๋ง ์ด๋ฒคํธ ๋ฐํ๊ณผ ๊ตฌ๋ ์ผ๋ก ํธ๋์ญ์ ๋ถ๋ฆฌํ๊ธฐ (1) | 2023.07.09 |
SSE๋ก ์๋ฆผ ๊ธฐ๋ฅ ๊ตฌํํ๊ธฐ with Spring (7) | 2023.06.18 |
Gradle๋ก ๋ฉํฐ๋ชจ๋ ํ๋ก์ ํธ ๊ตฌ์ฑํ๊ธฐ (4) | 2023.03.04 |
๋๊ธ