Skip to content

ghgh415263/kafkademo

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

35 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

kafka

  1. ๋ธŒ๋กœ์ปค

    • ์นดํ”„์นด ํด๋Ÿฌ์Šคํ„ฐ๋Š” ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋ธŒ๋กœ์ปค (์„œ๋ฒ„)
    • ๊ฐ๊ฐ์˜ ๋ธŒ๋กœ์ปค๋Š” id๊ฐ€ ์žˆ๋‹ค
    • Kafka ํด๋Ÿฌ์Šคํ„ฐ์˜ ํ•œ ๋ธŒ๋กœ์ปค์— ์—ฐ๊ฒฐํ•˜๋ฉด, ํ•ด๋‹น ๋ธŒ๋กœ์ปค๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ(๋‹ค๋ฅธ ๋ธŒ๋กœ์ปค ์ •๋ณด ํฌํ•จ)๋ฅผ ์ œ๊ณตํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ ์ „์ฒด์™€ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.
    • ์ตœ์†Œ ์ถ”์ฒœ ๋ธŒ๋กœ์ปค๋Š” 3๊ฐœ -> ๋ฐฑ๊ฐœ ๋„˜๊ฐœ ๋งŒ๋“ค ์ˆ˜ ๋„ ์žˆ๋‹ค
    • ํ† ํ”ฝ์˜ ํŒŒํ‹ฐ์…˜๋“ค์€ broker๋“ค์— ๋‚˜๋‰œ๋‹ค => ํŒŒํ‹ฐ์…˜๊ณผ ๋ธŒ๋กœ์ปค๊ฐ€ ๋งŽ์•„์งˆ ์ˆ˜๋ก ์—ฌ๋Ÿฌ ๊ณณ์— ๋‚˜๋‰œ๋‹ค. image

  2. Bootstrap Server

    • Kafka ํด๋Ÿฌ์Šคํ„ฐ์™€ ํด๋ผ์ด์–ธํŠธ(์˜ˆ: Producer๋‚˜ Consumer) ๊ฐ„์˜ ์ดˆ๊ธฐ ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์„œ๋ฒ„ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
    • ํด๋ผ์ด์–ธํŠธ๋Š” Bootstrap Server๋กœ ์ดˆ๊ธฐ ์—ฐ๊ฒฐ์„ ์‹œ๋„ํ•˜๊ณ , ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ „์ฒด ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ(๋ธŒ๋กœ์ปค ID, ํŒŒํ‹ฐ์…˜ ์ •๋ณด, ํ† ํ”ฝ ์ •๋ณด ๋“ฑ)๋ฅผ ๋ฐ›์•„์˜ต๋‹ˆ๋‹ค.
    • bootstrap.servers=broker1:9092,broker2:9092,broker3:9092 ๊ฐ™์ด ์„ค์ •ํ•œ๋‹ค.
    • ์—ฌ๊ธฐ์„œ broker1, broker2, broker3๋Š” Kafka ๋ธŒ๋กœ์ปค์˜ ์ฃผ์†Œ์ด๋ฉฐ, ํด๋ผ์ด์–ธํŠธ๋Š” ์ด๋“ค ์ค‘ ํ•˜๋‚˜์— ์—ฐ๊ฒฐํ•ด ํด๋Ÿฌ์Šคํ„ฐ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค. image
  3. Zookeeper

์™œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ Zookeeper๋ฅผ ์‚ฌ์šฉํ• ๊นŒ์š”?

์ƒ์‚ฐ ํ™˜๊ฒฝ์—์„œ๋Š” **Zookeeper ๋…ธ๋“œ ์—ฌ๋Ÿฌ ๊ฐœ(Ensemble)**๋ฅผ ์šด์˜ํ•˜๋Š” ๊ฒƒ์ด ์žฅ์•  ๋Œ€์‘์„ ์œ„ํ•ด ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ Zookeeper ์„œ๋ฒ„ ํ•˜๋‚˜๊ฐ€ ๋‹ค์šด๋˜๋”๋ผ๋„, ๋Œ€๋‹ค์ˆ˜์˜ ๋…ธ๋“œ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•˜๊ณ  ์žˆ๋‹ค๋ฉด Zookeeper Ensemble๋Š” ๊ณ„์† ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Zookeeper์™€ Kafka์˜ ์ƒํ˜ธ์ž‘์šฉ

  1. ๋ธŒ๋กœ์ปค ๋“ฑ๋ก:

    • Kafka ๋ธŒ๋กœ์ปค๊ฐ€ ์‹œ์ž‘๋˜๋ฉด Zookeeper์— ์ž์‹ ์„ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.
    • Zookeeper๋Š” ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด ๋ชจ๋“  ํ™œ์„ฑ ๋ธŒ๋กœ์ปค์˜ ๋ชฉ๋ก์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  2. ๋ฆฌ๋” ์„ ์ถœ:

    • ๊ฐ ํŒŒํ‹ฐ์…˜์— ๋Œ€ํ•ด Zookeeper๋Š” ๋ฆฌ๋” ๋ธŒ๋กœ์ปค๋ฅผ ์ถ”์ ํ•ฉ๋‹ˆ๋‹ค.
    • ๋งŒ์•ฝ ๋ฆฌ๋” ๋ธŒ๋กœ์ปค๊ฐ€ ๋‹ค์šด๋˜๋ฉด, Zookeeper๋Š” ๋ณต์ œ๋ณธ ์ค‘์—์„œ ์ƒˆ๋กœ์šด ๋ฆฌ๋”๋ฅผ ์„ ์ถœํ•˜์—ฌ ์ž‘์—…์„ ์ด์–ด๊ฐ‘๋‹ˆ๋‹ค. (์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์ƒˆ๋กœ์šด ๋ฆฌ๋”๋ฅผ ์„ ์ถœํ•˜๊ณ  Zookeeper์— ๋ฐ˜์˜)
  3. ํด๋Ÿฌ์Šคํ„ฐ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ:

    • Zookeeper๋Š” Kafka ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
    • ์—ฌ๊ธฐ์—๋Š” ํ† ํ”ฝ, ํŒŒํ‹ฐ์…˜, ๋ณต์ œ๋ณธ ๋“ฑ์˜ ์ •๋ณด๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
  4. ์†Œ๋น„์ž ์˜คํ”„์…‹:

    • Zookeeper๋Š” ์†Œ๋น„์ž๊ฐ€ ํŠน์ • ํ† ํ”ฝ์—์„œ ํ˜„์žฌ ์ฝ๊ณ  ์žˆ๋Š” ์˜คํ”„์…‹์„ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ํ•˜์ง€๋งŒ ์ตœ์‹  Kafka ๋ฒ„์ „์—์„œ๋Š” ์†Œ๋น„์ž ์˜คํ”„์…‹์„ Kafka ์ž์ฒด์˜ ํ† ํ”ฝ(์˜ˆ: __consumer_offsets)์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์ „์—๋Š” Zookeeper๊ฐ€ ์˜คํ”„์…‹์„ ์ €์žฅํ–ˆ์œผ๋‚˜, ํ˜„์žฌ๋Š” Kafka ์ž์ฒด๊ฐ€ ์ด๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  5. Zookeeper ๊ธฐ๋ฐ˜ vs KRaft(Kafka Raft) ๊ธฐ๋ฐ˜

    • Kafka Controller๋Š” ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์ค‘์•™ ๋…ธ๋“œ์ด๋ฉฐ, Zookeeper๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๊ณ  KRaft ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Œ.
    • Zookeeper ๊ธฐ๋ฐ˜ Kafka (๊ธฐ์กด ๋ฐฉ์‹)
      • Zookeeper๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌ
      • ๋ธŒ๋กœ์ปค ์ค‘ ํ•˜๋‚˜๊ฐ€ Controller๋กœ ์„ ์ถœ๋˜์–ด ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์„ ๋‹ด๋‹น
      • ๋งŒ์•ฝ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋‹ค์šด๋˜๋ฉด Zookeeper๊ฐ€ ์ƒˆ๋กœ์šด ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์„ ์ถœ
      • ๋‹จ์ : Zookeeper์™€์˜ ํ†ต์‹ ์ด ํ•„์š”ํ•˜์—ฌ ๋ณต์žก์„ฑ์ด ์ฆ๊ฐ€ํ•˜๊ณ  ์ง€์—ฐ ์‹œ๊ฐ„์ด ๋ฐœ์ƒ
    • KRaft
      • Zookeeper ์—†์ด Kafka ๋‚ด๋ถ€์—์„œ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๊ด€๋ฆฌ
      • ์—ฌ๋Ÿฌ ๊ฐœ์˜ Controller ๋…ธ๋“œ๊ฐ€ ์กด์žฌํ•˜๋ฉฐ, ์ด ์ค‘ ํ•˜๋‚˜๊ฐ€ Quorum Leader(์ตœ๊ณ  ๊ด€๋ฆฌ์ž)๊ฐ€ ๋จ. [controller1, controller2, broker1, broker2]
      • Raft Consensus ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์ˆ˜๊ฒฐ ๋ฐฉ์‹์œผ๋กœ ํด๋Ÿฌ์Šคํ„ฐ ์ƒํƒœ๋ฅผ ๋™๊ธฐํ™”.
      • ์žฅ์ : Zookeeper ์—†์ด Kafka๋งŒ์œผ๋กœ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋ฏ€๋กœ ๋” ๋น ๋ฅด๊ณ  ์•ˆ์ •์ .


