์ฃผํคํผ
- ์นดํ์นด ํด๋ฌ์คํฐ ๊ด๋ฆฌ ์ฉ๋๋ก๋ง ๊ฐ๋ตํ ์๊ณ ๋์ด๊ฐ์
- ๊ธฐ์กด์๋ ์นดํ์นด ์ฌ์ฉ ์ ์ฃผํคํผ๊ฐ ํ์์์ผ๋, ์ฃผํคํผ ์ฌ์ฉ์ ์ ์ฝ์ฌํญ์ด๋ ํ๊ณ์ฑ์ ์ํด ์ฃผํคํผ์ ์นดํ์นด์ ์ฐ๊ฒฐ๊ณ ๋ฆฌ๋ฅผ ๋๊ณ ์๋ค.
Apache Kafka 2.8 ๋ฒ์ ๋ถํฐ ์ฃผํคํผ ๋์ kraft ๋ฅผ ์ฌ์ฉํ ์ ์์ผ๋, 2.8.x ๋ฒ์ ๋ถํฐ 3.2.x ๋ฒ์ ๊น์ง๋ ๊ฐ๋ฐ ๋จ๊ณ(์ผ๋ฆฌ ์ก์ธ์ค,early access) ์ ๋๋ค. Kafka 3.3.1 ๋ฒ์ ์์ ๋ถํฐ Production(์ด์)์์ ์ฌ์ฉํ ์ค๋น๊ฐ ๋์์ ๋ฐํํ๋ฉด์ KRaft ์ง์๊ณผ ZooKeeper ์ง์์ข ๋ฃ(์ ๊ฑฐ)์ ๋ํ ๋ฆด๋ฆฌ์ฆ ํ์๋ผ์ธ์ ๋ฐํ ํ์์ต๋๋ค.
๋ธ๋ก์ปค
- ์ผ๋ฐ์ ์ผ๋ก ์นดํ์นด๋ผ๊ณ ๋ถ๋ฆฌ๋ ์์คํ (์ดํ๋ฆฌ์ผ์ด์ )์ ๋งํ๋ค.
์ปจํธ๋กค๋ฌ
- ๋ค์์ ๋ธ๋ก์ปค ์ค ํ๋๊ฐ ์ปจํธ๋กค๋ฌ ์ญํ ์ ํ๋ค
- ํํฐ์ ํ ๋น, ์ ์ ๋์ ๋ชจ๋ํฐ๋ง
- ๋ธ๋ก์ปค์ ์ํ๋ฅผ ์ฒดํฌํ๊ณ , ๋ธ๋ก์ปค๊ฐ ํด๋ฌ์คํฐ์์ ๋น ์ง๋ ๊ฒฝ์ฐ ํด๋น ๋ธ๋ก์ปค์ ์กด์ฌํ๋ ๋ฆฌ๋ ํํฐ์ ์ ์ฌ๋ถ๋ฐฐํ๋ ์ญํ ์ ํ๋ค.
- ๋ค์์ ๋ธ๋ก์ปค ์ค ํ๋๊ฐ ์ปจํธ๋กค๋ฌ ์ญํ ์ ํ๋ค
๊ทธ๋ฃน ์ฝ๋๋ค์ดํฐ
- ๋ค์์ ๋ธ๋ก์ปค ์ค ํ๋๊ฐ ์ฝ๋๋ค์ดํฐ ์ญํ ์ ํ๋ค
- ์ปจ์๋จธ ๊ทธ๋ฃน์ ์ํ๋ฅผ ์ฒดํฌํ๊ณ ํํฐ์ ์ ์ปจ์๋จธ์ ๋งค์นญ๋๋๋ก ๋ถ๋ฐฐํ๋ ์ญํ
- ์ปจ์๋จธ๋ฅผ ์ฌํ ๋นํ๋ ๊ณผ์ ์ ๋ฆฌ๋ฐธ๋ฐ์ค๋ผ๊ณ ํ๋ค.
- ๋ค์์ ๋ธ๋ก์ปค ์ค ํ๋๊ฐ ์ฝ๋๋ค์ดํฐ ์ญํ ์ ํ๋ค
- ๋ฉ์์ง ์ ์ฅ๊ณผ ๋ฉ์ธ์ง ํ์ผ ๊ด๋ฆฌ
- ๋ธ๋ก์ปค๋ ํ๋ก๋์๋ก๋ถํฐ ์ ๋ฌ๋๋ ๋ฉ์ธ์ง๋ฅผ ๋ก๊ทธํํ๋ก log.dir์ ์ค์ ํ ๊ฒฝ๋ก์ ์ ์ฅํ๋ค.
- ๊ฐ ๋ธ๋ก์ปค์ ์ ์ฅ๋๋ ๋ฉ์ธ์ง๋ ํํฐ์ ๋ณ๋ก ์ธ๊ทธ๋จผํธ๋ผ๋ ํ์ผ๋ก ์ ์ฅ๋๋ค.
- ๋ฐ์ดํฐ ์ญ์
- ๋ก๊ทธ ์ธ๊ทธ๋จผํธ ๋จ์๋ก ์ญ์ ํ๋ค
- Delete ์ต์
์ ์ํด ์ผ์ ์๊ฐ์ด๋ ์ฉ๋์ ๋ฐ๋ผ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๋ค
- ์กํฐ๋ธ๊ฐ ์๋ ์ธ๊ทธ๋จผํธ๋ฅผ ์ญ์ ํ๋ค.
- ๋ ์ฝ๋๋จ์ ๊ฐ๋ณ ์ญ์ ๋ ๋ถ๊ฐ๋ฅํ๋ค.
- ๋ณดํต 3์ผ์ ๋๋ก ์ ์งํ๋ ๊ฒ์ด ์ผ๋ฐ์ (๊ธ, ํ , ์ผ)
- ๋ธ๋ก์ปค๊ฐ ์ธ๊ทธ๋จผํธ๊ฐ ์ญ์ ์์ญ์ ๋ค์ด์๋์ง ๊ณ์ ํ์ธํด์ ์ญ์ ํ๋ค.
- ์กํฐ๋ธ๊ฐ ์๋ ์ธ๊ทธ๋จผํธ๋ฅผ ์ญ์ ํ๋ค.
- Compact ์ต์
์ผ๋ก ๊ฐ์ฅ ์ต์ ์ ๋ฉ์ธ์งํค๋ฅผ ์ ์ธํ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ ์๋ ์๋ค.
- ์กํฐ๋ธ ์ธ๊ทธ๋จผํธ๋ฅผ ์ ์ธํ ๋๋จธ์ง ์ธ๊ทธ๋จผํธ์ ํํด์ ์ด๋ฃจ์ด์ง๋ค.
- ํด๋ฆฐ ๋ก๊ทธ : ์์ถ์ด ์๋ฃ๋ ๋ก๊ทธ
- ๋ํฐ ๋ก๊ทธ : ์์ถ์ด ์๋ฃ๋์ง ์์ ๋ก๊ทธ(์ค๋ณต๋ ๋ฉ์ธ์ง ํค๊ฐ ์๋ค)
- ํด๋ฆฐ๋ ์ฝ๋์ ๊ฐ์์ ๋ํฐ๋ ์ฝ๋์ ๊ฐ์์ ๋ฐ๋ผ ์์ถ์์์ ์ํํ๊ฒ ๋๋ค.
- 4:4 โ 50% / 50%๊ฐ ๋๋ฌ ํ์ ๋ ์์ถํ๊ฒ ๋ค ์ด๋ฐ์์ผ๋ก ์ค์ ๊ฐ๋ฅ
- ๋ณต์
- ํํฐ์ ๋จ์๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณต์ ํ๋ค.
- ํ ํฝ ์์ฑํ ๋ ํํฐ์ ์ ๋ณต์ ๊ฐ์๋ฅผ ์ค์ ํ๋ค. (์ค์ ์ํ๋ฉด ๋ธ๋ก์ปค์ ๊ธฐ๋ณธ ์ค์ )
- ์ต์๊ฐ 1 (๋ณต์ ์์) ~ ์ต๋๊ฐ (๋ธ๋ก์ปค์ ๊ฐ์๋งํผ)
- ๋ณดํต 2-3์ ๋๋ก ์ค์ ํ๋ค.
- ๋ฆฌ๋ ํํฐ์ : ํ๋ก๋์, ์ปจ์๋จธ๋ ์ง์ ์ ์ธ ํต์ ์ ํ๋ค
- ํ๋ก์ ํํฐ์ : ๋ฐ์ดํฐ๋ฅผ ๋ณต์ ๋ง ํ๋ค.
ํ๋ก๋์

