Coordinator of Consumer Group
ํ์ฌ์์ Confluent๋ฅผ ํตํด Kafka ํด๋ฌ์คํฐ๋ฅผ ์ ์ฌ์ฉํ๊ณ ์์์ต๋๋ค. ๊ทธ๋ฐ๋ฐ, ์ด ์นดํ์นด์ ๋ํด์ ์ข๋ ์์ธํ ์๊ณ , ์ ๋ฌธ์ฑ์ ๊ฐ์ถ๊ณ ์ถ๋ค๋ ์๊ฐ์ด ๋ค์ด์ 2025๋ ์ฒซ ๋ชฉํ๋ก Confluent์ Kafka ์๊ฒฉ์ฆ์ธ Confluent Certified Developer for Apache Kafkaยฎ ์๊ฒฉ์ฆ์ ์ค๋นํ๊ณ ์์ต๋๋ค โ๏ธ
๋ค์ด๊ฐ๋ฉฐ
์ปจ์๋จธ ๊ทธ๋ฃน์ ์ฌ๋ฌ ์ปจ์๋จธ๊ฐ ๋ชจ์ฌ์ ์นดํ์นด ํ ํฝ์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌํ๊ธฐ ์ํด ๊ตฌ์ฑ๋ ์ปดํฌ๋ํธ ์ ๋๋ค. โ์ปจ์๋จธ๊ฐ N๊ฐ๋๊น, ์ฒ๋ฆฌ๋๋ N๊ฐ? ํํโ์ฒ๋ผ ๋จ์ํ๊ฒ ์๊ฐํ ์ ์๊ฒ ์ง๋ง, ๋ณธ์ง์ ์ปจ์๋จธ ๊ทธ๋ฃน์ด ํ๋์ โ์์ ํด๋ฌ์คํฐโ๊ฐ ๋์ด ์นดํ์นด ๋ธ๋ก์ปค์ ํต์ ํ๊ฒ ๋ฉ๋๋ค. ํด๋ฌ์คํฐ ์ฒ๋ผ ๋์ํ๋ ์ปดํฌ๋ํธ์ด๋ ์ด๋ค์ ์ ์ดํ๊ณ ๊ด๋ฆฌํ๋ ์ปจํธ๋กค ํ๋ ์ธ ์ญํ ์ด ํ์ ํฉ๋๋ค! ๊ทธ ์ญํ ์ ํด์ฃผ๋ ๊ฒ์ด ์ฝ๋๋ค์ดํฐ(Coordinator)์ด๊ณ , ์ด๋ฒ ํฌ์คํธ์์ ์ดํด๋ณผ ๋ ์ ์ ๋๋ค.
์ ์ฒด์ ์ธ ๊ตฌ์ฑ
Confluent: Consumer Group Protocol
ํฐ๊ทธ๋ฆผ์ ๋จผ์ ๊ทธ๋ ค๋ด ์๋ค!
- ๊ทธ๋ฃน ์ฝ๋๋ค์ดํฐ
- ๋ธ๋ก์ปค์ ์กด์ฌํ๋ ์ปดํฌ๋ํธ ์ ๋๋ค. ๊ทธ๋์ โserver-sideโ๋ผ๊ณ ๋ถ๋ฅด๊ธฐ๋ ํฉ๋๋ค.
- ๋ชจ๋ ๋ธ๋ก์ปค์๋ ๊ทธ๋ฃน ์ฝ๋๋คํฐ์ด๊ฐ ์กด์ฌํฉ๋๋ค๋ง, Consumer Group ๋ณ๋ก ๋ด๋นํ๋ ๋ธ๋ก์ปค๊ฐ ๋ค๋ฆ ๋๋ค. ์์ธํ ๋ด์ฉ์ ๊ทธ๋ฃน ์ฝ๋๋ค์ดํฐ ๋ฌธ๋จ์ ๊ธฐ์ ํ์์ต๋๋ค.
- ์ปจ์๋จธ์ ์ ๊ท ๋ฑ๋ก ๋๋ ํํด, ํ ํฝ ํํฐ์ ์ ์ฆ๊ฐ์ ๊ฐ์ ์ํฉ์์ โ์ปจ์๋จธ ๋ฆฌ๋ฐธ๋ฐ์ฑโ์ ํธ๋ฆฌ๊ฑฐ ํฉ๋๋ค.
- ์ปจ์๋จธ ์ฝ๋๋ค์ดํฐ
- ๊ฐ ์ปจ์๋จธ์ ์กด์ฌํ๋ ์ปดํฌ๋ํธ ์ ๋๋ค. ๊ทธ๋์ โclient-sideโ๋ผ๊ณ ๋ถ๋ฅด๊ธฐ๋ ํฉ๋๋ค.
- ๊ทธ๋ฃน ์ฝ๋๋ค์ดํฐ์๊ฒ ์ง์์ ์ผ๋ก โํํธ๋นํธ(heartbeat)โ๋ฅผ ๋ณด๋ด๋ฉฐ, ์ปจ์๋จธ๊ฐ ์ ์์ ์ผ๋ก ๋์ํ๊ณ ์์์ ์๋ฆฝ๋๋ค.
- ์ปจ์๋จธ ๊ทธ๋ฃน์ ๋ฑ๋ก๋๊ธฐ ์ํ
JoinGroupRequest
์LeaveGroupRequest
๋ฅผ ๊ทธ๋ฃน ์ฝ๋๋ค์ดํฐ์๊ฒ ๋ณด๋ ๋๋ค. - ๊ทธ๋ฃน ์ฝ๋ํ ์ด๋๊ฐ ํ ๋นํ ํ ํฝ๊ณผ ํํฐ์ ์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋๋ก ํฉ๋๋ค.
- ์ปจ์๋จธ ๊ทธ๋ฃน ๋ฆฌ๋
- ์ปจ์๋จธ ์ค ํ๋๊ฐ ์ปจ์๋จธ๋ค์ ์กฐ์จํ๋ ๊ทธ๋ฃน ๋ฆฌ๋๊ฐ ๋ฉ๋๋ค.
- ๋ณดํต ๊ทธ๋ฃน ์ฝ๋๋ค์ดํฐ์ ๊ฐ์ฅ ๋จผ์ ์ ์ดํ ์ปจ์๋จธ๊ฐ ๊ทธ๋ฃน ๋ฆฌ๋๊ฐ ๋ฉ๋๋ค.
- ๊ทธ๋ฃน ์ฝ๋๋คํฐ์ด๊ฐ ํธ๋ฆฌ๊ฑฐ ํ ๋ฆฌ๋ฐธ๋ฐ์ฑ์ ๊ทธ๋ฃน ๋ฆฌ๋๊ฐ ์ํ ํฉ๋๋ค.
์ปดํฌ๋ํธ๋ค์ ์ํธ์์ฉ
๊ฐ ๊ณผ์ ์ ๋ฐ๋ผ๊ฐ๋ฉฐ ์ปจ์๋จธ ๊ทธ๋ฃน์ด ์ด๋ป๊ฒ ์ฝ๋๋ค์ด์ ๋๋์ง ์ดํด๋ด ์๋ค. Confluent์ โConsumer Group Protocolโ๋ผ๋ ์์์์ ์ด๋ฅผ ์์ธํ ์ค๋ช ํด์ฃผ๊ณ ์์ต๋๋ค.
Find Group Coordinator
Confluent: Consumer Group Protocol
์ปจ์๋จธ ์ดํ๋ฆฌ์ผ์ด์
์ ์คํ ๋ ๋, ์นดํ์นด ํด๋ฌ์คํฐ์ FindCoordinator
์์ฒญ์ ๋ณด๋
๋๋ค. ์ด๋, group.id
๊ฐ ์ค๋ ค ์์ฒญ์ด ์ ์ก๋๋๋ฐ, ์ด ๊ฐ์ ํด์ฑ๋์ด __consumer_offsets
์ ์ด๋ฃจ๋ ๋์๋๋ ํํฐ์
๊ณผ ๋งค์นญ ๋ฉ๋๋ค.
__consumer_offsets
ํ ํฝ์ ์นดํ์นด ํด๋ฌ์คํฐ์ ์ฐ๊ฒฐ๋ ์ปจ์๋จธ ๊ทธ๋ฃน์ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ์์คํ
ํ ํฝ ์
๋๋ค. ์ปจ์๋จธ ๊ทธ๋ฃน์ด ์นดํ์นด ํด๋ฌ์คํฐ์ FindCoordinator
๋ฅผ ์์ฒญํ๋ฉด, ํด๋ฌ์คํฐ๋ฅผ ๊ตฌ์ฑํ๋ ๋ธ๋ก์ปค ์ค ํ๋๊ฐ ๊ทธ ์ปจ์๋จธ ๊ทธ๋ฃน์ ์ฝ๋๋ค์ด์
์ ์ ๋ด ํ๊ฒ ๋ฉ๋๋ค.
์ด๋ค ๋ธ๋ก์ปค๊ฐ ์ปจ์๋จธ ๊ทธ๋ฃน์ ์ ๋ดํ ์ง๋ ์ปจ์๋จธ ๊ทธ๋ฃน์ group.id
์ ํด์๊ฐ๊ณผ ๊ด๋ จ ์์ต๋๋ค. group.id
๋ ํด์ฑ ๋์ด์ __consumer_offsets
ํ ํฝ์ ํํฐ์
์ค ํ๋์ ํ ๋น ๋์ด ์ ๋ณด๊ฐ ๊ด๋ฆฌ ๋ฉ๋๋ค. ์ด๋, group.id
์ ๋์ ๋๋ ํํฐ์
์ ๋ฆฌ๋ ํํฐ์
์ ๊ด๋ฆฌํ๋ ๋ธ๋ก์ปค๊ฐ ํด๋น Consumer Group์ ์ฝ๋๋ค์ด์
์ ์ ๋ด ํ๊ฒ ๋ฉ๋๋ค.
์ฐธ๊ณ ๋ก __consumer_offsets
ํ ํฝ์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก 50๊ฐ์ ํํฐ์
์ Replication 3์ผ๋ก ๊ตฌ์ฑ ๋ฉ๋๋ค.
๊ฐ ์ปจ์๋จธ๋ FindCoordinator
์์ฒญ์ ์๋ต์ผ๋ก ์ปจ์๋จธ ๊ทธ๋ฃน์ ๊ด๋ฆฌํ ์ฝ๋๋ค์ดํฐ๊ฐ ์๋ ๋ธ๋ก์ปค์ endpoint๋ฅผ ์๋ต์ผ๋ก ๋๋ ค ๋ฐ๊ณ , ์์ผ๋ก ํด๋น ๋ธ๋ก์ปค์๋ง ์์ฒญ์ ๋ณด๋
๋๋ค.
Members Join
Confluent: Consumer Group Protocol
๊ฐ ์ปจ์๋จธ๋ ์ ๋ฌ๋ฐ์ endpoint๋ก JoinGroup
์์ฒญ์ ๋ณด๋
๋๋ค. ์ฌ๊ธฐ์๋ Topic subscription๊ณผ ๊ด๋ จ๋ ์ ๋ณด๊ฐ ์ ๋ฌ๋ฉ๋๋ค.
๊ทธ๋ฃน ์ฝ๋๋ค์ดํฐ๋ JoinGroup
์์ฒญ์ ๋ณด๋ธ ์ปจ์๋จธ ์ค ํ๋๋ฅผ ๊ทธ๋ฃน ๋ฆฌ๋๋ก ์ ์ ํ์ฌ ์๋ต์ ๋ณด๋
๋๋ค. ๋ณดํต์ ์ ์ผ ๋จผ์ ์์ฒญ์ ๋ณด๋ธ ์ปจ์๋จธ๊ฐ ๊ทธ๋ฃน ๋ฆฌ๋๊ฐ ๋ฉ๋๋ค
์๋ต์๋ ๊ฐ ์ปจ์๋จธ์ ํ ๋น๋ memberId
๊ฐ์ด ๋ด๊ฒจ์ ์ ๋ฌ๋ฉ๋๋ค. ๊ทธ๋ฃน ๋ฆฌ๋์๊ฒ๋ ์ ์ฒด ๋ฉค๋ฒ ๋ฆฌ์คํธ์ subscription๊ณผ ๊ด๋ จ๋ ์ ๋ณด๊ฐ ์ ๋ฌ๋ฉ๋๋ค. ์ด๋ ๊ทธ๋ฃน ๋ฆฌ๋๊ฐ ์ค์ ํํฐ์
ํ ๋น๊ณผ ๋ฆฌ๋ฐธ๋ฐ์ฑ ์์
์ ์ํํ๊ธฐ ๋๋ฌธ์
๋๋ค.
Partitions Assigned
Confluent: Consumer Group Protocol
๊ทธ๋ฃน ๋ฆฌ๋๋ JoinGroup
์์ฒญ์์ ๋ฉค๋ฒ ๋ฆฌ์คํธ์ ๋ํ ์ ๋ณด๋ฅผ ๋ฐ์ต๋๋ค. ๊ทธ๋ฃน ๋ฆฌ๋๋ โํํฐ์
ํ ๋น(Partition Assign)โ ๊ณํ์ ์๋ฆฝ ํฉ๋๋ค. ํ ๋น ์ ์ฑ
์ ์ปจ์๋จธ ๊ทธ๋ฃน์ partition.assignment.strategy
์ ์ ์๋์ด ์๊ณ , ์๋์ ๊ฐ์ ์ต์
๋ค์ด ์์ต๋๋ค.
- RoundRobinAssignor
- RangeAssignor
- StickyAssignor
ํํฐ์ ์ด์ธ์ธ์ ๋ํ ๋ถ๋ถ์ ๋ณ๋ ํฌ์คํธ์์ ์ข๋ ๋ค๋ค๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
๊ทธ๋ฃน ๋ฆฌ๋๊ฐ ํํฐ์
ํ ๋น์ ๊ณํ์ ์๋ฆฝํ๋ฉด, ๋ธ๋ก์ปค์๊ฒ SyncGroup
์์ฒญ์ ๋ณด๋ด์ด ํด๋น ์ ๋ณด๋ฅผ ์ ๋ฌํฉ๋๋ค. ์ด ์ ๋ณด๋ ๊ฐ ์ปจ์๋จธ๊ฐ SyncGroup
์์ฒญ์ ํ ๋, ์๋ต์ผ๋ก ์ ๋ฌ ๋ฉ๋๋ค.
Commit Consumption
Confluent: Consumer Group Protocol
์ปจ์๋จธ ๊ทธ๋ฃน์ ํ ๋น ๋ฐ์ ํํฐ์
์ ๋ฐ์ดํฐ๋ฅผ Subscription ํ์ฌ ์ฒ๋ฆฌ ํ ํ, ์ฒ๋ฆฌ ์ ๋ณด๋ฅผ ๊ธฐ๋กํ๊ธฐ ์ํด ๋ธ๋ก์ปค์ CommitOffset
์์ฒญ์ ๋ณด๋
๋๋ค. ๊ทธ๋ฌ๋ฉด, ๋ธ๋ก์ปค๋ __consumer_offsets
ํ ํฝ์ ์ด ์ ๋ณด๋ฅผ ๋ฐ์ํฉ๋๋ค.
Fetching Offset
Confluent: Consumer Group Protocol
์ปจ์๋จธ ๊ทธ๋ฃน์ด ์ฌ์์ํ๊ฑฐ๋ ๋งจ์ฒ์์ ์คํ๋๋ ๊ฒฝ์ฐ, ๋ธ๋ก์ปค์๊ฒ์ ์ฒ๋ฆฌํ Offset ์ ๋ณด๋ฅผ ๋ฐ์์ผ ํฉ๋๋ค. ๊ฐ ์ปจ์๋จธ๋ OffsetFetch
์์ฒญ์ ๋ธ๋ก์ปค์ ๋ณด๋ด๊ณ , ๊ธฐ์กด์ ์ฒ๋ฆฌํ๋ ์ ๋ณด๊ฐ ์๋ค๋ฉด ๊ทธ ์ ๋ณด๋ฅผ, ์ฒ๋ฆฌํ๋ ์ ๋ณด๊ฐ ์๋ค๋ฉด, ์ปจ์๋จธ์ auto.offset.reset
๊ฐ์ ๋ฐ๋ผ Offset ๊ฐ์ ๊ฒฐ์ ํด ์๋ต์ผ๋ก ๋ฐํํฉ๋๋ค.
๋งบ์๋ง
๊ทธ๋์ ์นดํ์นด๋ฅผ ์ฌ์ฉํ๋ฉด์, โ๊ณ ์ฑ๋ฅ์ด๊ณ ๊ณ ๊ฐ์ฉ์ฑ์ ๊ฐ์ถ๋ ๋ถ์ฐ MQโ ์ ๋๋ผ๊ณ ์๊ฐํ์ต๋๋ค. ๊ทธ๋ฐ๋ฐ ๋ง์๋จน๊ณ ์นดํ์นด๋ฅผ ๊น๊ฒ ๊ณต๋ถํด๋ณด๋, ์์ ํน์ฑ๋ค์ ๊ฐ์ถ๊ธฐ ์ํด ํ์ํ ๊ตฌํ๊ณผ ์ปจ์ ์ด ํ ๋์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค ใ ใทใท
๋ ๋ง์ด ์๋ฉด, ๋ ์ฌ๋ฐ๋ ๊ฒ๋ค์ ๋ง์ด ํด๋ณผ ์ ์๋๋ฒ!! ใ ใ ์์ ๋ณด๋ค๋ ํ์์์ ์ ๊ฒฝ ์ธ ๊ฒ๋ค์ด ๋ง์์ ์๋ก์ด ๊ฑธ ๋ฐ๋ฅ๊น์ง ์ตํ๋ณผ ์๊ฐ์ด ๋ถ์กฑํ๋๋ฐ, ์ค๋๋ง์ ์ฆ๊ฒ๊ฒ ๊ณต๋ถํ๊ณ ์์ต๋๋ค ๐