โœ… Kafka์™€ Zookeeper์˜ ์ƒํ˜ธ์ž‘์šฉ ์š”์•ฝ

1. ๋ธŒ๋กœ์ปค ๋“ฑ๋ก

  • Kafka ๋ธŒ๋กœ์ปค๋Š” Zookeeper์— ephemeral ๋…ธ๋“œ๋กœ ์ž์‹ ์„ ๋“ฑ๋ก (/brokers/ids/<broker_id>)
  • ์ด ๋…ธ๋“œ๋Š” ๋ธŒ๋กœ์ปค๊ฐ€ ์ฃฝ๊ฑฐ๋‚˜ ๋„คํŠธ์›Œํฌ๊ฐ€ ๋Š๊ธฐ๋ฉด ์ž๋™์œผ๋กœ ์‚ญ์ œ๋จ

2. ๋ธŒ๋กœ์ปค ์ƒํƒœ ๊ฐ์ง€ (ํ•˜ํŠธ๋น„ํŠธ ๊ฐ์ง€ ๋ฐฉ์‹)

  • โŒ Zookeeper๊ฐ€ ํ•˜ํŠธ๋น„ํŠธ๋ฅผ ๋ณด๋‚ด๋Š” ๊ฑด ์•„๋‹˜
  • โœ… Kafka ๋ธŒ๋กœ์ปค๊ฐ€ Zookeeper์™€ ์„ธ์…˜์„ ์œ ์ง€ํ•จ์œผ๋กœ์จ ์‚ด์•„์žˆ์Œ์„ ํ‘œํ˜„
  • ์ปจํŠธ๋กค๋Ÿฌ๋Š” Zookeeper์— watch๋ฅผ ๊ฑธ์–ด ๋…ธ๋“œ ์‚ญ์ œ ์ด๋ฒคํŠธ ๊ฐ์ง€ โ†’ ๋ธŒ๋กœ์ปค ์žฅ์•  ํŒ๋‹จ

3. ๋ฆฌ๋” ์„ ์ถœ

  • ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋ธŒ๋กœ์ปค ์žฅ์• ๋ฅผ ๊ฐ์ง€ํ•˜๋ฉด โ†’ ISR ์ค‘ ํ•˜๋‚˜๋ฅผ ์ƒˆ ๋ฆฌ๋”๋กœ ์„ ์ถœ
  • Zookeeper๋Š” ๋‹จ์ˆœํžˆ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ฐ์‹œ ํŠธ๋ฆฌ๊ฑฐ๋งŒ ์ œ๊ณต, ์„ ์ถœ ๋กœ์ง์€ Kafka ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์ˆ˜ํ–‰

4. ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ

  • Zookeeper๋Š” ํ† ํ”ฝ, ํŒŒํ‹ฐ์…˜, ๋ธŒ๋กœ์ปค ๋“ฑ ํด๋Ÿฌ์Šคํ„ฐ ์ •๋ณด๋ฅผ ์ €์žฅ
  • ์ตœ์‹  Kafka๋Š” KRaft ๋ชจ๋“œ์—์„œ Zookeeper ์—†์ด๋„ ์ž์ฒด ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ ๊ฐ€๋Šฅ

5. ์˜คํ”„์…‹ ์ €์žฅ

  • ์˜ˆ์ „์—” Zookeeper๊ฐ€ ์˜คํ”„์…‹ ์ €์žฅ
  • ์ตœ์‹  ๋ฒ„์ „์€ __consumer_offsets ํ† ํ”ฝ์„ ์‚ฌ์šฉํ•˜์—ฌ Kafka ๋‚ด๋ถ€์— ์ €์žฅ

โœ… Zookeeper vs KRaft ์ฐจ์ด ์ •๋ฆฌ

ํ•ญ๋ชฉ Zookeeper ๊ธฐ๋ฐ˜ KRaft ๊ธฐ๋ฐ˜
์ปจํŠธ๋กค๋Ÿฌ ์„ ์ถœ Zookeeper๊ฐ€ ์„ ์ถœ ์ฐธ์—ฌ Raft ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‚ฌ์šฉ
๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ €์žฅ Zookeeper์— ์ €์žฅ Kafka ๋‚ด๋ถ€ ์ €์žฅ
ํ•˜ํŠธ๋น„ํŠธ ๊ฐ์ง€ Zookeeper ์„ธ์…˜ ๊ฐ์ง€ Kafka ๋‚ด๋ถ€ ์ฒ˜๋ฆฌ
์žฅ์  ์•ˆ์ •์ ์ด์ง€๋งŒ ๋ณต์žก ๋” ๋‹จ์ˆœํ•˜๊ณ  ๋น ๋ฆ„ (ZK ์ œ๊ฑฐ)

Topic & Partition

  1. Topic

    • ์–ด๋–ค ๋ฐ์ดํ„ฐ ํ˜•ํƒœ๋“  ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ํŠน์ • ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ (๋ฉ”์‹œ์ง€์˜ ์‹œํ€€์Šค)
    • db์˜ ํ…Œ์ด๋ธ”๊ณผ ๋น„์Šทํ•œ ๊ฐœ๋…
    • topic name์œผ๋กœ ๊ตฌ๋ถ„์ง€์–ด์ง
    • producer๋กœ ํŠน์ • ํ† ํ”ฝ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๊ณ  consumer๋กœ ํ† ํ”ฝ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š”๋‹ค.
    • ์˜ˆ์‹œ : ํŠธ๋Ÿญ์ด ์นดํ”„์นด ์„œ๋ฒ„๋กœ ์ž์‹ ์˜ ์œ„์น˜ ์ •๋ณด๋ฅผ ๋ณด๋ƒ„ -> ์œ„์น˜ ์ •๋ณด์—๋Š” TRUCK ID์™€ TRUCK POSITON์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๋‹ด๊ฒจ์žˆ์Œ -> ์ด๊ฑธ trucks_gps ๋ผ๋Š” ํ† ํ”ฝ์„ ๋งŒ๋“ค์–ด์„œ ๊ฑฐ๊ธฐ์—๋‹ค๊ฐ€ ์ ์žฌํ•จ
  2. Topic ๋ณต์ œ

    • Replication Factor๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ 3์œผ๋กœ ์„ค์ •๋˜๋ฉฐ, ๋ธŒ๋กœ์ปค ๊ฐœ์ˆ˜๋ฅผ ์ดˆ๊ณผํ•  ์ˆ˜ ์—†๋‹ค.
    • ํ•˜๋‚˜์˜ ํŒŒํ‹ฐ์…˜์ด ๋ฆฌ๋”์™€ isr๋กœ ๋‚˜๋‰˜์–ด ๊ฐ๊ฐ ๋‹ค๋ฅธ ๋ธŒ๋กœ์ปค์— ์ €์žฅ๋จ
    • ๋ฆฌ๋”๋ฅผ ๊ฐ€์ง„ ๋ธŒ๋กœ์ปค๊ฐ€ ์ฃฝ์œผ๋ฉด ๋‹ค๋ฅธ ๋ธŒ๋กœ์ปค์˜ isr์„ ๋ฆฌ๋”๋กœ ๋ฐ”๊ฟˆ
    • ์นดํ”„์นด 2.4๋ถ€ํ„ฐ๋Š” ํ”„๋กœ๋“€์„œ๋Š” leader์— ์“ฐ๊ณ  ์ปจ์Šˆ๋จธ๋Š” isr(ํŒ”๋กœ์›Œ)์—์„œ ์ฝ๋Š” ํ˜•ํƒœ๋„ ๋“ฑ์žฅํ–ˆ๋‹ค. ๋งŒ์•ฝ leader๋ณด๋‹ค isr์—์„œ ์ฝ๋Š” ๊ฒŒ ๋” ํšจ์œจ์ ์ด๋ฉด ์‚ฌ์šฉ. image
  3. Partition

    • topic์€ ์—ฌ๋Ÿฌ๊ฐœ์˜ ํŒŒํ‹ฐ์…˜์œผ๋กœ ๊ตฌ์„ฑ๋  ์ˆ˜ ์žˆ๋‹ค.
    • ๊ฐ๊ฐ์˜ ํŒŒํ‹ฐ์…˜๋“ค์€ ๊ฐ์ž์˜ ์ˆœ์„œ๋กœ ์ •๋ ฌ๋˜์–ด ์žˆ๋‹ค.
    • ํŒŒํ‹ฐ์…˜๋“ค์€ ๊ฐ์ž offest์ด๋ผ๊ณ  ๋ถ€๋ฅด๋Š” incremental id๊ฐ€ ์žˆ๋‹ค.
    • offset์€ ์žฌ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค. ์ด์ „ ๋ฉ”์‹œ์ง€๊ฐ€ ์ „๋ถ€ ์‚ญ์ œ๋˜์–ด๋„...
    • ํŒŒํ‹ฐ์…˜์— ์“ฐ์—ฌ์ง„ ๋ฐ์ดํ„ฐ๋Š” ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. (IMMUTABLE)
    • ๋ฐ์ดํ„ฐ๋Š” ํŠน์ • ๊ธฐ๊ฐ„๊นŒ์ง€๋Š” ์œ ์ง€ํ•œ๋‹ค. (๋””ํดํŠธ 7์ผ)
  4. Partitioner

    • DefaultPartitioner (๊ธฐ๋ณธ๊ฐ’) Key๊ฐ€ ์žˆ์œผ๋ฉด ํ•ด์‹œ ๊ธฐ๋ฐ˜, ์—†์œผ๋ฉด Round Robin ํ‚ค ๊ธฐ๋ฐ˜ ์ˆœ์„œ ์œ ์ง€, ๋ถ€ํ•˜ ๋ถ„์‚ฐ ํŠน์ • ํ‚ค์— ํŠธ๋ž˜ํ”ฝ ์ง‘์ค‘ ๊ฐ€๋Šฅ
    • UniformStickyPartitioner ํ‚ค ์—†๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ํŠน์ • ํŒŒํ‹ฐ์…˜์— ์ผ์ •๋Ÿ‰ ๋ฌถ์–ด์„œ ์ „์†ก ๋ฐฐ์น˜ ์ตœ์ ํ™”, ์ˆœ์„œ ์œ ์ง€ ๊ฐ€๋Šฅ ํŠน์ • ํŒŒํ‹ฐ์…˜ ๊ณผ๋ถ€ํ•˜ ๊ฐ€๋Šฅ
    • Custom Partitioner ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— ๋”ฐ๋ผ ์ง์ ‘ ํŒŒํ‹ฐ์…˜ ์ง€์ • ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ ์ตœ์ ํ™” ๊ฐ€๋Šฅ ๊ตฌํ˜„์ด ๋ณต์žกํ•  ์ˆ˜ ์žˆ์Œ