์ด๋ฒคํธ๋ฅผ ๋ฐํ
ํ๋ ํด๋ผ์ด์ธํธ ์ดํ๋ฆฌ์ผ์ด์ - ํ๋ก๋์๋ ๋ผ์ฐํ
๊ณ์ธต์์ด ํํฐ์
์ ๋ฆฌ๋์ธ ๋ธ๋ก์ปค์ ๋ฐ์ดํฐ๋ฅผ ์ง์ ์ ์กํ๋ค.
- ์ด๋ ๊ฒ ํ ์ ์๊ธฐ ์ํด์๋ ๋ชจ๋ ์นดํ์นด ๋
ธ๋๋ ์ธ์ ๋ ์ง ์ด๋ค ์๋ฒ๊ฐ ํ์ฑ ์ํ์ด๊ณ , ํ ํฝ ํํฐ์
์ ๋ฆฌ๋๋ ๋๊ตฌ์ธ์ง์ ๋ํ ๋ฉํ๋ฐ์ดํฐ ์์ฒญ์ ์๋ตํ ์ ์์ด์ผ ํ๋ค.
๋ฉํ๋ฐ์ดํฐ
- ์นดํ์นด ํด๋ผ์ด์ธํธ๋ ํต์ ํ๊ณ ์ํ๋ ๋ฆฌ๋ ํํฐ์ ์ ์์น๋ฅผ ์๊ธฐ ์ํด ๋ฉํ๋ฐ์ดํฐ๋ฅผ ๋ธ๋ก์ปค๋ก๋ถํฐ ์ ๋ฌ ๋ฐ๋๋ค
- ๋ฉํ ๋ฐ์ดํฐ ์บ์ ์ ์งํ๋ ๊ธฐ๊ฐ ์ค์ ๊ฐ๋ฅ
- ๋ฉํ ๋ฐ์ดํฐ์ ์ด์๊ฐ ๋ฐ์ํ๋ค๋ฉด? ์๋ชป๋ ๋ธ๋ก์ปค๋ก ์์ฒญ โ leader_not_avaliable ์ต์ ์ ๋ฐ์
- ์ด๋ ๊ฒ ํ ์ ์๊ธฐ ์ํด์๋ ๋ชจ๋ ์นดํ์นด ๋
ธ๋๋ ์ธ์ ๋ ์ง ์ด๋ค ์๋ฒ๊ฐ ํ์ฑ ์ํ์ด๊ณ , ํ ํฝ ํํฐ์
์ ๋ฆฌ๋๋ ๋๊ตฌ์ธ์ง์ ๋ํ ๋ฉํ๋ฐ์ดํฐ ์์ฒญ์ ์๋ตํ ์ ์์ด์ผ ํ๋ค.
Partitioner
- ์ด๋ ํํฐ์ ์ผ๋ก ํ ํฝ์ ์ ์กํ ์ง ์ค์ ํ๋ค.
- ์ปจ์๋จธ๊ฐ ์ง์ญ์ฑ์ด ์ค์ํ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์๊ฒ ํด์ค๋ค.
- ํํฐ์ ๊ฐ์๊ฐ ๋ณ๊ฒฝ๋๋ ์๊ฐ, ๋ฉ์ธ์ง ํค์ ํํฐ์ ๋ฒํธ ๋งค์นญ์ด ๊นจ์ง๊ฒ ๋จ. ์ฒ์๋ถํฐ ํํฐ์ ๊ทธ๋ฅ ์ถฉ๋ถํ ํฐ ๊ฐ์๋ก ์ด์ํด๋ผ
- UniformStickyPartitioner : ๊ธฐ๋ณธ๊ฐ
- ๋ฉ์ธ์ง ํค๊ฐ ์๋๊ฒฝ์ฐ : ํด์๊ฐ๊ณผ ํํฐ์ ๋งค์นญ
- ๋ฉ์ธ์ง ํค๊ฐ ์๋๊ฒฝ์ฐ : ๋ผ์ด๋๋ก๋น ํจ์จ ๊ทน๋ํ
- ๋ฐฐ์น๋ก ๋ฌถ์ผ๋๊น์ง ๊ธฐ๋ค๋ ธ๋ค๊ฐ ์ ์กํ๋ค
- RoundRobinPartitioner
- ๋ฉ์ธ์ง ํค๊ฐ ์๋๊ฒฝ์ฐ : ํด์๊ฐ๊ณผ ํํฐ์ ๋งค์นญ
- ๋ฉ์ธ์ง ํค๊ฐ ์๋๊ฒฝ์ฐ : ํํฐ์ ์ํ
- ๋ผ์ด๋๋ก๋น or ์๋ฏธ ๋ถ์ฌํด์ ํํฐ์
๋ ๋ฑ๋ฑ
- ์ง์ ๊ตฌํ๋ ๊ฐ๋ฅ
- ์ต์
- bootstrap.servers : ์ฐ๊ฒฐํ ์๋ฒ ์ ๋ณด
- key.serializer, value.serializer : ์ง๋ ฌํ, ์ญ์ง๋ ฌํ ํด๋์ค
- partitioner.class : ํํฐ์ ๋ ํด๋์ค
- retries : ์๋ฌ ๋ฌ์ ๋ ์ฌ์๋ํ ํ์
- acks : ๋ธ๋ก์ปค๋ค์ ์ ์์ ์ผ๋ก ์ ์ฅ๋์๋์ง ์ ์ก ์ฑ๊ณต ์ฌ๋ถ ํ์ธ
- ๋ฐ์ดํฐ๋ฅผ ํ๋ก๋์ฑํ๊ณ ๋ํ๋ฆฌ์นด๊ฐ ์น์ธํ ๋๊น์ง ๊ธฐ๋ค๋ฆฐ๋ค
- 0 : ๋ฐ์ดํฐ ์ ์กํ ๋, ๋ฆฌ๋ํํฐ์ ์ ๋ฐ์ดํฐ ์ ์ฅ๋์๋์ง ํ์ธํ์ง ์๊ฒ ๋ค. ๋ฐ์ดํฐ ์ ์ค ๊ด์ฐฎ์ ๋ ์ฌ์ฉ
- 1 (๋ฆฌ๋์๋ง ์ ์ ์ฌ๋๋ฉด ์ฑ๊ณต) : ๊ธฐ๋ณธ๊ฐ
- -1 : min.insync.replicas ์ต์ ๊ฐ์ ์ง์ ๋ ๊ฐ์๋งํผ ํ์ธ
- ๋ฐ์ดํฐ๋ฅผ ํ๋ก๋์ฑํ๊ณ ๋ํ๋ฆฌ์นด๊ฐ ์น์ธํ ๋๊น์ง ๊ธฐ๋ค๋ฆฐ๋ค
- send : Future ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค.
- ๋๊ธฐ, ๋น๋๊ธฐ๋ก ๊ฒฐ๊ณผ ํ์ธ ๊ฐ๋ฅ
KafkaProducer Client

KafkaProducer
:send()
๋ฅผ ํธ์ถํจ์ผ๋ก์จ Record๋ฅผ ์ ์กํ๋ค.- ์ฌ์ฉ์๋ send() ํธ์ถ ์ ์ ์กํ Record์ ์ ์ก ์๋ฃ ํ ์คํํ ์ฝ๋ฐฑ์ ์ง์ ํ ์ ์๋ค. send()๊ฐ ํธ์ถ๋๋ฉด Serialization, Partitioning, Compression ์์
์ด ์ด๋ฃจ์ด์ง๊ณ ์ต์ข
์ ์ผ๋ก
RecordAccumulator
์ Record๊ฐ ์ ์ฅ๋๋ค.
- ์ฌ์ฉ์๋ send() ํธ์ถ ์ ์ ์กํ Record์ ์ ์ก ์๋ฃ ํ ์คํํ ์ฝ๋ฐฑ์ ์ง์ ํ ์ ์๋ค. send()๊ฐ ํธ์ถ๋๋ฉด Serialization, Partitioning, Compression ์์
์ด ์ด๋ฃจ์ด์ง๊ณ ์ต์ข
์ ์ผ๋ก
RecordAccumulator
- ์ฌ์ฉ์๊ฐ KafkaProducer์ send()๋ฅผ ํธ์ถํ๋ฉด Record๊ฐ ๋ฐ๋ก Broker๋ก ์ ์ก๋๋ ๊ฒ์ด ์๋๋ผ RecordAccumulator์ ์ ์ฅ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ค์ ๋ก Broker์ ์ ์ก๋๋ ๊ฒ์ ์ดํ์ ๋น๋๊ธฐ์ ์ผ๋ก ์ด๋ฃจ์ด์ง๋ค.
- RecordAccumulator๋
batches
๋ผ๋ Map์ ๊ฐ์ง๊ณ ์๋๋ฐ- ์ด Map์ Key๋
TopicPartition
์ด๊ณ , Value๋Deque<RecordBatch>
์ด๋ค. - RecordAccumulator์ append()๊ฐ ํธ์ถ๋๋ฉด batches์์ ์ถ๊ฐ๋ Record์ ํด๋นํ๋ TopicPartition์ Deque๋ฅผ ์ฐพ๋๋ค. ์ด Deque์ Last์์ RecordBatch ํ๋๋ฅผ ๊บผ๋ด์ Record๋ฅผ ์ ์ฅํ ๊ณต๊ฐ์ด ์๋์ง ํ์ธํ๋ค. ์ฌ์ ๊ณต๊ฐ์ด ์์ผ๋ฉด ํด๋น RecordBatch์ Record๋ฅผ ์ถ๊ฐํ๊ณ , ์ฌ์ ๊ณต๊ฐ์ด ์์ผ๋ฉด ์๋ก์ด RecordBatch๋ฅผ ์์ฑํด์ Last์ชฝ์ผ๋ก ์ ์ฅํ๋ค.
- ์ด Map์ Key๋
- RecordAccumulator๋
- ์ฌ์ฉ์๊ฐ KafkaProducer์ send()๋ฅผ ํธ์ถํ๋ฉด Record๊ฐ ๋ฐ๋ก Broker๋ก ์ ์ก๋๋ ๊ฒ์ด ์๋๋ผ RecordAccumulator์ ์ ์ฅ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ค์ ๋ก Broker์ ์ ์ก๋๋ ๊ฒ์ ์ดํ์ ๋น๋๊ธฐ์ ์ผ๋ก ์ด๋ฃจ์ด์ง๋ค.
Sender
: KafkaProducer๋ ๋ณ๋์ Sender Thread๋ฅผ ์์ฑํ๋ค.- Sender Thread๋ RecordAccumulator์ ์ ์ฅ๋ Record๋ค์ Broker๋ก ์ ์กํ๋ ์ญํ ์ ํ๋ค. ๊ทธ๋ฆฌ๊ณ Broker์ ์๋ต์ ๋ฐ์์ ์ฌ์ฉ์๊ฐ Record ์ ์ก ์ ์ค์ ํ ์ฝ๋ฐฑ์ด ์์ผ๋ฉด ์คํํ๊ณ , Broker๋ก๋ถํฐ ๋ฐ์ ์๋ต ๊ฒฐ๊ณผ๋ฅผ Future๋ฅผ ํตํด์ ์ฌ์ฉ์์๊ฒ ์ ๋ฌํ๋ค.
- Sender Thread๋ RecordAccumulator์ ์ ์ฅ๋ Record๋ฅผ ๊บผ๋ด์ Broker๋ก ์ ์กํ๊ณ Broker์ ์๋ต์ ์ฒ๋ฆฌํ๋ค.
ํ๋ก๋์ ๋ฉ์ธ์ง ์ ๋ฌ ๋ณด์ฅ
- At most once : ์ต๋ ํ๋ฒ ์ ์ก. ACK๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์๋๋ค.
- At least once : ์ ์ด๋ ํ๋ฒ ์ ์ก
- ACK๋ฅผ ๋ณด๋๋๋ฐ ๊ทธ ACK๊ฐ ์ ์ค๋ ๊ฒฝ์ฐ ๋ฐ์ดํฐ ์ค๋ณต ์ ์ก๋จ
- Exactly once : ๋ฑ ํ๋ฒ ์ ์ก. ๋ฉฑ๋ฑ์ฑ ์ต์
ํ๋ก๋์ ๋ฉฑ๋ฑ์ฑ ์ต์
enable.idempotence
- ๋ธ๋ก์ปค๋ ๊ฐ ํ๋ก๋์์ ID๋ฅผ ํ ๋นํ๊ณ , ํ๋ก๋์๋ ๋ชจ๋ ๋ฉ์ธ์ง๋ฅผ ์ํ์ค ๋ฒํธ์ ํจ๊ป ์ ์กํ๋ค.
- ํ๋ก๋์ PID์ ์ํ์ค ๋๋ฒ๋ฅผ ํจ๊ป ์ ๋ฌํ๋ค
- ๋ธ๋ก์ปค๋ ์ด ๋ฒํธ๋ฅผ ์ฌ์ฉํด ์ค๋ณต ๋ฉ์ธ์ง๋ฅผ ์ ๊ฑฐํ๋ค -> ๋์ผํ ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ๋ฒ ์ ์กํ๋๋ผ๋, ์นดํ์นด ํด๋ฌ์คํฐ์ ๋จ ํ๋ฒ๋ง ์ ์ฅ๋๋๊ฒ์ ์๋ฏธํ๋ค
- ํ๊ณ
- ๋์ผํ ์ธ์ ์์๋ง ์ ํํ ํ๋ฒ ์ ์ก์ ๋ณด์ฅํ๋ค -> ํ๋ก๋์๊ฐ ๋ค์ ๋ฌ๋ค๋ฉด ํ๋ก๋์ PID๊ฐ ๋ฐ๋๊ธฐ ๋๋ฌธ์ ๋ณด์ฅ ์๋จ.
ํธ๋์ญ์ ํ๋ก๋์์ ํธ๋์ญ์ ์ปจ์๋จธ
- ๋ชจ๋ ๋ฉ์ธ์ง๋ฅผ ๊ธฐ๋กํ๋๋ฐ ์ฑ๊ณตํ๊ฑฐ๋, ๊ทธ๊ฒ ์๋๋ฉด ์๋ฌด๊ฒ๋ ๊ธฐ๋กํ์ง ์๋๋ค.
- ํธ๋์ญ์ ํ๋ก๋์๊ฐ ์ปค๋ฐํ๋ฉด ํธ๋์ญ์ ์ปจ์๋จธ๊ฐ ๊ฐ์ ธ๊ฐ
- ํธ๋์ญ์
์ปจ์๋จธ
- isolation level : read_commited (์ปค๋ฐ๋ ๋ ์ฝ๋๋ง ์ฝ์ด๋ผ)
์ปจ์๋จธ
์ด๋ฒคํธ๋ฅผ ๊ตฌ๋
ํ๋ ์ดํ๋ฆฌ์ผ์ด์ - ์ปค๋ฐ : ๋ฐ์ดํฐ๋ฅผ ์ด๋๊น์ง ์ฝ์๋์ง ํ์ํ๋ค.
- poll()์ ์ด์ ์ ์ปค๋ฐํ ์คํ์ ์ด ์์ผ๋ฉด ๊ทธ ์คํ์ ์ดํ์ ์คํ์ ์ ์ฝ์ด์จ๋ค
- ์ปค๋ฐ์ด ์ ์์ ์ผ๋ก ์ฒ๋ฆฌ๋์ง ์์์ ๊ฒฝ์ฐ, ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ์ค๋ณต์ด ๋ฐ์ํ ๊ฐ๋ฅ์ฑ๋ ์์
- ์ปจ์๋จธ์ ์ฌ์์์ด ์ด๋ฃจ์ด์ง ๊ฒฝ์ฐ๋ฅผ ์๊ฐ
- ์๋์ปค๋ฐ/์๋์ปค๋ฐ
- ์๋์ปค๋ฐ :
enable.auto.commit
- Consumer์์ poll()์ ํธ์ถํ ๋ auto.commit.interval.ms(default: 5s)์ด ์ง๋ฌ๋์ง๋ฅผ ํ์ธ ํ ๋ค Commit์ด ๊ฐ๋ฅ ํ๋ฉด ๊ฐ์ฅ ๋ง์ง๋ง offset์ commitํ๋ค.
- ์ค๋ณต ๊ฐ๋ฅ์ฑ : ์ปค๋ฐ ํ๊ธฐ์ ์ ๋ฆฌ๋ฐธ๋ฐ์ฑ ๋ฐ์ ์
- ์์ค ๊ฐ๋ฅ์ฑ : ์ปค๋ฐ์ ๋์์ง๋ง ๋ฉ์ธ์ง ์ฒ๋ฆฌ๊ฐ ๋๋์ง ์์๋๋ฐ ์ฅ์ ๋ฐ์ํ ์ํฉ
- ์๋์ปค๋ฐ
- ๋๊ธฐ์ปค๋ฐ
- ๋น๋๊ธฐ์ปค๋ฐ
- ์๋์ปค๋ฐ :
- poll์ ํธ์ถํ๊ธฐ์ ์ ๋ด๋ถ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ์๋ค.
- ์ปจ์๋จธ์์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์ Exception์ด ๋ฐ์ํ๋ ์ฌ๋ก๋ค
- ๋ฉ์์ง๋ฅผ deserialize ํ ์ ์๋ ๊ฒฝ์ฐ
- ์๋ชป๋ ๋ฉ์์ง๊ฐ ๋ค์ด์จ ๊ฒฝ์ฐ(๋ฐ์ดํฐ์ ํ์์ด ์ ๋ง๋๋ค๋ ์ง, ํ์ฉ ๋ฒ์์์ ๋ฒ์ด๋ validํ์ง ์์ ๊ฐ์ด ๋ค์ด์จ๋ค๋์ง)
- ์ปจ์๋จธ์ ๋น์ฆ๋์ค ๋ก์ง์ ์๋ชป ์ง ๊ฒฝ์ฐ
- ์ฒ๋ฆฌ๋์ง ์๋ ๋ฉ์ธ์ง๋ฅผ ๋ชจ์ผ๋ ํ๊ฐ ๋ณ๋๋ก ์กด์ฌํด ๋ค์๊ณผ ๊ฐ์ด ํธ๋ค๋ง ํ๋ ๋ฐฉ๋ฒ๋ ์๋ค.
DLQs
:factory.setErrorHandler(new SeekToCurrentErrorHandler( new DeadLetterPublishingRecoverer(kafkaProducerTemplate), 3)); // 3๋ฒ Retry -> DLT
- ์ต์
- bootstrap.servers : ์ฐ๊ฒฐํ ์๋ฒ ์ ๋ณด
- fetch.min.bytes : ํ๋ฒ์ ๊ฐ์ ธ์ค๋ ์ต์ ์ฌ์ด์ฆ
- group.id : ์ปจ์๋จธ ๊ทธ๋ฃน ์์ด๋
- auto.offset.reset : ์ปค๋ฐ ํ๋ฒ๋ ์ํ์ ๋ ์ด๋ ์คํ์
๋ถํฐ ์ฝ์์ง ์ ํํ๋ ์ต์
- ์๋ก๋ง๋ ์ปจ์๋จธ ์ด์ฉํ ๋ ์ฌ์ฉ๋จ.
- enable.auto.commit : ์๋ ์ปค๋ฐ ์ ๋ฌด
- heartbeat.interval.ms : ๊ทธ๋ฃน ์ฝ๋๋ค์ดํฐ์๊ฒ ๋ณด๋ด๋ ํํธ๋นํธ ๊ฐ๊ฒฉ
- session.timeout.ms : ํด๋น ์ฃผ๊ธฐ๋ง๋ค ์ปจ์๋จธ๊ฐ ์ข ๋ฃ๋ ๊ฒ์ธ์ง ํ๋จํ๋ค. ์ด ์๊ฐ ์ ๊น์ง ํํธ๋นํธ๋ฅผ ๋ณด๋ด์ง ์์ผ๋ฉด ์ปจ์๋จธ๋ ์ข ๋ฃ๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผํ๊ณ ์ปจ์๋จธ๊ทธ๋ฃน์์ ์ ์ธํ๊ณ ๋ฆฌ๋ฐธ๋ฐ์ฑ์ ์์
- ์์ ์ ์ผ๋ก ์ข
๋ฃ
- WakeUpException ๋ฐ์ ์์ผ์ ์ข ๋ฃ
์ปจ์๋จธ ๋
- ํ๋ก๋์๊ฐ ๋ง์ง๋ง์ผ๋ก ๋ฃ์ ์คํ์ - ์ปจ์๋จธ๊ฐ ๋ง์ง๋ง์ผ๋ก ์ฝ์ ์คํ์ : ์ปจ์๋จธ๋
- ์ปจ์๋จธ๊ฐ ์ฝ์ด๋ค์ด๋ ์๋ < ํ๋ก๋์ฑ ๋๋ ์๋
- ํด์ ๋ฐฉ๋ฒ : ํํฐ์ ๊ฐ์๋ฅผ ๋๋ฆฌ๊ณ ์ปจ์๋จธ ๊ฐ์๋ ๋๋ฆฐ๋ค.
- ๋ชจ๋ํฐ๋ง ํด : Burrow, AKHQ.IO, Kafdrop, Kafka-ui
KafkaConsumer Client