๋ฆฌ๋” ๋ธŒ๋กœ์ปค ์žฅ์•  ์ฒ˜๋ฆฌ ๊ณผ์ •

1๏ธโƒฃ ๋ฆฌ๋” ๋ธŒ๋กœ์ปค ์žฅ์•  ๋ฐœ์ƒ : ํŠน์ • ๋ธŒ๋กœ์ปค๊ฐ€ ๋‹ค์šด๋˜๋ฉด์„œ ๋ฆฌ๋” ํŒŒํ‹ฐ์…˜์ด ๋น„ํ™œ์„ฑํ™”๋จ.

2๏ธโƒฃ Kafka ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์žฅ์•  ๊ฐ์ง€ ๋ฐ ๋ฆฌ๋” ๊ต์ฒด : ์ปจํŠธ๋กค๋Ÿฌ ๋ธŒ๋กœ์ปค๊ฐ€ ๋‹ค์šด๋œ ๋ธŒ๋กœ์ปค๋ฅผ ๊ฐ์ง€ํ•˜๊ณ , ํ•ด๋‹น ํŒŒํ‹ฐ์…˜์˜ ISR ์ค‘ ํ•˜๋‚˜๋ฅผ ์ƒˆ๋กœ์šด ๋ฆฌ๋”๋กœ ์Šน๊ฒฉํ•จ. (Zookeeper/KRaft๋Š” ์ปจํŠธ๋กค๋Ÿฌ ์„ ์ถœ์šฉ)

3๏ธโƒฃ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๊ฐฑ์‹  ๋ฐ ๋ธŒ๋กœ์ปค ์ „ํŒŒ : ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์ƒˆ๋กœ์šด ๋ฆฌ๋” ์ •๋ณด๋ฅผ ๋ชจ๋“  ๋ธŒ๋กœ์ปค์— ์ „ํŒŒ. ๋ธŒ๋กœ์ปค๋“ค์€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ํ…Œ์ด๋ธ”์„ ๊ฐฑ์‹ .

4๏ธโƒฃ Producer/Consumer๋Š” ์—๋Ÿฌ ๊ฐ์ง€ ํ›„ ์ž๋™ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๊ฐฑ์‹  : NotLeaderForPartition ์˜ˆ์™ธ ๋“ฑ์„ ํ†ตํ•ด ๋ฆฌ๋” ๋ณ€๊ฒฝ์„ ๊ฐ์ง€ํ•˜๊ณ , ์ž๋™์œผ๋กœ ์ƒˆ ๋ฆฌ๋”๋กœ ์š”์ฒญ์„ ์žฌ์‹œ๋„ํ•จ.

Producer

  1. Producer

    • ํ† ํ”ฝ์— ๋ฐ์ดํ„ฐ๋ฅผ ์”€
    • ์นดํ”„์นด ๋ฉ”์‹œ์ง€ ํ˜•ํƒœ {key-binary, value -binary, ์••์ถ• ํƒ€์ž… gzip ๋“ฑ๋“ฑ, ํ—ค๋” (์˜ต์…”๋„) ํ‚ค๋ฒจ๋ฅ˜ ํ˜•ํƒœ, ํŒŒํ‹ฐ์…˜๊ณผ offset, ํƒ€์ž„์Šคํƒฌํ”„}
    • ์ƒ์‚ฐ์ž๋Š” ์–ด๋А ํŒŒํ‹ฐ์…˜์— ์“ธ์ง€๋ฅผ ์•Œ๊ณ  ์žˆ๋‹ค. ์ฆ‰ ํŒŒํ‹ฐ์…˜ ๊ฒฐ์ •์€ ์ƒ์‚ฐ์ž๊ฐ€ ํ•œ๋‹ค. (ํ”„๋กœ๋“€์„œ ๋‚ด๋ถ€์— ํŒŒํ‹ฐ์…”๋„ˆ๊ฐ€ ๊ฒฐ์ •ํ•จ)
      • key๋ฅผ ์„ค์ •ํ•ด์„œ ๋ณด๋‚ด๋ฉด ํ•ด์‹œ๊ฐ’์„ ๊ณ„์‚ฐํ•ด์„œ ์–ด๋А ํŒŒํ‹ฐ์…˜์— ๋„ฃ์„์ง€ ์ •ํ•จ. ํ‚ค๊ฐ€ ๊ฐ™์€ ๋ฉ”์‹œ์ง€๋Š” ํ•œ ํŒŒํ‹ฐ์…˜๋‚ด์—์„œ ์ˆœ์„œ๊ฐ€ ์œ ์ง€๋œ๋‹ค.
      • key๋ฅผ ์„ค์ •ํ•˜์ง€ ์•Š์œผ๋ฉด round robin ๋ฐฉ์‹์œผ๋กœ ํŒŒํ‹ฐ์…˜์— ๋„ฃ์Œ. ํ˜„์žฌ๋Š” sticky ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•จ.
    • Recovery
      • ๋ธŒ๋กœ์ปค ์ผ์‹œ์  ๋‹ค์šด: retries ์„ค์ •์„ ํ™œ์šฉํ•˜์—ฌ ์ž๋™ ์žฌ์‹œ๋„
      • ๋ฆฌ๋” ๋ธŒ๋กœ์ปค ์žฅ์• : ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์—…๋ฐ์ดํŠธ ํ›„ ์ƒˆ๋กœ์šด ๋ฆฌ๋”๋กœ ์ „ํ™˜
      • ๋„คํŠธ์›Œํฌ ์žฅ์• : delivery.timeout.ms(์š”์ฒญ ๋ฐ ์žฌ์‹œ๋„๊นŒ์ง€ ํฌํ•จํ•œ ํƒ€์ž„์•„์›ƒ)์™€ request.timeout.ms(ํ•˜๋‚˜์˜ ์š”์ฒญ์— ๋Œ€ํ•œ ํƒ€์ž„์•„์›ƒ)๋กœ ํƒ€์ž„์•„์›ƒ ์„ค์ •
      • ์„ฑ๋Šฅ ์ตœ์ ํ™”: linger.ms(๋ฐฐ์น˜ ์Œ“๋Š” ๋Œ€๊ธฐ์‹œ๊ฐ„)์™€ batch.size๋ฅผ ์กฐ์ •ํ•˜์—ฌ ๋ฉ”์‹œ์ง€ ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ
      • ๋ฐ์ดํ„ฐ ์œ ์‹ค ๋ฐฉ์ง€: acks=all ๋ฐ min.insync.replicas ์„ค์ •์œผ๋กœ ์•ˆ์ „ํ•œ ์ €์žฅ ๋ณด์žฅ (min.insync.replicas๋Š” ๋ฆฌ๋”๋ฅผ ํฌํ•จํ•ด ์ตœ์†Œํ•œ ๋ช‡ ๊ฐœ์˜ ๋ณต์ œ๋ณธ์ด ๋ฐ์ดํ„ฐ์™€ ๋™๊ธฐํ™”๋˜์–ด ์žˆ์–ด์•ผ ํ•˜๋Š”์ง€ ์ง€์ •ํ•˜๋Š” ๊ฒƒ, ๋ธŒ๋กœ์ปค์ชฝ ์„ค์ •์ด๋‹ค. ๋งŒ์•ฝ ๋ธŒ๋กœ์ปค๊ฐ€ ์ฃฝ์–ด์„œ replicas๊ฐ€ 1์ด ๋˜๋ฉด min.insync.replicas=2๋กœ ์„ค์ •๋˜์–ด ์žˆ๋‹ค๋ฉด ack ์•ˆ๋ณด๋ƒ„)
  2. ๋ฐ์ดํ„ฐ ์ „์†ก

    • properties๋กœ ์—ฐ๊ฒฐํ•  ์นดํ”„์นด์— ๋Œ€ํ•œ ์ •๋ณด ์„ค์ •
    • send๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๋ฉด ์•Œ์•„์„œ ๋ฐฐ์น˜๋กœ ๋ณด๋ƒ„ -> ์–ด๋А์ •๋„ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ์•„์„œ ๋ณด๋‚ธ๋‹ค.
    • flushํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ธ๋‹ค. close ์ง์ „์— ํ•ด์ค˜์•ผํ•จ.
  3. Retry

    • Producer๊ฐ€ ๋ฉ”์‹œ์ง€๋ฅผ ๋ธŒ๋กœ์ปค์— ์ „์†กํ•  ๋•Œ ์‹คํŒจํ•˜๋ฉด ์ž๋™์œผ๋กœ ์žฌ์‹œ๋„
    • ๋ฉ”์‹œ์ง€ ์ „์†ก ์‹คํŒจ ์‹œ ์ฆ‰์‹œ ์žฌ์‹œ๋„ํ•˜์ง€ ์•Š๊ณ  retry.backoff.ms ๋งŒํผ ๋Œ€๊ธฐ
    • retries ํšŸ์ˆ˜๋งŒํผ ์žฌ์‹œ๋„ ํ›„์—๋„ ์‹คํŒจํ•˜๋ฉด ์˜ˆ์™ธ ๋ฐœ์ƒ (TimeoutException)
    • acks=all์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฆฌ๋” ๋ธŒ๋กœ์ปค๊ฐ€ ๋ณ€๊ฒฝ๋œ ๊ฒฝ์šฐ์—๋„ ์žฌ์‹œ๋„ ๊ฐ€๋Šฅ
    • retries ๊ฐ’์ด ํฌ๋ฉด ์ค‘๋ณต ๋ฉ”์‹œ์ง€๊ฐ€ ์ „์†ก๋  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Œ โ†’ Idempotence ์„ค์ • (enable.idempotence=true) ์ถ”์ฒœ (๊ฐ™์€ ๋ฉ”์‹œ์ง€๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ์ „์†กํ•ด๋„ ์‹ค์ œ๋กœ ์นดํ”„์นด์—๋Š” ํ•œ ๋ฒˆ๋งŒ ์ €์žฅ) ํ”„๋กœ๋“€์„œid + seq ๋กœ ์ค‘๋ณตํ™•์ธ (seq๋Š” ํ”„๋กœ๋“€์„œ๊ฐ€ ๋ถ™์ธ๋‹ค.)
    • max.in.flight.requests.per.connection ๊ฐ’์ด ๋„ˆ๋ฌด ํฌ๋ฉด ์ˆœ์„œ ๋ณด์žฅ์ด ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Œ. ํŠนํžˆ, ๋„คํŠธ์›Œํฌ ์žฅ์• ๋‚˜ ์‘๋‹ต ์ˆœ์„œ์˜ ์ฐจ์ด๋กœ ์ธํ•ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  4. ๋ฉฑ๋“ฑ

    • Kafka์—์„œ ๊ฐ Producer๋Š” ๊ณ ์œ ํ•œ Producer ID (PID)๋ฅผ ๊ฐ€์ง
    • ์ƒˆ๋กœ์šด Producer๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด PID๊ฐ€ ๋ถ€์—ฌ๋จ (ex. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์žฌ์‹œ์ž‘๋˜๋ฉด ์ƒˆ๋กœ์šด PID๊ฐ€ ์ƒ์„ฑ๋จ)
    • Producer๊ฐ€ ์ „์†กํ•˜๋Š” ๊ฐ ๋ฉ”์‹œ์ง€์— ์ˆœ์ฐจ์ ์ธ Sequence Number๋ฅผ ๋ถ€์—ฌ
    • Kafka Broker๋Š” ๋™์ผํ•œ PID์—์„œ ์ค‘๋ณต๋œ Sequence Number๊ฐ€ ๋“ค์–ด์˜ค๋ฉด ๋ฌด์‹œ