KafkaConsumer
๋ ConsumerNetworkClient, SubscriptionState, ConsumerCoordinator, Fetcher, HeartBeat ์ค๋ ๋๋ก ๊ตฌ์ฑ๋๋ค.ConsumerNetworkClient
๋ KafkaConsumer์ ๋ชจ๋ ๋คํธ์ํฌ ํต์ ์ ๋ด๋นํ๋ค.- KafkaConsumer์ ๋ชจ๋ ์์ฒญ์ ConsumerNetworkClient์ send ๋ฉ์๋๋ฅผ ํตํด ์์๋๋ค. ConsumerNetworkClient๋ send ๋ฉ์๋๋ฅผ ํตํด ์ ๋ฌ๋ ๋ชจ๋ ์์ฒญ์
ClientRequest
๋ก ๋ฐ๊พผ๋ค.- ClientRequest์๋ ์์ฒญ์ด ์๋ฃ๋์์ ๋ ํธ์ถ๋ RequestFuture๊ฐ ์ค์ ๋์ด ์๋ค.
- ์ด RequestFuture๋ ConsumerNetworkClient์ send ๋ฉ์๋๋ฅผ ํธ์ถํ ์ฝ๋ฌ(caller)์๊ฒ ๋ฐํ๋๋ค. ์ฝ๋ฌ๋ RequestFuture๋ฅผ ํตํด ๋น๋๊ธฐ ์์ฒญ์ด ์๋ฃ๋์๋์ง ํ์ธํ๋ค.
- ConsumerNetworkClient๋ ClientRequest๋ฅผ ๋ฐ๋ก ์ ์กํ์ง ์๊ณ ๋ด๋ถ ๋ฒํผ์ธ
Unsent Map
์ ๋จผ์ ์ ์ฅํ๋ค. Unsent Map์ Key๋ ์์ฒญ์ ์ ์กํ๋ธ๋ก์ปค์ ํธ์คํธ
์ด๊ณ Value๋ ๋ธ๋ก์ปค๋ก ์ ์กํด์ผ ํ๋ClientRequest์ ๋ฆฌ์คํธ
์ด๋ค. - ์ปจ์๋จธ ๋ฆฌ๋ฐธ๋ฐ์ค
- ๋ฆฌ๋ฐธ๋ฐ์ค๊ฐ ๋ฐ์ํ ์ปจ์๋จธ ๊ทธ๋ฃน์ ๋ฆฌ๋ฐธ๋ฐ์ค ์์ ์ด ๋๋ ๋๊น์ง ๋ธ๋ก์ปค๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค์ง ์๋๋ค. ๋ฐ๋ผ์ ๋ฆฌ๋ฐธ๋ฐ์ค๊ฐ ์งํ๋๋ ๋์์๋ ์ปจ์๋จธ๋ค์ด ์ผ์ ์ ์ง๋ ๊ฒ์ฒ๋ผ ๋ณด์ธ๋ค
- Process ์ค๋ ๋๊ฐ ์ ์์ ์ผ๋ก ๋์ํ์ง ์๋๋ค๋ฉด max.poll.interval.ms์ผ๋ก ๊ฐ์ง๊ฐ ๋๋ค. ๋ง์ฝ KafkaConsumer๊ฐ ์ ์์ด ์๋ ๊ฒฝ์ฐ์๋ session.timeout.ms๋ก ๊ฐ์ง๋๋ค
- Fetcher
- fetchedRecords ๋ฉ์๋๋ ๋ด๋ถ ์บ์์ธ nextInLineRecords์ completedFetches๋ฅผ ํ์ธํ์ฌ ๋ธ๋ก์ปค๋ก๋ถํฐ ์ด๋ฏธ ๊ฐ์ ธ์จ ๋ฐ์ดํฐ๊ฐ ์๋ ๊ฒฝ์ฐ์๋ max.poll.records ์ค์ ๊ฐ๋งํผ ๋ ์ฝ๋๋ฅผ ๋ฐํํ๋ค
์ปจ์๋จธ ๊ทธ๋ฃน
- ๋ชฉ์ ์ ๋ฐ๋ผ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ์ปจ์๋จธ๋ค์ ๋ฌถ์ ๊ทธ๋ฃน. ๊ทธ๋ฅ ๊ฐ์ ๋ก์ง์ ๊ฐ์ง๊ณ ์๊ณ , ์ค์ผ์ผ์์ํ ์ปจ์๋จธ๋ค์ด๋ผ๊ณ ์๊ฐํ๋ฉด ํธํ๋ค.
- ํํฐ์
: ์ปจ์๋จธ = 1 : 1์ด ์ต๊ณ ํจ์จ์ด๋ค.
- ํํฐ์
๊ฐ์๋ณด๋ค ์ปจ์๋จธ ๊ทธ๋ฃน์ด ๋ง์์ง๊ฒ ๋๋ฉด, ์ปจ์๋จธ๋ ๋๊ฒ ๋๋ค
- ํํฐ์
2๊ฐ/ํ ๊ทธ๋ฃน์์ ์ปจ์๋จธ 3๊ฐ
- ํํฐ์ ๋น ์ปจ์๋จธ๋ ํ๋์ฌ์ผ ํ๊ธฐ ๋๋ฌธ์
- ์ฒ๋ฆฌ๋์ด ๋จ์ด์ ธ์ ์ปจ์๋จธ๋ฅผ ๋๋ ค์ผ ํ๋ค๋ฉด ํํฐ์ ๋ ๋๋ ค์ผ ํ๋ค.
- ํํฐ์
2๊ฐ/ํ ๊ทธ๋ฃน์์ ์ปจ์๋จธ 3๊ฐ
- ํํฐ์
๊ฐ์๋ณด๋ค ์ปจ์๋จธ ๊ทธ๋ฃน์ด ๋ง์์ง๊ฒ ๋๋ฉด, ์ปจ์๋จธ๋ ๋๊ฒ ๋๋ค
- ๋๊ฐ ์ด์์ ์ปจ์๋จธ ๊ทธ๋ฃน์ ์์ฑํ๋ ์ด์ ?
- elk์๋ ๋ก๊ทธ ์ ์ฌ, hadoop์๋ ๋ก๊ทธ ์ ์ฌ ๋ฑ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ ์์ค์์ ์ฌ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ
- ํ๊ฐ ํํฐ์
์ ์ปจ์๋จธ ๊ทธ๋ฃน์ ํ ๊ฐ ์ปจ์๋จธ์๋ง ์ฐ๊ฒฐ์ด ๊ฐ๋ฅํ๋ค
- ๊ทธ๋ฃน์ ์ํด์๋ ์ปจ์๋จธ๋ค์ด ํํฐ์ ๊ณต์ ๋ถ๊ฐ๋ฅ
- ์ปจ์๋จธ ๊ทธ๋ฃน ๊ธฐ์ค์ผ๋ก ํํฐ์ ์ ๋ฉ์ธ์ง๊ฐ ์์๋๋ก ์ฒ๋ฆฌ๋๋ค.
- ํ๊ฐ ํํฐ์ ์ ์๋ก ๋ค๋ฅธ ๊ทธ๋ฃน์ ์ปจ์๋จธ๋ ๊ณต์ ํ ์ ์๋ค
- ์ปจ์๋จธ ๊ทธ๋ฃน์ ํตํด์ Kafka๋ ๊ฐ์ฉ์ฑ ํ๋ณด์ ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ํ๋ค. ๋ง์ฝ ์ปจ์๋จธ ๊ทธ๋ฃน ๋ด์ ํน์ ์ปจ์๋จธ์ ์ฒ๋ฆฌ๊ฐ ์ผ์ ์๊ฐ(max.poll.interval.ms ์ค์ ๋งํผ) ์ ์ง๋๋ค๋ฉด ํด๋น ์ปจ์๋จธ๋ ๊ทธ๋ฃน์์ ์ ์ธ๋๊ณ ๋๋จธ์ง ์ปจ์๋จธ๋ค๋ก๋ง ๋ฐ์ดํฐ๊ฐ ๋ถ๋ฐฐ๋๋ค.
Assignor
- ์ปจ์๋จธ์ ํํฐ์ ์ ํ ๋น ์ ์ฑ
- ์ปจ์๋จธ ํํฐ์ ํ ๋น ์ ๋ต์ ํ๋ก๋์์ ํํฐ์ ๋๊ฐ ์ด๋ค ํํฐ์ ์ผ๋ก ๋ฉ์์ง๋ฅผ ์ ์กํ ์ง ๊ฒฐ์ ํ๋ ๊ฒ์ฒ๋ผ ์ปจ์๋จธ๊ฐ ์ด๋ค ํํฐ์ ์ ๋ฉ์์ง๋ฅผ ์ฝ์ด์ฌ์ง๋ฅผ ๊ฒฐ์ ํ๋ ์ ์ฑ
- RangeAssignor : ํํฐ์ ์ ์ซ์๋ก ์ ๋ ฌ. ์ปจ์๋จธ๋ฅผ ์ฌ์ ์์๋ก ์ ๋ ฌ - ๊ธฐ๋ณธ๊ฐ
- RoundRobinAssignor : ๋ชจ๋ ํํฐ์ ์ ์ปจ์๋จธ์์ ๋ฒ๊ฐ์๊ฐ๋ฉด์ ํ ๋น
- StickyAssignor : ์ต๋ํ ํํฐ์
์ ๊ท ๋ฑํ๊ฒ ๋ฐฐ๋ถํ๋ฉด์ ํ ๋น
- ์ฒซ ๋ฒ์งธ ๋ชฉ์ ์ ๊ฐ๋ฅํ ๊ท ํ ์กํ ํํฐ์ ์ ํ ๋นํ๋ ๊ฒ
- ๋ ๋ฒ์งธ ๋ชฉ์ ์ ์ฌํ ๋น์ด ๋ฐ์ํ ๋ ๋๋๋ก ๊ธฐ์กด์ ํ ๋น๋ ํํฐ์ ์ ๋ณด๋ฅผ ๋ณด์ฅํ๋ ๊ฒ
๋ ํ๋ฆฌ์นด
- ๊ณ ๊ฐ์ฉ์ฑ์ ์ํ ๊ฐ๋
- ๋ณต์ ์๋งํผ ํํฐ์ ์ ๋ณต์ ๋ณธ์ด ๊ฐ ๋ธ๋ก์ปค์ ์๊ธด๋ค
- ๋ฆฌ๋ : ํ๋. ๋ฆฌ๋๋ฅผ ํตํด์๋ง ๋ฉ์ธ์ง๋ฅผ ์ฒ๋ฆฌํ๋ค
- ํ๋ก์ : ๋๋จธ์ง. ๋ฆฌ๋๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ ํ๋ค.
ISR
- In Sync Replicas
- ๋ฆฌ๋ ํํฐ์
๊ณผ ํ๋ก์ฐ ํํฐ์
์ด ๋ชจ๋ Sync๊ฐ ๋ ์ํ
- Sync : ์ปค๋ฐ๋ ์คํ์ ์ด ๊ฐ๋ค
- ISR์ด ์๋์์ ๋ ๋ฆฌ๋ํํฐ์
์ ์ฅ์ ๊ฐ ํฐ์ง๋ค๋ฉด?
- ์ฑํฌ ์๋ ์ํ์์ ์๋ก์ด ๋ฆฌ๋ ์ ์ถ๋๋ฉด ์ฑํฌ ์๋ ๋ฐ์ดํฐ ์ ์ค ๊ฐ๋ฅ์ฑ ์์!
- unclean.leader.election.enable = true โ ์ ์ค ๊ฐ์
- false๋ฉด ์ ์ค ๊ฐ์ํ์ง ์์. ํด๋น ๋ธ๋ก์ปค๊ฐ ๋ณต๊ตฌ๋ ๋๊น์ง ์ค๋จ!
์คํํฑ ๋ฉค๋ฒ์ญ
- group.instance.id
- session.timeout.ms ์ ํฐ ๊ฐ์ผ๋ก ์ง์ ํด์ผํ๋ค. ์ด ์๊ฐ๋์ ํํธ๋นํธ๋ฅผ ๋ฐ์ง ๋ชปํ๋ค๋ฉด, ๊ฐ์ ๋ก ๋ฆฌ๋ฐธ๋ฐ์ฑ ์ผ์ด๋จ.
- ์คํํฑ ๋ฉค๋ฒ์ญ์ ์ปจ์๋จธ ๊ทธ๋ฃน ๋ด์์ ์ปจ์๋จธ๊ฐ ์ฌ์์ ๋ฑ์ผ๋ก ๊ทธ๋ฃน์์ ๋๊ฐ๋ค๊ฐ ๋ค์ ํฉ๋ฅํ๋๋ผ๋ ๋ฆฌ๋ฐธ๋ฐ์ฑ์ด ์ผ์ด๋์ง ์๊ฒ ํ๋ค
- ์คํํฑ ๋ฉค๋ฒ์ญ์ด ์ ์ฉ๋ ์ปจ์๋จธ์ ๊ฒฝ์ฐ,
- ์ปจ์๋จธ ๊ทธ๋ฃน์์ ๋ ๋ ๋ ๊ทธ๋ฃน ์ฝ๋๋ค์ดํฐ์๊ฒ ์๋ฆฌ์ง ์์
- ๋ค์ ์ปจ์๋จธ ๊ทธ๋ฃน์ ํฉ๋ฅ ์์๋ ๊ทธ๋ฃน ์ฝ๋๋ค์ดํฐ๋ ID ํ์ธ ํ ๊ธฐ์กด ๊ตฌ์ฑ์์์ ์ธ์ง
์ฃผํคํผ
- ์นดํ์นด ํด๋ฌ์คํฐ ๊ด๋ฆฌ ์ฉ๋๋ก๋ง ๊ฐ๋ตํ ์๊ณ ๋์ด๊ฐ์
- ๊ธฐ์กด์๋ ์นดํ์นด ์ฌ์ฉ ์ ์ฃผํคํผ๊ฐ ํ์์์ผ๋, ์ฃผํคํผ ์ฌ์ฉ์ ์ ์ฝ์ฌํญ์ด๋ ํ๊ณ์ฑ์ ์ํด ์ฃผํคํผ์ ์นดํ์นด์ ์ฐ๊ฒฐ๊ณ ๋ฆฌ๋ฅผ ๋๊ณ ์๋ค.
Apache Kafka 2.8 ๋ฒ์ ๋ถํฐ ์ฃผํคํผ ๋์ kraft ๋ฅผ ์ฌ์ฉํ ์ ์์ผ๋, 2.8.x ๋ฒ์ ๋ถํฐ 3.2.x ๋ฒ์ ๊น์ง๋ ๊ฐ๋ฐ ๋จ๊ณ(์ผ๋ฆฌ ์ก์ธ์ค,early access) ์ ๋๋ค. Kafka 3.3.1 ๋ฒ์ ์์ ๋ถํฐ Production(์ด์)์์ ์ฌ์ฉํ ์ค๋น๊ฐ ๋์์ ๋ฐํํ๋ฉด์ KRaft ์ง์๊ณผ ZooKeeper ์ง์์ข ๋ฃ(์ ๊ฑฐ)์ ๋ํ ๋ฆด๋ฆฌ์ฆ ํ์๋ผ์ธ์ ๋ฐํ ํ์์ต๋๋ค.
๋ธ๋ก์ปค
- ์ผ๋ฐ์ ์ผ๋ก ์นดํ์นด๋ผ๊ณ ๋ถ๋ฆฌ๋ ์์คํ (์ดํ๋ฆฌ์ผ์ด์ )์ ๋งํ๋ค.
์ปจํธ๋กค๋ฌ
- ๋ค์์ ๋ธ๋ก์ปค ์ค ํ๋๊ฐ ์ปจํธ๋กค๋ฌ ์ญํ ์ ํ๋ค
- ํํฐ์ ํ ๋น, ์ ์ ๋์ ๋ชจ๋ํฐ๋ง
- ๋ธ๋ก์ปค์ ์ํ๋ฅผ ์ฒดํฌํ๊ณ , ๋ธ๋ก์ปค๊ฐ ํด๋ฌ์คํฐ์์ ๋น ์ง๋ ๊ฒฝ์ฐ ํด๋น ๋ธ๋ก์ปค์ ์กด์ฌํ๋ ๋ฆฌ๋ ํํฐ์ ์ ์ฌ๋ถ๋ฐฐํ๋ ์ญํ ์ ํ๋ค.
- ๋ค์์ ๋ธ๋ก์ปค ์ค ํ๋๊ฐ ์ปจํธ๋กค๋ฌ ์ญํ ์ ํ๋ค
๊ทธ๋ฃน ์ฝ๋๋ค์ดํฐ
- ๋ค์์ ๋ธ๋ก์ปค ์ค ํ๋๊ฐ ์ฝ๋๋ค์ดํฐ ์ญํ ์ ํ๋ค
- ์ปจ์๋จธ ๊ทธ๋ฃน์ ์ํ๋ฅผ ์ฒดํฌํ๊ณ ํํฐ์ ์ ์ปจ์๋จธ์ ๋งค์นญ๋๋๋ก ๋ถ๋ฐฐํ๋ ์ญํ
- ์ปจ์๋จธ๋ฅผ ์ฌํ ๋นํ๋ ๊ณผ์ ์ ๋ฆฌ๋ฐธ๋ฐ์ค๋ผ๊ณ ํ๋ค.
- ๋ค์์ ๋ธ๋ก์ปค ์ค ํ๋๊ฐ ์ฝ๋๋ค์ดํฐ ์ญํ ์ ํ๋ค
- ๋ฉ์์ง ์ ์ฅ๊ณผ ๋ฉ์ธ์ง ํ์ผ ๊ด๋ฆฌ
- ๋ธ๋ก์ปค๋ ํ๋ก๋์๋ก๋ถํฐ ์ ๋ฌ๋๋ ๋ฉ์ธ์ง๋ฅผ ๋ก๊ทธํํ๋ก log.dir์ ์ค์ ํ ๊ฒฝ๋ก์ ์ ์ฅํ๋ค.
- ๊ฐ ๋ธ๋ก์ปค์ ์ ์ฅ๋๋ ๋ฉ์ธ์ง๋ ํํฐ์ ๋ณ๋ก ์ธ๊ทธ๋จผํธ๋ผ๋ ํ์ผ๋ก ์ ์ฅ๋๋ค.
- ๋ฐ์ดํฐ ์ญ์
- ๋ก๊ทธ ์ธ๊ทธ๋จผํธ ๋จ์๋ก ์ญ์ ํ๋ค
- Delete ์ต์
์ ์ํด ์ผ์ ์๊ฐ์ด๋ ์ฉ๋์ ๋ฐ๋ผ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๋ค
- ์กํฐ๋ธ๊ฐ ์๋ ์ธ๊ทธ๋จผํธ๋ฅผ ์ญ์ ํ๋ค.
- ๋ ์ฝ๋๋จ์ ๊ฐ๋ณ ์ญ์ ๋ ๋ถ๊ฐ๋ฅํ๋ค.
- ๋ณดํต 3์ผ์ ๋๋ก ์ ์งํ๋ ๊ฒ์ด ์ผ๋ฐ์ (๊ธ, ํ , ์ผ)
- ๋ธ๋ก์ปค๊ฐ ์ธ๊ทธ๋จผํธ๊ฐ ์ญ์ ์์ญ์ ๋ค์ด์๋์ง ๊ณ์ ํ์ธํด์ ์ญ์ ํ๋ค.
- ์กํฐ๋ธ๊ฐ ์๋ ์ธ๊ทธ๋จผํธ๋ฅผ ์ญ์ ํ๋ค.
- Compact ์ต์
์ผ๋ก ๊ฐ์ฅ ์ต์ ์ ๋ฉ์ธ์งํค๋ฅผ ์ ์ธํ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ ์๋ ์๋ค.
- ์กํฐ๋ธ ์ธ๊ทธ๋จผํธ๋ฅผ ์ ์ธํ ๋๋จธ์ง ์ธ๊ทธ๋จผํธ์ ํํด์ ์ด๋ฃจ์ด์ง๋ค.
- ํด๋ฆฐ ๋ก๊ทธ : ์์ถ์ด ์๋ฃ๋ ๋ก๊ทธ
- ๋ํฐ ๋ก๊ทธ : ์์ถ์ด ์๋ฃ๋์ง ์์ ๋ก๊ทธ(์ค๋ณต๋ ๋ฉ์ธ์ง ํค๊ฐ ์๋ค)
- ํด๋ฆฐ๋ ์ฝ๋์ ๊ฐ์์ ๋ํฐ๋ ์ฝ๋์ ๊ฐ์์ ๋ฐ๋ผ ์์ถ์์์ ์ํํ๊ฒ ๋๋ค.
- 4:4 โ 50% / 50%๊ฐ ๋๋ฌ ํ์ ๋ ์์ถํ๊ฒ ๋ค ์ด๋ฐ์์ผ๋ก ์ค์ ๊ฐ๋ฅ
- ๋ณต์
- ํํฐ์ ๋จ์๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณต์ ํ๋ค.
- ํ ํฝ ์์ฑํ ๋ ํํฐ์ ์ ๋ณต์ ๊ฐ์๋ฅผ ์ค์ ํ๋ค. (์ค์ ์ํ๋ฉด ๋ธ๋ก์ปค์ ๊ธฐ๋ณธ ์ค์ )
- ์ต์๊ฐ 1 (๋ณต์ ์์) ~ ์ต๋๊ฐ (๋ธ๋ก์ปค์ ๊ฐ์๋งํผ)
- ๋ณดํต 2-3์ ๋๋ก ์ค์ ํ๋ค.
- ๋ฆฌ๋ ํํฐ์ : ํ๋ก๋์, ์ปจ์๋จธ๋ ์ง์ ์ ์ธ ํต์ ์ ํ๋ค
- ํ๋ก์ ํํฐ์ : ๋ฐ์ดํฐ๋ฅผ ๋ณต์ ๋ง ํ๋ค.
ํ๋ก๋์