Consumer

  1. Consumer

    • ํ† ํ”ฝ์—์„œ ๋ฐ์ดํ„ฐ๊ฐ€์ ธ์˜ด
    • ํŒŒํ‹ฐ์…˜๋งˆ๋‹ค ์ฝ๊ธฐ offset์ด ์žˆ์Œ (๊ฐ™์€ ํŒŒํ‹ฐ์…˜ ์•ˆ์—์„œ๋งŒ ์ˆœ์„œ ๋ณด์žฅ)
    • ํ‚ค์™€ ๋ฒจ๋ฅ˜๋ฅผ deserializer ํ•œ๋‹ค. deserializer๋Š” ์ปจ์Šˆ๋จธ์—์„œ ์„ค์ •ํ•ด์•ผํ•˜๊ณ  ์„ค์ •ํ•˜๋ ค๋ฉด ๋ฉ”์‹œ์ง€ ํฌ๋ฉง์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
    • Recovery
      • ๋ฆฌ๋” ๋ธŒ๋กœ์ปค ์žฅ์• : ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์—…๋ฐ์ดํŠธ ํ›„ ์ƒˆ๋กœ์šด ๋ฆฌ๋”๋กœ ์ „ํ™˜
      • Consumer ์žฅ์• : Consumer Group ๋ฆฌ๋ฐธ๋Ÿฐ์‹ฑ ํ›„ ์ž๋™ ๋ณต๊ตฌ (session.timeout.ms(์ปจ์Šˆ๋จธ๊ฐ€ ๋ช‡ ms ๋™์•ˆ heartbeat๋ฅผ ๋ณด๋‚ด์ง€ ์•Š์œผ๋ฉด ์ฃฝ์—ˆ๋‹ค๊ณ  ๊ฐ„์ฃผ)์™€ heartbeat.interval.ms(์ปจ์Šˆ๋จธ๊ฐ€ ๋ธŒ๋กœ์ปค์— heartbeat๋ฅผ ๋ณด๋‚ด๋Š” ์ฃผ๊ธฐ))
      • ๋ฐ์ดํ„ฐ ์œ ์‹ค ๋ฐฉ์ง€ : commit์„ ํ†ตํ•ด์„œ ์–ด๋””๊นŒ์ง€ ์ฒ˜๋ฆฌํ–ˆ๋Š”์ง€. Offset์„ commitํ•˜์ง€ ์•Š์œผ๋ฉด ์ปจ์Šˆ๋จธ๊ฐ€ ์žฌ์‹œ์ž‘ ์‹œ ์ด์ „ ๋ฐ์ดํ„ฐ๋ถ€ํ„ฐ ๋‹ค์‹œ ์ฝ์„ ์ˆ˜ ์žˆ์Œ.
  2. Consumer Group

    • ๊ฐ™์€ ๊ทธ๋ฃน์ด๋ฉด ๊ฐ๊ฐ ๋‹ค๋ฅธ ํŒŒํ‹ฐ์…˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š”๋‹ค.
      • consumer1์€ partition0 , consumer2์€ partition1 ๊ฒฐ๊ตญ, ๊ทธ๋ฃน ํ•˜๋‚˜๋Š” ํ•˜๋‚˜์˜ ํ† ํ”ฝ์— ์†ํ•œ ํŒŒํ‹ฐ์…˜๋“ค์„ ์ „๋ถ€ ์ฝ๋Š”๋‹ค.
    • ์ปจ์ˆ˜๋จธ ๊ทธ๋ฃน์˜ ์ปจ์Šˆ๋จธ๊ฐ€ ํŒŒํ‹ฐ์…˜๋ณด๋‹ค ๋งŽ์œผ๋ฉด ์ปจ์Šˆ๋จธ ํ•˜๋‚˜๋Š” ์•„๋ฌด๊ฒƒ๋„ ์•ˆํ•จ
    • ํ•˜๋‚˜์˜ ํ† ํ”ฝ์„ ์—ฌ๋Ÿฌ ์ปจ์Šˆ๋จธ ๊ทธ๋ฃน์ด ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค.
    • ๊ทธ๋ฃน๋‹น offset๋“ค์„ __consumer_offsets ์ด๋ผ๋Š” ํ† ํ”ฝ์— ์ €์žฅํ•œ๋‹ค.
    • ์ปค๋ฐ‹ ์ „๋žต
      • at least once: ๋ฉ”์‹œ์ง€๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ฉด ์ปค๋ฐ‹
      • at most once ๋ฉ”์‹œ์ง€ ๋ฐ›์œผ๋ฉด ์ปค๋ฐ‹
      • exactly once
  3. Static Group Membership

    • ์ผ์‹œ์ ์ธ ๋„คํŠธ์›Œํฌ ์žฅ์•  ๋˜๋Š” ์ปจ์Šˆ๋จธ ์žฌ์‹œ์ž‘ ์‹œ์—๋„ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ฐธ๋Ÿฐ์‹ฑ์ด ๋ฐœ์ƒํ•˜๋ฉด ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ์Œ
    • ์ปจ์Šˆ๋จธ๊ฐ€ ์žฌ์‹œ์ž‘๋˜๊ฑฐ๋‚˜ ์ผ์‹œ์ ์œผ๋กœ ์—ฐ๊ฒฐ์ด ๋Š์–ด์ ธ๋„ ๊ธฐ์กด ํŒŒํ‹ฐ์…˜ ํ• ๋‹น์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Œ
    • ๊ธฐ๋ณธ Dynamic Group Membership
      • ์ปจ์Šˆ๋จธ๊ฐ€ poll()์„ ํ˜ธ์ถœํ•˜๋ฉด ๊ทธ๋ฃน์— ์ฐธ์—ฌ (Group Coordinator๊ฐ€ ๊ด€๋ฆฌ).
      • ์ปจ์Šˆ๋จธ๊ฐ€ ์„ธ์…˜ ํƒ€์ž„์•„์›ƒ(session.timeout.ms) ๋‚ด์— ์‘๋‹ตํ•˜์ง€ ์•Š์œผ๋ฉด ์ œ๊ฑฐ๋˜๊ณ  ๋ฆฌ๋ฐธ๋Ÿฐ์‹ฑ ๋ฐœ์ƒ.
      • ์ปจ์Šˆ๋จธ๊ฐ€ ๋‹ค์‹œ ์—ฐ๊ฒฐ๋˜๋ฉด ์ƒˆ๋กœ์šด ๋ฉค๋ฒ„๋กœ ๋“ฑ๋ก๋˜๋ฉฐ ๋ฆฌ๋ฐธ๋Ÿฐ์‹ฑ์ด ๋‹ค์‹œ ๋ฐœ์ƒ.
    • Static Group Membership
      • ์ปจ์Šˆ๋จธ๊ฐ€ ๊ทธ๋ฃน์— ์ฐธ์—ฌํ•  ๋•Œ ๊ณ ์œ ํ•œ ๋ฉค๋ฒ„ ID (group.instance.id)๋ฅผ ์„ค์ •.
      • ์ปจ์Šˆ๋จธ๊ฐ€ ์ผ์‹œ์ ์œผ๋กœ ์—ฐ๊ฒฐ์ด ๋Š๊ฒจ๋„ Group Coordinator๊ฐ€ ๊ธฐ์กด ๋ฉค๋ฒ„๋กœ ์œ ์ง€.
      • ๊ฐ™์€ ๋ฉค๋ฒ„ ID๋ฅผ ๊ฐ€์ง„ ์ปจ์Šˆ๋จธ๊ฐ€ ๋‹ค์‹œ ์—ฐ๊ฒฐ๋˜๋ฉด ๊ธฐ์กด ํŒŒํ‹ฐ์…˜ ํ• ๋‹น ์œ ์ง€.
      • ์™„์ „ํžˆ ์ƒˆ๋กœ์šด ์ปจ์Šˆ๋จธ๊ฐ€ ์ถ”๊ฐ€๋˜๊ฑฐ๋‚˜, ๊ธฐ์กด ๋ฉค๋ฒ„ ID๊ฐ€ ์—†๋Š” ์ปจ์Šˆ๋จธ๋งŒ ๋ฆฌ๋ฐธ๋Ÿฐ์‹ฑ ๋ฐœ์ƒ.
  4. Retry

    • ์˜คํ”„์…‹์„ Commitํ•˜์ง€ ์•Š๊ณ  ์žฌ์ฒ˜๋ฆฌ
      • ์ž๋™ ์ปค๋ฐ‹์„ ๋น„ํ™œ์„ฑํ™” (enable.auto.commit=false)
      • ์˜ˆ์™ธ ๋ฐœ์ƒ ์‹œ ์˜คํ”„์…‹์„ Commitํ•˜์ง€ ์•Š์œผ๋ฉด ๊ฐ™์€ ๋ฉ”์‹œ์ง€๋ฅผ ๋‹ค์‹œ ์†Œ๋น„ํ•  ์ˆ˜ ์žˆ์Œ
      • ๋ฌดํ•œ ๋ฃจํ”„ ๋ฐœ์ƒ ๊ฐ€๋Šฅ โ†’ ์‹คํŒจํ•œ ๋ฉ”์‹œ์ง€๋งŒ ๊ณ„์† ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Œ
    • Dead Letter Queue (DLQ) ์‚ฌ์šฉ
      • Kafka์—์„œ ์‹คํŒจํ•œ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณ„๋„์˜ ํ† ํ”ฝ(DLQ)์œผ๋กœ ๋ณด๋‚ด๊ณ , ๋‚˜์ค‘์— ์žฌ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•.
      • ๋ฌดํ•œ ๋ฃจํ”„ ๋ฐฉ์ง€์ฑ…์ด๋‹ค

์นดํ”„์นด ํŠธ๋žœ์žญ์…˜ ๊ธฐ์ดˆ

1๏ธโƒฃ beginTransaction()

  • ํŠธ๋žœ์žญ์…˜์ด ์‹œ์ž‘๋˜๋ฉด ๋ฉ”์‹œ์ง€๋“ค์ด ์ „์†ก๋˜๊ธฐ ์‹œ์ž‘ํ•˜์ง€๋งŒ, ์•„์ง ํŠธ๋žœ์žญ์…˜ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋งˆ์ปค(Commit/Abort) ๋Š” ์ „์†ก๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ํŠธ๋žœ์žญ์…˜์ด "ํ™œ์„ฑํ™”"๋œ ์ƒํƒœ์ผ ๋ฟ, ์ด ์‹œ์ ์—์„œ๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ์ž„์‹œ ์ƒํƒœ๋กœ ํŒŒํ‹ฐ์…˜์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
  • Kafka๋Š” ํŠธ๋žœ์žญ์…˜ ID๋ฅผ ๋ฉ”์‹œ์ง€์™€ ํ•จ๊ป˜ ์ €์žฅํ•˜์—ฌ, ์ดํ›„์— ์ด ๋ฉ”์‹œ์ง€๊ฐ€ ์–ด๋А ํŠธ๋žœ์žญ์…˜์— ์†ํ•˜๋Š”์ง€๋ฅผ ์ถ”์ ํ•ฉ๋‹ˆ๋‹ค. (beginTransaction() ํ˜ธ์ถœ๋งˆ๋‹ค ๊ณ ์œ ํ•œ ํŠธ๋žœ์žญ์…˜ ID๊ฐ€ ์ƒ์„ฑ)

2๏ธโƒฃ ๋ฉ”์‹œ์ง€ ์ „์†ก (send())

  • Producer๊ฐ€ send()๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด, ๋ฉ”์‹œ์ง€๋Š” ๋ธŒ๋กœ์ปค์˜ ํŒŒํ‹ฐ์…˜์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
  • ์ด๋•Œ ์ €์žฅ๋œ ๋ฉ”์‹œ์ง€๋Š” "๋ฏธํ™•์ •(Uncommitted)" ์ƒํƒœ์ž…๋‹ˆ๋‹ค.
  • ์ด ๋ฉ”์‹œ์ง€๋“ค์€ ํŠธ๋žœ์žญ์…˜์— ํฌํ•จ๋˜๋ฉฐ, ์•„์ง ์ปค๋ฐ‹๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฌดํšจํ™”๋  ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ์ž…๋‹ˆ๋‹ค.

3๏ธโƒฃ ํŠธ๋žœ์žญ์…˜ ์ปค๋ฐ‹ (commitTransaction())

  • commitTransaction()์ด ํ˜ธ์ถœ๋˜๋ฉด, Commit Marker๊ฐ€ ํ•ด๋‹น ํŠธ๋žœ์žญ์…˜์˜ ๋ฉ”์‹œ์ง€์™€ ํ•จ๊ป˜ ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค.
  • ์ด ๋งˆ์ปค๋Š” ํŠธ๋žœ์žญ์…˜์ด ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋˜์—ˆ์Œ์„ ๋‚˜ํƒ€๋‚ด๋Š” ํ‘œ์‹œ๋กœ, ์ด์ œ ํ•ด๋‹น ๋ฉ”์‹œ์ง€๋Š” "ํ™•์ •(Committed)" ์ƒํƒœ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค.
    Partition 0: [TxMsg1 (์ปค๋ฐ‹๋จ), TxMsg2 (์ปค๋ฐ‹๋จ), Commit Marker]
    

4๏ธโƒฃ ํŠธ๋žœ์žญ์…˜ ๋กค๋ฐฑ (abortTransaction())

  • abortTransaction()์ด ํ˜ธ์ถœ๋˜๋ฉด, Abort Marker๊ฐ€ ๊ธฐ๋ก๋˜๊ณ  ํ•ด๋‹น ํŠธ๋žœ์žญ์…˜์˜ ๋ฉ”์‹œ์ง€๋“ค์€ ๋ฌดํšจํ™”(Aborted) ๋ฉ๋‹ˆ๋‹ค.
  • ์ด ๋งˆ์ปค๋Š” ํŠธ๋žœ์žญ์…˜์ด ์‹คํŒจํ–ˆ์Œ์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ๋ฉ”์‹œ์ง€๊ฐ€ ๋กค๋ฐฑ๋˜์—ˆ์Œ์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.
    Partition 0: [TxMsg1 (๋ฌดํšจํ™”๋จ), TxMsg2 (๋ฌดํšจํ™”๋จ), Abort Marker]
    

** ์ปจ์Šˆ๋จธ ํŠธ๋žœ์žญ์…˜ **

  • isolation.level=read_committed ์„ค์ •ํ•˜๋ฉด ์ปค๋ฐ‹๋œ ๋ฉ”์‹œ์ง€๋งŒ ์ฝ๊ณ , ๋กค๋ฐฑ๋œ ๋ฉ”์‹œ์ง€๋Š” ๋ฌด์‹œ.
  • isolation.level=read_uncommitted ์„ค์ •ํ•˜๋ฉด ๋ชจ๋“  ๋ฉ”์‹œ์ง€๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋กค๋ฐฑ๋œ ๋ฉ”์‹œ์ง€๋„ ํฌํ•จ๋จ.
  • ๊ฐ™์€ ํŠธ๋žœ์žญ์…˜ ๋‚ด์˜ ๋ฉ”์‹œ์ง€๋„ ์ปจ์Šˆ๋จธ์—์„œ ์ฒ˜๋ฆฌ ์ˆœ์„œ๊ฐ€ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฑธ ๋ฐฉ์ง€ํ•˜๋ ค๋ฉด...
    • ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜ ๋ฉ”์‹œ์ง€๋ฅผ ํ•˜๋‚˜์˜ ํŒŒํ‹ฐ์…˜์œผ๋กœ๋งŒ ๋ณด๋‚ด๊ธฐ
    • ์ปจ์Šˆ๋จธ์—์„œ ๋ฉ”์‹œ์ง€์˜ ํƒ€์ž„์Šคํƒฌํ”„๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ
    • ์ปจ์Šˆ๋จธ ๊ทธ๋ฃน์„ 1๊ฐœ๋งŒ ์‚ฌ์šฉํ•˜์—ฌ ๋‹จ์ผ ๋ฉ”์‹œ์ง€ ํด๋ง ์ปจ์Šˆ๋จธ๋กœ ์ฒ˜๋ฆฌ

Command

  1. topic

    • ํ† ํ”ฝ ์ƒ์„ฑ (ํŒŒํ‹ฐ์…˜ ์„ค์ • ๊ฐ€๋Šฅ, replica ๊ฐฏ์ˆ˜ ์„ค์ • ๊ฐ€๋Šฅ -> ๋‹ค๋งŒ ๋ธŒ๋กœ์ปค๊ฐ€ 1๊ฐœ๋ฉด replica ๊ฐฏ์ˆ˜ ์„ค์ • ๋ถˆ๊ฐ€๋Šฅ)
    • ํ† ํ”ฝ ๋ฆฌ์ŠคํŠธ ๋ณด๊ธฐ
    • ํŠน์ • ํ† ํ”ฝ ์ƒ์„ธ๋ณด๊ธฐ -> ํŒŒํ‹ฐ์…˜๊ณผ ๋ ˆํ”Œ๋ฆฌ์นด ๋“ค์ด ๋‚˜์˜ด, ๋ช‡๋ฒˆ ๋ธŒ๋กœ์ปค์— ์žˆ๋Š”์ง€๋„ ๋‚˜์˜ด
    • ํ† ํ”ฝ ์‚ญ์ œ ๊ฐ€๋Šฅ
  2. producer

    • ๋ฉ”์‹œ์ง€ ๋ณด๋‚ด๊ธฐ (ack ์˜ต์…˜ ์‚ฌ์šฉ๊ฐ€๋Šฅ)
    • ์—†๋Š” ํ† ํ”ฝ์œผ๋กœ ์—ฐ๊ฒฐํ•ด์„œ ๋ฉ”์‹œ์ง€๋ณด๋‚ด๋ฉด ํƒ€์ž„์•„์›ƒ๋‚จ -> ํŠน์ • ์˜ต์…˜์—์„œ๋Š” ๋ฆฌ๋”๊ฐ€ ์—†๋‹ค๋Š” ๊ฒฝ๊ณ ๊ฐ€ ๋‚˜์˜ค๊ณ  ํ† ํ”ฝ์ด ์ž๋™์ƒ์„ฑ๋จ
    • ํŒŒํ‹ฐ์…”๋„ˆ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด roundrobin (prd์—์„œ๋Š” ์“ฐ๋ฉด ์•ˆ๋จ)
  3. Consumer

    • ์ด์ „ ๋ฉ”์‹œ์ง€ ์ „๋ถ€ ํ™•์ธํ•˜๋„๋ก ์„ค์ •ํ•  ์ˆ˜ ๋„ ์žˆ๊ณ  ์•ž์œผ๋กœ ์˜ค๋Š” ๋ฉ”์‹œ์ง€๋“ค๋งŒ ํ™•์ธํ•˜๊ฒŒ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค
    • ๋ฉ”์‹œ์ง€์˜ ํ‚ค, ๋ฒจ๋ฅ˜, ํƒ€์ž„์Šคํƒฌํ”„, ํŒŒํ‹ฐ์…˜ ์ •๋ณด๋ฅผ ๊ฐ™์ด ๋‚˜์˜ค๊ฒŒ consume ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ํ˜„์žฌ ์ปจ์Šˆ๋จธ ๊ทธ๋ฃน์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
    • ์ปจ์Šˆ๋จธ ๊ทธ๋ฃน ์ƒ์„ธ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ํŒŒํ‹ฐ์…˜๋งˆ๋‹ค offset ์ •๋ณด๊ฐ€ ๋‹ค ๋‚˜์˜ด, ์—ฐ๊ฒฐ๋œ ์ปจ์Šˆ๋จธ๋“ค ์ •๋ณด๋„ ๋‚˜์˜ค๊ณ  lag๋„ ๋‚˜์˜ด (๋งˆ์ง€๋ง‰ ๋ฉ”์‹œ์ง€ ์˜คํ”„์…‹ - ๋จน์€ ๋ฉ”์‹œ์ง€ ์˜คํ”„์…‹)
    • ํŠน์ • ์ปจ์Šˆ๋จธ๊ทธ๋ฃน์˜ ์˜คํ”„์…‹์„ ์ดˆ๊ธฐํ™” ํ˜น์€ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค. (--reset-offsets)
  4. ์ž„์‹œ ์‹คํ–‰๊ฒฐ๊ณผ ๋ณด๊ธฐ

    • --reset-offsets ์˜ต์…˜์œผ๋กœ ์‹คํ–‰
    • Kafka Consumer ์˜คํ”„์…‹์„ ์žฌ์„ค์ •ํ•˜๋ ค๋ฉด --reset-offsets์™€ ํ•จ๊ป˜ ์ ์ ˆํ•œ ์˜ต์…˜์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ ์ฝ๊ฑฐ๋‚˜ ๊ฑด๋„ˆ๋›ฐ๋„๋ก ์„ค์ •ํ•˜๋Š” ๋ฐ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋ฏ€๋กœ, ์ ์šฉ ์ „ --dry-run์œผ๋กœ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