์ด๋ฒคํธ๋ฅผ ๋ฐํ
ํ๋ ํด๋ผ์ด์ธํธ ์ดํ๋ฆฌ์ผ์ด์ - ํ๋ก๋์๋ ๋ผ์ฐํ
๊ณ์ธต์์ด ํํฐ์
์ ๋ฆฌ๋์ธ ๋ธ๋ก์ปค์ ๋ฐ์ดํฐ๋ฅผ ์ง์ ์ ์กํ๋ค.
- ์ด๋ ๊ฒ ํ ์ ์๊ธฐ ์ํด์๋ ๋ชจ๋ ์นดํ์นด ๋
ธ๋๋ ์ธ์ ๋ ์ง ์ด๋ค ์๋ฒ๊ฐ ํ์ฑ ์ํ์ด๊ณ , ํ ํฝ ํํฐ์
์ ๋ฆฌ๋๋ ๋๊ตฌ์ธ์ง์ ๋ํ ๋ฉํ๋ฐ์ดํฐ ์์ฒญ์ ์๋ตํ ์ ์์ด์ผ ํ๋ค.
๋ฉํ๋ฐ์ดํฐ
- ์นดํ์นด ํด๋ผ์ด์ธํธ๋ ํต์ ํ๊ณ ์ํ๋ ๋ฆฌ๋ ํํฐ์ ์ ์์น๋ฅผ ์๊ธฐ ์ํด ๋ฉํ๋ฐ์ดํฐ๋ฅผ ๋ธ๋ก์ปค๋ก๋ถํฐ ์ ๋ฌ ๋ฐ๋๋ค
- ๋ฉํ ๋ฐ์ดํฐ ์บ์ ์ ์งํ๋ ๊ธฐ๊ฐ ์ค์ ๊ฐ๋ฅ
- ๋ฉํ ๋ฐ์ดํฐ์ ์ด์๊ฐ ๋ฐ์ํ๋ค๋ฉด? ์๋ชป๋ ๋ธ๋ก์ปค๋ก ์์ฒญ โ leader_not_avaliable ์ต์ ์ ๋ฐ์
- ์ด๋ ๊ฒ ํ ์ ์๊ธฐ ์ํด์๋ ๋ชจ๋ ์นดํ์นด ๋
ธ๋๋ ์ธ์ ๋ ์ง ์ด๋ค ์๋ฒ๊ฐ ํ์ฑ ์ํ์ด๊ณ , ํ ํฝ ํํฐ์
์ ๋ฆฌ๋๋ ๋๊ตฌ์ธ์ง์ ๋ํ ๋ฉํ๋ฐ์ดํฐ ์์ฒญ์ ์๋ตํ ์ ์์ด์ผ ํ๋ค.
Partitioner
- ์ด๋ ํํฐ์ ์ผ๋ก ํ ํฝ์ ์ ์กํ ์ง ์ค์ ํ๋ค.
- ์ปจ์๋จธ๊ฐ ์ง์ญ์ฑ์ด ์ค์ํ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์๊ฒ ํด์ค๋ค.
- ํํฐ์ ๊ฐ์๊ฐ ๋ณ๊ฒฝ๋๋ ์๊ฐ, ๋ฉ์ธ์ง ํค์ ํํฐ์ ๋ฒํธ ๋งค์นญ์ด ๊นจ์ง๊ฒ ๋จ. ์ฒ์๋ถํฐ ํํฐ์ ๊ทธ๋ฅ ์ถฉ๋ถํ ํฐ ๊ฐ์๋ก ์ด์ํด๋ผ
- UniformStickyPartitioner : ๊ธฐ๋ณธ๊ฐ
- ๋ฉ์ธ์ง ํค๊ฐ ์๋๊ฒฝ์ฐ : ํด์๊ฐ๊ณผ ํํฐ์ ๋งค์นญ
- ๋ฉ์ธ์ง ํค๊ฐ ์๋๊ฒฝ์ฐ : ๋ผ์ด๋๋ก๋น ํจ์จ ๊ทน๋ํ
- ๋ฐฐ์น๋ก ๋ฌถ์ผ๋๊น์ง ๊ธฐ๋ค๋ ธ๋ค๊ฐ ์ ์กํ๋ค
- RoundRobinPartitioner
- ๋ฉ์ธ์ง ํค๊ฐ ์๋๊ฒฝ์ฐ : ํด์๊ฐ๊ณผ ํํฐ์ ๋งค์นญ
- ๋ฉ์ธ์ง ํค๊ฐ ์๋๊ฒฝ์ฐ : ํํฐ์ ์ํ
- ๋ผ์ด๋๋ก๋น or ์๋ฏธ ๋ถ์ฌํด์ ํํฐ์
๋ ๋ฑ๋ฑ
- ์ง์ ๊ตฌํ๋ ๊ฐ๋ฅ
- ์ต์
- bootstrap.servers : ์ฐ๊ฒฐํ ์๋ฒ ์ ๋ณด
- key.serializer, value.serializer : ์ง๋ ฌํ, ์ญ์ง๋ ฌํ ํด๋์ค
- partitioner.class : ํํฐ์ ๋ ํด๋์ค
- retries : ์๋ฌ ๋ฌ์ ๋ ์ฌ์๋ํ ํ์
- acks : ๋ธ๋ก์ปค๋ค์ ์ ์์ ์ผ๋ก ์ ์ฅ๋์๋์ง ์ ์ก ์ฑ๊ณต ์ฌ๋ถ ํ์ธ
- ๋ฐ์ดํฐ๋ฅผ ํ๋ก๋์ฑํ๊ณ ๋ํ๋ฆฌ์นด๊ฐ ์น์ธํ ๋๊น์ง ๊ธฐ๋ค๋ฆฐ๋ค
- 0 : ๋ฐ์ดํฐ ์ ์กํ ๋, ๋ฆฌ๋ํํฐ์ ์ ๋ฐ์ดํฐ ์ ์ฅ๋์๋์ง ํ์ธํ์ง ์๊ฒ ๋ค. ๋ฐ์ดํฐ ์ ์ค ๊ด์ฐฎ์ ๋ ์ฌ์ฉ
- 1 (๋ฆฌ๋์๋ง ์ ์ ์ฌ๋๋ฉด ์ฑ๊ณต) : ๊ธฐ๋ณธ๊ฐ
- -1 : min.insync.replicas ์ต์ ๊ฐ์ ์ง์ ๋ ๊ฐ์๋งํผ ํ์ธ
- ๋ฐ์ดํฐ๋ฅผ ํ๋ก๋์ฑํ๊ณ ๋ํ๋ฆฌ์นด๊ฐ ์น์ธํ ๋๊น์ง ๊ธฐ๋ค๋ฆฐ๋ค
- send : Future ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค.
- ๋๊ธฐ, ๋น๋๊ธฐ๋ก ๊ฒฐ๊ณผ ํ์ธ ๊ฐ๋ฅ
KafkaProducer Client

KafkaProducer
:send()
๋ฅผ ํธ์ถํจ์ผ๋ก์จ Record๋ฅผ ์ ์กํ๋ค.- ์ฌ์ฉ์๋ send() ํธ์ถ ์ ์ ์กํ Record์ ์ ์ก ์๋ฃ ํ ์คํํ ์ฝ๋ฐฑ์ ์ง์ ํ ์ ์๋ค. send()๊ฐ ํธ์ถ๋๋ฉด Serialization, Partitioning, Compression ์์
์ด ์ด๋ฃจ์ด์ง๊ณ ์ต์ข
์ ์ผ๋ก
RecordAccumulator
์ Record๊ฐ ์ ์ฅ๋๋ค.
- ์ฌ์ฉ์๋ send() ํธ์ถ ์ ์ ์กํ Record์ ์ ์ก ์๋ฃ ํ ์คํํ ์ฝ๋ฐฑ์ ์ง์ ํ ์ ์๋ค. send()๊ฐ ํธ์ถ๋๋ฉด Serialization, Partitioning, Compression ์์
์ด ์ด๋ฃจ์ด์ง๊ณ ์ต์ข
์ ์ผ๋ก
RecordAccumulator
- ์ฌ์ฉ์๊ฐ KafkaProducer์ send()๋ฅผ ํธ์ถํ๋ฉด Record๊ฐ ๋ฐ๋ก Broker๋ก ์ ์ก๋๋ ๊ฒ์ด ์๋๋ผ RecordAccumulator์ ์ ์ฅ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ค์ ๋ก Broker์ ์ ์ก๋๋ ๊ฒ์ ์ดํ์ ๋น๋๊ธฐ์ ์ผ๋ก ์ด๋ฃจ์ด์ง๋ค.
- RecordAccumulator๋
batches
๋ผ๋ Map์ ๊ฐ์ง๊ณ ์๋๋ฐ- ์ด Map์ Key๋
TopicPartition
์ด๊ณ , Value๋Deque<RecordBatch>
์ด๋ค. - RecordAccumulator์ append()๊ฐ ํธ์ถ๋๋ฉด batches์์ ์ถ๊ฐ๋ Record์ ํด๋นํ๋ TopicPartition์ Deque๋ฅผ ์ฐพ๋๋ค. ์ด Deque์ Last์์ RecordBatch ํ๋๋ฅผ ๊บผ๋ด์ Record๋ฅผ ์ ์ฅํ ๊ณต๊ฐ์ด ์๋์ง ํ์ธํ๋ค. ์ฌ์ ๊ณต๊ฐ์ด ์์ผ๋ฉด ํด๋น RecordBatch์ Record๋ฅผ ์ถ๊ฐํ๊ณ , ์ฌ์ ๊ณต๊ฐ์ด ์์ผ๋ฉด ์๋ก์ด RecordBatch๋ฅผ ์์ฑํด์ Last์ชฝ์ผ๋ก ์ ์ฅํ๋ค.
- ์ด Map์ Key๋
- RecordAccumulator๋
- ์ฌ์ฉ์๊ฐ KafkaProducer์ send()๋ฅผ ํธ์ถํ๋ฉด Record๊ฐ ๋ฐ๋ก Broker๋ก ์ ์ก๋๋ ๊ฒ์ด ์๋๋ผ RecordAccumulator์ ์ ์ฅ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ค์ ๋ก Broker์ ์ ์ก๋๋ ๊ฒ์ ์ดํ์ ๋น๋๊ธฐ์ ์ผ๋ก ์ด๋ฃจ์ด์ง๋ค.
Sender
: KafkaProducer๋ ๋ณ๋์ Sender Thread๋ฅผ ์์ฑํ๋ค.- Sender Thread๋ RecordAccumulator์ ์ ์ฅ๋ Record๋ค์ Broker๋ก ์ ์กํ๋ ์ญํ ์ ํ๋ค. ๊ทธ๋ฆฌ๊ณ Broker์ ์๋ต์ ๋ฐ์์ ์ฌ์ฉ์๊ฐ Record ์ ์ก ์ ์ค์ ํ ์ฝ๋ฐฑ์ด ์์ผ๋ฉด ์คํํ๊ณ , Broker๋ก๋ถํฐ ๋ฐ์ ์๋ต ๊ฒฐ๊ณผ๋ฅผ Future๋ฅผ ํตํด์ ์ฌ์ฉ์์๊ฒ ์ ๋ฌํ๋ค.
- Sender Thread๋ RecordAccumulator์ ์ ์ฅ๋ Record๋ฅผ ๊บผ๋ด์ Broker๋ก ์ ์กํ๊ณ Broker์ ์๋ต์ ์ฒ๋ฆฌํ๋ค.
ํ๋ก๋์ ๋ฉ์ธ์ง ์ ๋ฌ ๋ณด์ฅ
- At most once : ์ต๋ ํ๋ฒ ์ ์ก. ACK๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์๋๋ค.
- At least once : ์ ์ด๋ ํ๋ฒ ์ ์ก
- ACK๋ฅผ ๋ณด๋๋๋ฐ ๊ทธ ACK๊ฐ ์ ์ค๋ ๊ฒฝ์ฐ ๋ฐ์ดํฐ ์ค๋ณต ์ ์ก๋จ
- Exactly once : ๋ฑ ํ๋ฒ ์ ์ก. ๋ฉฑ๋ฑ์ฑ ์ต์
ํ๋ก๋์ ๋ฉฑ๋ฑ์ฑ ์ต์
enable.idempotence
- ๋ธ๋ก์ปค๋ ๊ฐ ํ๋ก๋์์ ID๋ฅผ ํ ๋นํ๊ณ , ํ๋ก๋์๋ ๋ชจ๋ ๋ฉ์ธ์ง๋ฅผ ์ํ์ค ๋ฒํธ์ ํจ๊ป ์ ์กํ๋ค.
- ํ๋ก๋์ PID์ ์ํ์ค ๋๋ฒ๋ฅผ ํจ๊ป ์ ๋ฌํ๋ค
- ๋ธ๋ก์ปค๋ ์ด ๋ฒํธ๋ฅผ ์ฌ์ฉํด ์ค๋ณต ๋ฉ์ธ์ง๋ฅผ ์ ๊ฑฐํ๋ค -> ๋์ผํ ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ๋ฒ ์ ์กํ๋๋ผ๋, ์นดํ์นด ํด๋ฌ์คํฐ์ ๋จ ํ๋ฒ๋ง ์ ์ฅ๋๋๊ฒ์ ์๋ฏธํ๋ค
- ํ๊ณ
- ๋์ผํ ์ธ์ ์์๋ง ์ ํํ ํ๋ฒ ์ ์ก์ ๋ณด์ฅํ๋ค -> ํ๋ก๋์๊ฐ ๋ค์ ๋ฌ๋ค๋ฉด ํ๋ก๋์ PID๊ฐ ๋ฐ๋๊ธฐ ๋๋ฌธ์ ๋ณด์ฅ ์๋จ.
ํธ๋์ญ์ ํ๋ก๋์์ ํธ๋์ญ์ ์ปจ์๋จธ
- ๋ชจ๋ ๋ฉ์ธ์ง๋ฅผ ๊ธฐ๋กํ๋๋ฐ ์ฑ๊ณตํ๊ฑฐ๋, ๊ทธ๊ฒ ์๋๋ฉด ์๋ฌด๊ฒ๋ ๊ธฐ๋กํ์ง ์๋๋ค.
- ํธ๋์ญ์ ํ๋ก๋์๊ฐ ์ปค๋ฐํ๋ฉด ํธ๋์ญ์ ์ปจ์๋จธ๊ฐ ๊ฐ์ ธ๊ฐ
- ํธ๋์ญ์
์ปจ์๋จธ
- isolation level : read_commited (์ปค๋ฐ๋ ๋ ์ฝ๋๋ง ์ฝ์ด๋ผ)
์ปจ์๋จธ
์ด๋ฒคํธ๋ฅผ ๊ตฌ๋
ํ๋ ์ดํ๋ฆฌ์ผ์ด์ - ์ปค๋ฐ : ๋ฐ์ดํฐ๋ฅผ ์ด๋๊น์ง ์ฝ์๋์ง ํ์ํ๋ค.
- poll()์ ์ด์ ์ ์ปค๋ฐํ ์คํ์ ์ด ์์ผ๋ฉด ๊ทธ ์คํ์ ์ดํ์ ์คํ์ ์ ์ฝ์ด์จ๋ค
- ์ปค๋ฐ์ด ์ ์์ ์ผ๋ก ์ฒ๋ฆฌ๋์ง ์์์ ๊ฒฝ์ฐ, ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ์ค๋ณต์ด ๋ฐ์ํ ๊ฐ๋ฅ์ฑ๋ ์์
- ์ปจ์๋จธ์ ์ฌ์์์ด ์ด๋ฃจ์ด์ง ๊ฒฝ์ฐ๋ฅผ ์๊ฐ
- ์๋์ปค๋ฐ/์๋์ปค๋ฐ
- ์๋์ปค๋ฐ :
enable.auto.commit
- Consumer์์ poll()์ ํธ์ถํ ๋ auto.commit.interval.ms(default: 5s)์ด ์ง๋ฌ๋์ง๋ฅผ ํ์ธ ํ ๋ค Commit์ด ๊ฐ๋ฅ ํ๋ฉด ๊ฐ์ฅ ๋ง์ง๋ง offset์ commitํ๋ค.
- ์ค๋ณต ๊ฐ๋ฅ์ฑ : ์ปค๋ฐ ํ๊ธฐ์ ์ ๋ฆฌ๋ฐธ๋ฐ์ฑ ๋ฐ์ ์
- ์์ค ๊ฐ๋ฅ์ฑ : ์ปค๋ฐ์ ๋์์ง๋ง ๋ฉ์ธ์ง ์ฒ๋ฆฌ๊ฐ ๋๋์ง ์์๋๋ฐ ์ฅ์ ๋ฐ์ํ ์ํฉ
- ์๋์ปค๋ฐ
- ๋๊ธฐ์ปค๋ฐ
- ๋น๋๊ธฐ์ปค๋ฐ
- ์๋์ปค๋ฐ :
- poll์ ํธ์ถํ๊ธฐ์ ์ ๋ด๋ถ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ์๋ค.
- ์ปจ์๋จธ์์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์ Exception์ด ๋ฐ์ํ๋ ์ฌ๋ก๋ค
- ๋ฉ์์ง๋ฅผ deserialize ํ ์ ์๋ ๊ฒฝ์ฐ
- ์๋ชป๋ ๋ฉ์์ง๊ฐ ๋ค์ด์จ ๊ฒฝ์ฐ(๋ฐ์ดํฐ์ ํ์์ด ์ ๋ง๋๋ค๋ ์ง, ํ์ฉ ๋ฒ์์์ ๋ฒ์ด๋ validํ์ง ์์ ๊ฐ์ด ๋ค์ด์จ๋ค๋์ง)
- ์ปจ์๋จธ์ ๋น์ฆ๋์ค ๋ก์ง์ ์๋ชป ์ง ๊ฒฝ์ฐ
- ์ฒ๋ฆฌ๋์ง ์๋ ๋ฉ์ธ์ง๋ฅผ ๋ชจ์ผ๋ ํ๊ฐ ๋ณ๋๋ก ์กด์ฌํด ๋ค์๊ณผ ๊ฐ์ด ํธ๋ค๋ง ํ๋ ๋ฐฉ๋ฒ๋ ์๋ค.
DLQs
:factory.setErrorHandler(new SeekToCurrentErrorHandler( new DeadLetterPublishingRecoverer(kafkaProducerTemplate), 3)); // 3๋ฒ Retry -> DLT
- ์ต์
- bootstrap.servers : ์ฐ๊ฒฐํ ์๋ฒ ์ ๋ณด
- fetch.min.bytes : ํ๋ฒ์ ๊ฐ์ ธ์ค๋ ์ต์ ์ฌ์ด์ฆ
- group.id : ์ปจ์๋จธ ๊ทธ๋ฃน ์์ด๋
- auto.offset.reset : ์ปค๋ฐ ํ๋ฒ๋ ์ํ์ ๋ ์ด๋ ์คํ์
๋ถํฐ ์ฝ์์ง ์ ํํ๋ ์ต์
- ์๋ก๋ง๋ ์ปจ์๋จธ ์ด์ฉํ ๋ ์ฌ์ฉ๋จ.
- enable.auto.commit : ์๋ ์ปค๋ฐ ์ ๋ฌด
- heartbeat.interval.ms : ๊ทธ๋ฃน ์ฝ๋๋ค์ดํฐ์๊ฒ ๋ณด๋ด๋ ํํธ๋นํธ ๊ฐ๊ฒฉ
- session.timeout.ms : ํด๋น ์ฃผ๊ธฐ๋ง๋ค ์ปจ์๋จธ๊ฐ ์ข ๋ฃ๋ ๊ฒ์ธ์ง ํ๋จํ๋ค. ์ด ์๊ฐ ์ ๊น์ง ํํธ๋นํธ๋ฅผ ๋ณด๋ด์ง ์์ผ๋ฉด ์ปจ์๋จธ๋ ์ข ๋ฃ๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผํ๊ณ ์ปจ์๋จธ๊ทธ๋ฃน์์ ์ ์ธํ๊ณ ๋ฆฌ๋ฐธ๋ฐ์ฑ์ ์์
- ์์ ์ ์ผ๋ก ์ข
๋ฃ
- WakeUpException ๋ฐ์ ์์ผ์ ์ข ๋ฃ
์ปจ์๋จธ ๋
- ํ๋ก๋์๊ฐ ๋ง์ง๋ง์ผ๋ก ๋ฃ์ ์คํ์ - ์ปจ์๋จธ๊ฐ ๋ง์ง๋ง์ผ๋ก ์ฝ์ ์คํ์ : ์ปจ์๋จธ๋
- ์ปจ์๋จธ๊ฐ ์ฝ์ด๋ค์ด๋ ์๋ < ํ๋ก๋์ฑ ๋๋ ์๋
- ํด์ ๋ฐฉ๋ฒ : ํํฐ์ ๊ฐ์๋ฅผ ๋๋ฆฌ๊ณ ์ปจ์๋จธ ๊ฐ์๋ ๋๋ฆฐ๋ค.
- ๋ชจ๋ํฐ๋ง ํด : Burrow, AKHQ.IO, Kafdrop, Kafka-ui
KafkaConsumer Client

KafkaConsumer
๋ ConsumerNetworkClient, SubscriptionState, ConsumerCoordinator, Fetcher, HeartBeat ์ค๋ ๋๋ก ๊ตฌ์ฑ๋๋ค.ConsumerNetworkClient
๋ KafkaConsumer์ ๋ชจ๋ ๋คํธ์ํฌ ํต์ ์ ๋ด๋นํ๋ค.- KafkaConsumer์ ๋ชจ๋ ์์ฒญ์ ConsumerNetworkClient์ send ๋ฉ์๋๋ฅผ ํตํด ์์๋๋ค. ConsumerNetworkClient๋ send ๋ฉ์๋๋ฅผ ํตํด ์ ๋ฌ๋ ๋ชจ๋ ์์ฒญ์
ClientRequest
๋ก ๋ฐ๊พผ๋ค.- ClientRequest์๋ ์์ฒญ์ด ์๋ฃ๋์์ ๋ ํธ์ถ๋ RequestFuture๊ฐ ์ค์ ๋์ด ์๋ค.
- ์ด RequestFuture๋ ConsumerNetworkClient์ send ๋ฉ์๋๋ฅผ ํธ์ถํ ์ฝ๋ฌ(caller)์๊ฒ ๋ฐํ๋๋ค. ์ฝ๋ฌ๋ RequestFuture๋ฅผ ํตํด ๋น๋๊ธฐ ์์ฒญ์ด ์๋ฃ๋์๋์ง ํ์ธํ๋ค.
- ConsumerNetworkClient๋ ClientRequest๋ฅผ ๋ฐ๋ก ์ ์กํ์ง ์๊ณ ๋ด๋ถ ๋ฒํผ์ธ
Unsent Map
์ ๋จผ์ ์ ์ฅํ๋ค. Unsent Map์ Key๋ ์์ฒญ์ ์ ์กํ๋ธ๋ก์ปค์ ํธ์คํธ
์ด๊ณ Value๋ ๋ธ๋ก์ปค๋ก ์ ์กํด์ผ ํ๋ClientRequest์ ๋ฆฌ์คํธ
์ด๋ค. - ์ปจ์๋จธ ๋ฆฌ๋ฐธ๋ฐ์ค
- ๋ฆฌ๋ฐธ๋ฐ์ค๊ฐ ๋ฐ์ํ ์ปจ์๋จธ ๊ทธ๋ฃน์ ๋ฆฌ๋ฐธ๋ฐ์ค ์์ ์ด ๋๋ ๋๊น์ง ๋ธ๋ก์ปค๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค์ง ์๋๋ค. ๋ฐ๋ผ์ ๋ฆฌ๋ฐธ๋ฐ์ค๊ฐ ์งํ๋๋ ๋์์๋ ์ปจ์๋จธ๋ค์ด ์ผ์ ์ ์ง๋ ๊ฒ์ฒ๋ผ ๋ณด์ธ๋ค
- Process ์ค๋ ๋๊ฐ ์ ์์ ์ผ๋ก ๋์ํ์ง ์๋๋ค๋ฉด max.poll.interval.ms์ผ๋ก ๊ฐ์ง๊ฐ ๋๋ค. ๋ง์ฝ KafkaConsumer๊ฐ ์ ์์ด ์๋ ๊ฒฝ์ฐ์๋ session.timeout.ms๋ก ๊ฐ์ง๋๋ค
- Fetcher
- fetchedRecords ๋ฉ์๋๋ ๋ด๋ถ ์บ์์ธ nextInLineRecords์ completedFetches๋ฅผ ํ์ธํ์ฌ ๋ธ๋ก์ปค๋ก๋ถํฐ ์ด๋ฏธ ๊ฐ์ ธ์จ ๋ฐ์ดํฐ๊ฐ ์๋ ๊ฒฝ์ฐ์๋ max.poll.records ์ค์ ๊ฐ๋งํผ ๋ ์ฝ๋๋ฅผ ๋ฐํํ๋ค
์ปจ์๋จธ ๊ทธ๋ฃน
- ๋ชฉ์ ์ ๋ฐ๋ผ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ์ปจ์๋จธ๋ค์ ๋ฌถ์ ๊ทธ๋ฃน. ๊ทธ๋ฅ ๊ฐ์ ๋ก์ง์ ๊ฐ์ง๊ณ ์๊ณ , ์ค์ผ์ผ์์ํ ์ปจ์๋จธ๋ค์ด๋ผ๊ณ ์๊ฐํ๋ฉด ํธํ๋ค.
- ํํฐ์
: ์ปจ์๋จธ = 1 : 1์ด ์ต๊ณ ํจ์จ์ด๋ค.
- ํํฐ์
๊ฐ์๋ณด๋ค ์ปจ์๋จธ ๊ทธ๋ฃน์ด ๋ง์์ง๊ฒ ๋๋ฉด, ์ปจ์๋จธ๋ ๋๊ฒ ๋๋ค
- ํํฐ์
2๊ฐ/ํ ๊ทธ๋ฃน์์ ์ปจ์๋จธ 3๊ฐ
- ํํฐ์ ๋น ์ปจ์๋จธ๋ ํ๋์ฌ์ผ ํ๊ธฐ ๋๋ฌธ์
- ์ฒ๋ฆฌ๋์ด ๋จ์ด์ ธ์ ์ปจ์๋จธ๋ฅผ ๋๋ ค์ผ ํ๋ค๋ฉด ํํฐ์ ๋ ๋๋ ค์ผ ํ๋ค.
- ํํฐ์
2๊ฐ/ํ ๊ทธ๋ฃน์์ ์ปจ์๋จธ 3๊ฐ
- ํํฐ์
๊ฐ์๋ณด๋ค ์ปจ์๋จธ ๊ทธ๋ฃน์ด ๋ง์์ง๊ฒ ๋๋ฉด, ์ปจ์๋จธ๋ ๋๊ฒ ๋๋ค
- ๋๊ฐ ์ด์์ ์ปจ์๋จธ ๊ทธ๋ฃน์ ์์ฑํ๋ ์ด์ ?
- elk์๋ ๋ก๊ทธ ์ ์ฌ, hadoop์๋ ๋ก๊ทธ ์ ์ฌ ๋ฑ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ ์์ค์์ ์ฌ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ
- ํ๊ฐ ํํฐ์
์ ์ปจ์๋จธ ๊ทธ๋ฃน์ ํ ๊ฐ ์ปจ์๋จธ์๋ง ์ฐ๊ฒฐ์ด ๊ฐ๋ฅํ๋ค
- ๊ทธ๋ฃน์ ์ํด์๋ ์ปจ์๋จธ๋ค์ด ํํฐ์ ๊ณต์ ๋ถ๊ฐ๋ฅ
- ์ปจ์๋จธ ๊ทธ๋ฃน ๊ธฐ์ค์ผ๋ก ํํฐ์ ์ ๋ฉ์ธ์ง๊ฐ ์์๋๋ก ์ฒ๋ฆฌ๋๋ค.
- ํ๊ฐ ํํฐ์ ์ ์๋ก ๋ค๋ฅธ ๊ทธ๋ฃน์ ์ปจ์๋จธ๋ ๊ณต์ ํ ์ ์๋ค
- ์ปจ์๋จธ ๊ทธ๋ฃน์ ํตํด์ Kafka๋ ๊ฐ์ฉ์ฑ ํ๋ณด์ ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ํ๋ค. ๋ง์ฝ ์ปจ์๋จธ ๊ทธ๋ฃน ๋ด์ ํน์ ์ปจ์๋จธ์ ์ฒ๋ฆฌ๊ฐ ์ผ์ ์๊ฐ(max.poll.interval.ms ์ค์ ๋งํผ) ์ ์ง๋๋ค๋ฉด ํด๋น ์ปจ์๋จธ๋ ๊ทธ๋ฃน์์ ์ ์ธ๋๊ณ ๋๋จธ์ง ์ปจ์๋จธ๋ค๋ก๋ง ๋ฐ์ดํฐ๊ฐ ๋ถ๋ฐฐ๋๋ค.
Assignor
- ์ปจ์๋จธ์ ํํฐ์ ์ ํ ๋น ์ ์ฑ
- ์ปจ์๋จธ ํํฐ์ ํ ๋น ์ ๋ต์ ํ๋ก๋์์ ํํฐ์ ๋๊ฐ ์ด๋ค ํํฐ์ ์ผ๋ก ๋ฉ์์ง๋ฅผ ์ ์กํ ์ง ๊ฒฐ์ ํ๋ ๊ฒ์ฒ๋ผ ์ปจ์๋จธ๊ฐ ์ด๋ค ํํฐ์ ์ ๋ฉ์์ง๋ฅผ ์ฝ์ด์ฌ์ง๋ฅผ ๊ฒฐ์ ํ๋ ์ ์ฑ
- RangeAssignor : ํํฐ์ ์ ์ซ์๋ก ์ ๋ ฌ. ์ปจ์๋จธ๋ฅผ ์ฌ์ ์์๋ก ์ ๋ ฌ - ๊ธฐ๋ณธ๊ฐ
- RoundRobinAssignor : ๋ชจ๋ ํํฐ์ ์ ์ปจ์๋จธ์์ ๋ฒ๊ฐ์๊ฐ๋ฉด์ ํ ๋น
- StickyAssignor : ์ต๋ํ ํํฐ์
์ ๊ท ๋ฑํ๊ฒ ๋ฐฐ๋ถํ๋ฉด์ ํ ๋น
- ์ฒซ ๋ฒ์งธ ๋ชฉ์ ์ ๊ฐ๋ฅํ ๊ท ํ ์กํ ํํฐ์ ์ ํ ๋นํ๋ ๊ฒ
- ๋ ๋ฒ์งธ ๋ชฉ์ ์ ์ฌํ ๋น์ด ๋ฐ์ํ ๋ ๋๋๋ก ๊ธฐ์กด์ ํ ๋น๋ ํํฐ์ ์ ๋ณด๋ฅผ ๋ณด์ฅํ๋ ๊ฒ
๋ ํ๋ฆฌ์นด
- ๊ณ ๊ฐ์ฉ์ฑ์ ์ํ ๊ฐ๋
- ๋ณต์ ์๋งํผ ํํฐ์ ์ ๋ณต์ ๋ณธ์ด ๊ฐ ๋ธ๋ก์ปค์ ์๊ธด๋ค
- ๋ฆฌ๋ : ํ๋. ๋ฆฌ๋๋ฅผ ํตํด์๋ง ๋ฉ์ธ์ง๋ฅผ ์ฒ๋ฆฌํ๋ค
- ํ๋ก์ : ๋๋จธ์ง. ๋ฆฌ๋๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ ํ๋ค.
ISR
- In Sync Replicas
- ๋ฆฌ๋ ํํฐ์
๊ณผ ํ๋ก์ฐ ํํฐ์
์ด ๋ชจ๋ Sync๊ฐ ๋ ์ํ
- Sync : ์ปค๋ฐ๋ ์คํ์ ์ด ๊ฐ๋ค
- ISR์ด ์๋์์ ๋ ๋ฆฌ๋ํํฐ์
์ ์ฅ์ ๊ฐ ํฐ์ง๋ค๋ฉด?
- ์ฑํฌ ์๋ ์ํ์์ ์๋ก์ด ๋ฆฌ๋ ์ ์ถ๋๋ฉด ์ฑํฌ ์๋ ๋ฐ์ดํฐ ์ ์ค ๊ฐ๋ฅ์ฑ ์์!
- unclean.leader.election.enable = true โ ์ ์ค ๊ฐ์
- false๋ฉด ์ ์ค ๊ฐ์ํ์ง ์์. ํด๋น ๋ธ๋ก์ปค๊ฐ ๋ณต๊ตฌ๋ ๋๊น์ง ์ค๋จ!
์คํํฑ ๋ฉค๋ฒ์ญ
- group.instance.id
- session.timeout.ms ์ ํฐ ๊ฐ์ผ๋ก ์ง์ ํด์ผํ๋ค. ์ด ์๊ฐ๋์ ํํธ๋นํธ๋ฅผ ๋ฐ์ง ๋ชปํ๋ค๋ฉด, ๊ฐ์ ๋ก ๋ฆฌ๋ฐธ๋ฐ์ฑ ์ผ์ด๋จ.
- ์คํํฑ ๋ฉค๋ฒ์ญ์ ์ปจ์๋จธ ๊ทธ๋ฃน ๋ด์์ ์ปจ์๋จธ๊ฐ ์ฌ์์ ๋ฑ์ผ๋ก ๊ทธ๋ฃน์์ ๋๊ฐ๋ค๊ฐ ๋ค์ ํฉ๋ฅํ๋๋ผ๋ ๋ฆฌ๋ฐธ๋ฐ์ฑ์ด ์ผ์ด๋์ง ์๊ฒ ํ๋ค
- ์คํํฑ ๋ฉค๋ฒ์ญ์ด ์ ์ฉ๋ ์ปจ์๋จธ์ ๊ฒฝ์ฐ,
- ์ปจ์๋จธ ๊ทธ๋ฃน์์ ๋ ๋ ๋ ๊ทธ๋ฃน ์ฝ๋๋ค์ดํฐ์๊ฒ ์๋ฆฌ์ง ์์
- ๋ค์ ์ปจ์๋จธ ๊ทธ๋ฃน์ ํฉ๋ฅ ์์๋ ๊ทธ๋ฃน ์ฝ๋๋ค์ดํฐ๋ ID ํ์ธ ํ ๊ธฐ์กด ๊ตฌ์ฑ์์์ ์ธ์ง