Kafka Connect

  1. ์—ญํ• 

    • Kafka์™€ ์™ธ๋ถ€ ์‹œ์Šคํ…œ(๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ํŒŒ์ผ ์‹œ์Šคํ…œ, ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค ๋“ฑ)์„ ์‰ฝ๊ฒŒ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ
    • ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ  ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ์†Œ์Šค๋ฅผ ์—ฐ๋™
    • ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ ๋ฐ ์˜ค๋ฅ˜ ๋ณต๊ตฌ ๊ธฐ๋Šฅ์„ ์ œ๊ณต
    • ์ด๋ฏธ ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์นดํ”„์นด๋กœ ํ™œ์šฉํ•˜๋ ค๊ณ  ํ• ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
  2. ์ปดํฌ๋„ŒํŠธ

    • Source Connector (์†Œ์Šค ์ปค๋„ฅํ„ฐ)
      • ์™ธ๋ถ€ ์‹œ์Šคํ…œ โ†’ Kafka๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์—ญํ• 
      • ์˜ˆ: MySQL, PostgreSQL, MongoDB, S3, HTTP API ๋“ฑ์˜ ๋ฐ์ดํ„ฐ๋ฅผ Kafka๋กœ ์ „์†ก
    • Sink Connector (์‹ฑํฌ ์ปค๋„ฅํ„ฐ)
      • Kafka โ†’ ์™ธ๋ถ€ ์‹œ์Šคํ…œ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๋Š” ์—ญํ• 
      • ์˜ˆ: Kafka ๋ฐ์ดํ„ฐ๋ฅผ MySQL, Elasticsearch, HDFS, S3 ๋“ฑ์— ์ €์žฅ
  3. ์ผ€๋„‰ํŠธ ํด๋Ÿฌ์Šคํ„ฐ

    • ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ปค๋„ฅํ„ฐ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Œ.
    • Worker: Kafka Connect ํ”„๋กœ์„ธ์Šค (Connector ์‹คํ–‰ ๋‹ด๋‹น). Standalone ๋ชจ๋“œ์—์„œ๋Š” 1๊ฐœ์˜ Worker, Distributed ๋ชจ๋“œ์—์„œ๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ Worker๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ๋กœ ๋™์ž‘
    • Connector: ๋ฐ์ดํ„ฐ ์†Œ์Šค โ†” Kafka ์—ฐ๊ฒฐ (Source/Sink)
    • Task: Connector ๋‚ด๋ถ€์—์„œ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋˜๋Š” ์ž‘์—… image
  4. ์‹คํ–‰ (์˜ˆ์‹œ Elasticsearch)

    • Kafka + Zookeeper ์‹คํ–‰ ์ค‘
    • Elasticsearch ์‹คํ–‰ ์ค‘
    • Kafka Connect ์‹คํ–‰ ๊ฐ€๋Šฅ
    • Kafka Connect Elasticsearch ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์น˜ ํ›„ connect์— ๋“ฑ๋ก

Kafka Streams

  1. ์—ญํ• 

    • Kafka Streams๋Š” Kafka ๋‚ด์—์„œ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๊ฒฝ๋Ÿ‰ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (์Šคํ”„๋ง ๋ถ€ํŠธ์—์„œ ์‚ฌ์šฉ๊ฐ€)
    • Kafka ๊ธฐ๋ฐ˜์˜ ๋ถ„์‚ฐ ์ŠคํŠธ๋ฆฌ๋ฐ ์ฒ˜๋ฆฌ: Kafka์—์„œ ์ง€์†์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ , ๊ฐ€๊ณต ๋ฐ ๋ถ„์„ํ•œ ํ›„ ๋‹ค์‹œ Kafka์— ์ €์žฅ ๊ฐ€๋Šฅ
    • ๊ฐ•๋ ฅํ•œ Kafka ํ†ตํ•ฉ: Kafka์˜ Consumer๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ , ์ฒ˜๋ฆฌ ํ›„ Producer์ฒ˜๋Ÿผ Kafka์— ๋ฐ์ดํ„ฐ ์ €์žฅ (Producer ์—ญํ• ์€ ๋‚ด๋ถ€์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋จ)
    • Stateful & Stateless ์ฒ˜๋ฆฌ ์ง€์›: ๋ฐ์ดํ„ฐ๋ฅผ ๋‹จ์ˆœ ๋ณ€ํ™˜ํ•˜๋Š” Stateless ์—ฐ์‚ฐ๋ถ€ํ„ฐ, ์œˆ๋„์šฐ(Windowing) ๊ธฐ๋ฐ˜ ์ง‘๊ณ„ ๋ฐ ์กฐ์ธ(Join) ๋“ฑ Stateful ์—ฐ์‚ฐ ๊ฐ€๋Šฅ
    • Streams API ์ œ๊ณต: map(), filter(), groupBy(), join(), windowing() ๋“ฑ์˜ ๋‹ค์–‘ํ•œ API ์ง€์›
  2. ๋™์ž‘

    • Kafka Streams ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ Kafka Consumer ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, Kafka Topic์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ๊ฐ€๊ณตํ•œ ํ›„ ์ƒˆ๋กœ์šด Kafka Topic์— ์ €์žฅ
    • ๋‚ด๋ถ€์ ์œผ๋กœ State Store(RocksDB)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒํƒœ ์ €์žฅ ๊ฐ€๋Šฅ
    • Exactly-once Processing ์ง€์› โ†’ ๋ฐ์ดํ„ฐ ์ค‘๋ณต ์—†์ด ์•ˆ์ •์ ์ธ ์ŠคํŠธ๋ฆฌ๋ฐ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ
    • Scale-out ๊ฐ€๋Šฅ โ†’ ๋™์ผํ•œ Kafka Streams ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์—ฌ๋Ÿฌ ๊ฐœ ์‹คํ–‰ํ•˜๋ฉด ์ž๋™์œผ๋กœ ํŒŒํ‹ฐ์…˜ ๊ธฐ๋ฐ˜ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ ์ˆ˜ํ–‰
  3. ์˜ˆ์‹œ

    • ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์ง‘๊ณ„: ๋งค์ถœ ๋ฐ์ดํ„ฐ์˜ SUM, COUNT ๋“ฑ์„ ๊ณ„์‚ฐํ•˜์—ฌ Kafka Topic์— ์ €์žฅ
    • ์ด๋ฒคํŠธ ์ŠคํŠธ๋ฆผ ํ•„ํ„ฐ๋ง: ํŠน์ • ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ์ด๋ฒคํŠธ๋งŒ ํ•„ํ„ฐ๋งํ•˜์—ฌ ์ƒˆ๋กœ์šด Topic์— ์ €์žฅ
    • IoT ์„ผ์„œ ๋ฐ์ดํ„ฐ ๋ถ„์„: ์„ผ์„œ์—์„œ ๋“ค์–ด์˜ค๋Š” ๋ฐ์ดํ„ฐ๋ฅผ windowing()์„ ํ™œ์šฉํ•˜์—ฌ 1๋ถ„ ๋‹จ์œ„ ํ‰๊ท  ๊ณ„์‚ฐ
    • ์‚ฌ์šฉ์ž ํ–‰๋™ ๋ถ„์„: ํŠน์ • ์‹œ๊ฐ„ ๋™์•ˆ ๋™์ผํ•œ ์‚ฌ์šฉ์ž์˜ ์ด๋ฒคํŠธ๋ฅผ session windowing์„ ํ™œ์šฉํ•ด ๊ทธ๋ฃนํ™”
    • ๋‹ค์ค‘ ์ŠคํŠธ๋ฆผ ์กฐ์ธ: ์—ฌ๋Ÿฌ Topic์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด join()์„ ํ†ตํ•ด ๊ด€๋ จ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒฐํ•ฉ

Kafka Schema Registry

  1. ์—ญํ• 
    • Kafka ๋ฉ”์‹œ์ง€์˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ(Schema)๋ฅผ ์ค‘์•™์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ์„œ๋น„์Šค (์นดํ”„์นด์™€ ๊ฐ™์ด ์“ฐ๋Š” ๋…๋ฆฝ๋œ ์„œ๋น„์Šค) -> ์ด๊ฒƒ์„ ํ†ตํ•ด์„œ ์นดํ”„์นด๋Š” ๋ฐ์ดํ„ฐ์˜ ํ˜•ํƒœ์— ๋Œ€ํ•ด์„œ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ๋‹ค. (Kafka๋Š” ๋ฐ”์ดํŠธ ๋ฐฐ์—ด(byte[]) ํ˜•ํƒœ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ์ €์žฅํ•˜๋ฏ€๋กœ ๋ฐ์ดํ„ฐ์˜ ๊ตฌ์กฐ(Schema)๋Š” Kafka ์ž์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ Producer/Consumer์˜ ์ฑ…์ž„)
    • Producer์™€ Consumer๊ฐ€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ(Schema)๋ฅผ ๊ณต์œ ํ•˜๋„๋ก ๊ฐ•์ œํ•  ์ˆ˜ ์žˆ์Œ
    • ์ƒˆ๋กœ์šด ํ•„๋“œ ์ถ”๊ฐ€ ๋“ฑ Schema ๋ณ€๊ฒฝ ์‹œ์—๋„ ํ˜ธํ™˜์„ฑ ์œ ์ง€ ๊ฐ€๋Šฅ
    • Producer๊ฐ€ ์ž˜๋ชป๋œ ๋ฐ์ดํ„ฐ ํ˜•์‹์„ ๋ณด๋‚ผ ๊ฒฝ์šฐ, Schema Registry์—์„œ ๊ฑฐ๋ถ€ํ•˜์—ฌ ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ์„ ์œ ์ง€
    • API๋ฅผ ํ†ตํ•ด Schema ๋“ฑ๋ก, ์—…๋ฐ์ดํŠธ, ๋ฒ„์ „ ๊ด€๋ฆฌ ๊ฐ€๋Šฅ

image

  1. ๋™์ž‘

    • Producer๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ Kafka๋กœ ์ „์†ก (Producer๋Š” ํ† ํ”ฝ ์ด๋ฆ„๊ณผ ๊ฐ์ฒด๋งŒ ์„ค์ •ํ•ด์„œ ๋ณด๋‚ผ ๋ฟ)
      • ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๊ธฐ ์ „์— Schema Registry์—์„œ Schema ID ํ™•์ธ
      • ๋ฐ์ดํ„ฐ๋ฅผ Schema์— ๋งž์ถฐ ์ง๋ ฌํ™”(Serialize) ํ›„ Kafka๋กœ ์ „์†ก (schema id๊ฐ€ ์—†์œผ๋ฉด ๋“ฑ๋ก)
    • Schema Registry๊ฐ€ Schema ์ €์žฅ ๋ฐ ๊ด€๋ฆฌ
      • ์ƒˆ๋กœ์šด Schema๊ฐ€ ๋“ฑ๋ก๋˜๋ฉด ๋ฒ„์ „ ๊ด€๋ฆฌ
      • ๊ธฐ์กด Schema์™€ ๋น„๊ตํ•˜์—ฌ ํ˜ธํ™˜์„ฑ ๊ฒ€์‚ฌ
    • Consumer๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ์—ญ์ง๋ ฌํ™”(Deserialize)
      • Kafka์—์„œ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ Schema Registry์—์„œ ๊ฐ€์ ธ์˜จ Schema๋ฅผ ์ด์šฉํ•ด ๋ณ€ํ™˜ (Consumer๋Š” Kafka ๋ฉ”์‹œ์ง€ ์•ˆ์— ํฌํ•จ๋œ Schema ID๋ฅผ ์ฝ๊ณ , ๊ทธ ID์— ํ•ด๋‹นํ•˜๋Š” Schema๋ฅผ Schema Registry์—์„œ ์กฐํšŒํ•ด์„œ ์—ญ์ง๋ ฌํ™”)

        1. ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋‚˜? user ๊ฐ์ฒด ํ•„๋“œ ์ถ”๊ฐ€: ์˜ˆ๋ฅผ ๋“ค์–ด user ๊ฐ์ฒด์— ํ•„๋“œ age๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ด…์‹œ๋‹ค. Schema Registry์—์„œ๋Š” ๊ธฐ์กด ์Šคํ‚ค๋งˆ์™€ ์ƒˆ๋กœ์šด ์Šคํ‚ค๋งˆ์˜ ํ˜ธํ™˜์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ํ˜ธํ™˜์„ฑ ๊ฒ€์‚ฌ์—์„œ ๋ฌธ์ œ๊ฐ€ ์—†์œผ๋ฉด ์ƒˆ๋กœ์šด Schema ID๊ฐ€ ํ• ๋‹น๋˜๊ณ , ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋กœ user ๊ฐ์ฒด๋ฅผ ์ง๋ ฌํ™”/์—ญ์ง๋ ฌํ™”ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. user ๊ฐ์ฒด ํ•„๋“œ ์‚ญ์ œ: ๋งŒ์•ฝ ํ•„๋“œ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๋ณ€๊ฒฝ์„ ํ–ˆ๋‹ค๋ฉด, ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, name ํ•„๋“œ๋ฅผ ์‚ญ์ œํ–ˆ๋‹ค๊ณ  ํ•˜๋ฉด, ๊ธฐ์กด ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์œผ๋ ค๋Š” ์†Œ๋น„์ž๋Š” ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ, ํ˜ธํ™˜์„ฑ ๊ฒ€์‚ฌ์— ์‹คํŒจํ•˜๋ฉด Schema Registry์—์„œ ๋“ฑ๋ก์„ ๊ฑฐ๋ถ€ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  2. ์žฅ์ 

    • Kafka ๋ธŒ๋กœ์ปค์— ๋ถ€ํ•˜๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด
      • Schema๋ฅผ Kafka ๋‚ด๋ถ€์—์„œ ๊ด€๋ฆฌํ•˜๋ฉด ๋ธŒ๋กœ์ปค๊ฐ€ ๋ถ€๋‹ด์„ ๋” ๊ฐ€์ง€๊ฒŒ ๋จ
      • Schema Registry๋ฅผ ๋ถ„๋ฆฌํ•˜๋ฉด Kafka ๋ธŒ๋กœ์ปค์˜ ์„ฑ๋Šฅ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Œ.
    • ๋…๋ฆฝ์ ์ธ Schema ๊ด€๋ฆฌ ๊ฐ€๋Šฅ
      • Kafka ์ด์™ธ์˜ ์‹œ์Šคํ…œ์—์„œ๋„ Schema๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ
      • ์˜ˆ๋ฅผ ๋“ค์–ด, Kafka๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋‚˜ API ์„œ๋น„์Šค์—์„œ๋„ Schema Registry๋ฅผ ํ™œ์šฉ ๊ฐ€๋Šฅ.

Kafka ์ดˆ๊ธฐ์„ค์ •

  1. Partition ์ดˆ๊ธฐ์„ค์ •

    • ํŠน์ • Topic์˜ Partition์„ ์ฆ๊ฐ€์‹œํ‚ค๋ฉด ๊ธฐ์กด์— ํŠน์ • Partition์œผ๋กœ ๊ฐ€๋˜ Key๊ฐ€ ๋‹ค๋ฅธ Partition์œผ๋กœ ๋ถ„์‚ฐ๋  ์ˆ˜ ์žˆ์–ด ์ˆœ์„œ(Ordering) ๋ณด์žฅ์ด ๊นจ์งˆ ์œ„ํ—˜์ด ์žˆ์Œ. Key ordering์„ ์œ ์ง€ํ•˜๋ ค๋ฉด ์ดˆ๊ธฐ Partition ๊ฐœ์ˆ˜๋ฅผ ์ถฉ๋ถ„ํžˆ ๊ณ ๋ คํ•˜๊ณ , ๋ฏธ๋ฆฌ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ๋กœ ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•จ.
    • ์„ค์ • ์˜ˆ์‹œ
      • ๋ธŒ๋กœ์ปค๊ฐ€ 6๊ฐœ์ดํ•˜๋ฉด ๋ธŒ๋กœ์ปค ๊ฐฏ์ˆ˜ * 3
      • ๋ธŒ๋กœ์ปค๊ฐ€ 12๊ฐœ์ด์ƒ์ด๋ฉด ๋ธŒ๋กœ์ปค ๊ฐฏ์ˆ˜ *2
    • ์„ฑ๋Šฅ์— ๋Œ€ํ•œ ๊ฒƒ๋“ค์€ ์ •๋‹ต์ด ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๊ณ  ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด์„œ ์ตœ์ ํ™”ํ•ด์•ผํ•จ. producer์˜ throughtput๊ณผ consumer์˜ ๋ณ‘๋ ฌ์„ฑ์ด ์ค‘์š”ํ•˜๋‹ค.
    • zookeeper๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํด๋Ÿฌ์Šคํ„ฐ๋‚ด์— ์ตœ๋Œ€ 200,000 partition๋งŒ ์„ค์ •๊ฐ€๋Šฅ. ๋˜ํ•œ ๋ธŒ๋กœ์ปค๋‹น ์•ฝ 4000๊ฐœ ์ดํ•˜์˜ partition์„ ์ถ”์ฒœํ•จ.
    • kraft ๋ชจ๋“œ๋ฉด ์ˆ˜๋ฐฑ๋งŒ๊ฐœ์˜ partition ๊ฐ€๋Šฅ
    • ๋งŒ์•ฝ 20๋งŒ๊ฐœ๊ฐ€ ๋„˜๋Š” partiton์„ ์šด์˜ํ•˜์•ผํ•œ๋‹ค๋ฉด, ๊ทธ๋ƒฅ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ํ•˜๋‚˜ ๋” ๋งŒ๋“œ๋Š” ๊ฒƒ๋„ ๋ฐฉ๋ฒ•์ด๋‹ค.
  2. Replica Factor ์ดˆ๊ธฐ์„ค์ •

    • ๋ณดํ†ต ์ตœ์†Œ2, ์ตœ๋Œ€4
    • replica factor๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค๋ฉด kafka์— ๋ถ€ํ•˜๊ฐ€ ์ฆ๊ฐ€ํ•œ๋‹ค. disk space ์™€ latancy
    • ๋‚ด๊ตฌ์„ฑ์„ ์œ„ํ•ด์„œ๋Š” ๋†’ํžˆ๊ณ , ๋” ๋‚˜์€ ์„ฑ๋Šฅ์„ ์œ„ํ•ด์„œ๋Š” ๋‚ฎ์ถ˜๋‹ค. ํ˜น์€ min.insync.replicas ์„ค์ •ํ•œ๋‹ค.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages