λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
  • μž₯원읡 κΈ°μˆ λΈ”λ‘œκ·Έ
πŸ“š μ‹œλ¦¬μ¦ˆ/- ν•™μŠ΅ ν…ŒμŠ€νŠΈλ‘œ λ°°μ›Œλ³΄λŠ” kafka

[ν•™μŠ΅ ν…ŒμŠ€νŠΈλ‘œ λ°°μ›Œλ³΄λŠ” kafka] 2. μΉ΄ν”„μΉ΄ 컨셉 λΉ λ₯΄κ²Œ μ•Œμ•„λ³΄κΈ°

by Wonit 2023. 9. 7.

ν•΄λ‹Ή μ‹œλ¦¬μ¦ˆμ—μ„œ μ œκ³΅ν•˜λŠ” λͺ¨λ“  μ†ŒμŠ€μ½”λ“œλŠ” github repository μ—μ„œ μ œκ³΅λ©λ‹ˆλ‹€. μžμ„Έν•œ μ½”λ“œμ™€ ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λŠ” github repository μ—μ„œ ν™•μΈν•΄μ£Όμ„Έμš”.

 

GitHub - my-research/kafka: apache kafka docs & practical usages(with spring) that i composed

apache kafka docs & practical usages(with spring) that i composed - GitHub - my-research/kafka: apache kafka docs & practical usages(with spring) that i composed

github.com

이번 [ν•™μŠ΅ ν…ŒμŠ€νŠΈλ‘œ λ°°μ›Œλ³΄λŠ” kafka] μ‹œλ¦¬μ¦ˆλŠ” μ•„λž˜ μˆœμ„œλŒ€λ‘œ 챕터가 κ΅¬μ„±λ˜κ³ , μ‹œλ¦¬μ¦ˆ μ™Έλ‘œ kafka κ΄€λ ¨ν•˜μ—¬ λ”μš± λ§Žμ€ ν•™μŠ΅ μ •λ³΄λŠ” kafka 심화 μ„Έμ…˜ μ—μ„œ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

μ‹œλ¦¬μ¦ˆ λͺ©μ°¨

  1. μ‹œλ¦¬μ¦ˆλ₯Ό μ‹œμž‘ν•˜λ©°
  2. kafka λΉ λ₯΄κ²Œ 훑어보고 μ•„λŠ”μ²΄ν•˜κΈ°
  3. kafka 컨셉과 μš©μ–΄ 정리 <-- ν˜„μž¬ κΈ€
  4. ν•™μŠ΅ν…ŒμŠ€νŠΈ μ€€λΉ„ν•˜κΈ°
  5. ν•™μŠ΅ ν…ŒμŠ€νŠΈλ‘œ kafka producer μ•Œμ•„λ³΄κΈ°
  6. ν•™μŠ΅ ν…ŒμŠ€νŠΈλ‘œ kafka consumer μ•Œμ•„λ³΄κΈ°
  7. ν•™μŠ΅ ν…ŒμŠ€νŠΈλ‘œ partitioning μ•Œμ•„λ³΄κΈ°
  8. ν•™μŠ΅ ν…ŒμŠ€νŠΈλ‘œ consumer group κ³Ό rebalancing μ•Œμ•„λ³΄κΈ°

ν•™μŠ΅μ˜ 단계별 μˆœμ„œλ‘œ λͺ©μ°¨κ°€ κ΅¬μ„±λ˜μ–΄μžˆμœΌλ―€λ‘œ μ„ ν–‰λ˜μ–΄μ•Ό ν•˜λŠ” 챕터가 μ‘΄μž¬ν•©λ‹ˆλ‹€


이번 μ±•ν„°μ—μ„œλŠ” kafka μ—μ„œ μ‚¬μš©λ˜λŠ” μš©μ–΄μ— λŒ€ν•΄μ„œ μ•Œμ•„λ³΄λ„λ‘ ν•˜κ² λ‹€

였늘의 λͺ©ν‘œλŠ” μ•žμ„  λͺ©ν‘œμ™€ λ™μΌν•˜κ²Œ 이 κΈ€λ§Œ 보고도 μ–΄λ””κ°€μ„œ 카프카에 λŒ€ν•΄μ„œ μ•„λŠ”μ²΄ ν•  수 μžˆλ„λ‘ ν•˜λŠ” 것이닀.

 

μ΅œλŒ€ν•œ ν•΅μ‹¬λ§Œ μ •ν™•νžˆ κ΅¬μ„±ν•˜λ € λ…Έλ ₯ν•˜μ˜€μœΌλ‹ˆ 짧고 λΉ λ₯΄κ²Œ μ§‘μ€‘ν•΄μ„œ 읽고 μ–΄λ””κ°€μ„œ μ•„λŠ”μ²™ν•˜μž

 

μΉ΄ν”„μΉ΄μ˜ 6κ°€μ§€μ˜ 핡심 μš”μ†Œ

 

μΉ΄ν”„μΉ΄λŠ” λ¬Έμ„œ(Introduction of kafka's terminologyμ—μ„œλ„ μ•Œ 수 μžˆλ“―μ΄ 크게 6κ°€μ§€μ˜ μš©μ–΄λ₯Ό μ‚¬μš©ν•œλ‹€.

 

  1. μΉ΄ν”„μΉ΄μ˜ 핡심 μ„œλ²„, broker
  2. μΉ΄ν”„μΉ΄μ˜ 데이터 μ €μž₯ ν…Œμ΄λΈ”, topic
  3. μΉ΄ν”„μΉ΄μ˜ μ—…μŠ€νŠΈλ¦Ό ν΄λΌμ΄μ–ΈνŠΈ, producer
  4. μΉ΄ν”„μΉ΄μ˜ λ‹€μš΄μŠ€νŠΈλ¦Ό ν΄λΌμ΄μ–ΈνŠΈ, consumer
  5. μΉ΄ν”„μΉ΄μ˜ μ‹€μ§ˆμ μΈ λ©”μ‹œμ§€ 큐, partition
  6. μΉ΄ν”„μΉ΄μ˜ 핡심 μ•ˆμ „μš”μ†Œ, replication

 

μΉ΄ν”„μΉ΄λŠ” μœ„μ˜ 6가지 κ΅¬μ„±μš”μ†Œλ₯Ό 톡해 λ©”μ‹œμ§• 인프라λ₯Ό TCP λ„€νŠΈμ›Œν¬ μœ„μ—μ„œ μ œκ³΅ν•œλ‹€.

 

 

μœ„ 그림은 μ•žμ„  6가지 κ΅¬μ„±μš”μ†Œλ₯Ό ν‘œν˜„ν•œ 그림이닀.

 

μžμ„Ένžˆ μ„€λͺ…ν•˜κΈ° 전에 λ¨Όμ € μš”μ•½ν•΄μ„œ 정리해보겠닀. 정말 λ°”μ˜λ‹€λ©΄!! 이 μš”μ•½λ§Œ 보고 λ„˜μ–΄κ°€λ„ μ’‹λ‹€.

 

μ–΄μ°¨ν”Ό 좔후에 μš°λ¦¬κ°€ ν•™μŠ΅ν…ŒμŠ€νŠΈλ₯Ό μ§„ν–‰ν•˜λ©° 각각의 ν•­λͺ©λ“€μ— λŒ€ν•΄μ„œ 더 μžμ„Ένžˆ 닀루도둝 ν•˜κ³  μ§€κΈˆ μ‹œκ°„μ€ μ˜ˆμ—΄μ―€μœΌλ‘œ μƒκ°ν•˜μž

 

  • broker
    • μΉ΄ν”„μΉ΄ 브둜컀, 핡심 κ΅¬μ„±μš”μ†Œ
    • μΉ΄ν”„μΉ΄λ‘œ λ“€μ–΄μ˜€λŠ” 이벀트 λ°μ΄ν„°μ˜ μŠ€ν† λ¦¬μ§€ μ„œλ²„
    • ν† ν”½, νŒŒν‹°μ…˜, λ³΅μ œλ“±μ„ 관리
  • topic
    • 이벀트의 μΉ΄ν…Œκ³ λ¦¬
    • μ΄λ²€νŠΈκ°€ μ €μž₯λ˜λŠ” λ‹¨μœ„
    • ν”„λ‘œλ“€μ„œμ™€ μ»¨μŠˆλ¨Έκ°€ λ°”λΌλ³΄λŠ” 기본적인 λ‹¨μœ„
  • producer
    • 토픽에 λ©”μ‹œμ§€λ₯Ό 생산
    • νŠΉμ • νŒŒν‹°μ…˜μ—λ„ 생산 κ°€λŠ₯
  • consumer
    • ν† ν”½μ˜ λ©”μ‹œμ§€λ₯Ό μ†ŒλΉ„
    • νŠΉμ • νŒŒν‹°μ…˜μ—λ„ μ†ŒλΉ„ κ°€λŠ₯
  • partition
    • μΉ΄ν”„μΉ΄ 토픽에 μ‘΄μž¬ν•˜λŠ” μ‹€μ œ λ©”μ‹œμ§€ μ €μž₯μ†Œ

 

1. μΉ΄ν”„μΉ΄μ˜ 핡심 μ„œλ²„, broker

Kafka 의 broker λŠ” μ•žμ„œ Message Oriented Middlewareκ³Ό Message Broker의 차이 및 원리 λΌλŠ” κΈ€μ—μ„œ μ–ΈκΈ‰ν–ˆλ˜ message broker 와 λ™μΌν•œ κ°œλ…μœΌλ‘œ message provider λ‹€.

 

μΉ΄ν”„μΉ΄ 브둜컀라고 λΆˆλ¦¬λŠ” μ»΄ν¬λ„ŒνŠΈλŠ” νŠΉμ •ν•œ upstream producer 둜 λΆ€ν„° λ°œμƒν•˜λŠ” 이벀트 μŠ€νŠΈλ¦Όμ„ μ €μž₯ν•˜λŠ” μ„œλ²„μ΄λ‹€.

 

μΉ΄ν”„μΉ΄ λΈŒλ‘œμ»€λŠ” 이벀트λ₯Ό μ €μž₯ν•˜λŠ” μŠ€ν† λ¦¬μ§€ λ ˆμ΄μ–΄ μ„œλ²„μΈλ°, ν•΄λ‹Ή μ‹œλ¦¬μ¦ˆμ˜ μ•žμ„  파트 1. μΉ΄ν”„μΉ΄ 핡심 λΉ λ₯΄κ²Œ 훑어보고 μ•„λŠ”μ²΄ν•˜κΈ° μ΄μ•ΌκΈ°ν–ˆλ˜ log based architecture λ₯Ό μœ„ν•œ μ‹€μ œ 데이터 μŠ€ν† λ¦¬μ§€ 엔진이라고 보면 λœλ‹€.

 

μΉ΄ν”„μΉ΄ λΈŒλ‘œμ»€λŠ” 사싀상 μΉ΄ν”„μΉ΄ μΈν”„λΌμ˜ 핡심이고 심μž₯이라고 ν•  수 μžˆλ‹€.

 

μ•„λž˜μ—μ„œ 이야기할 νŒŒν‹°μ…˜κ³Ό λ¦¬ν”Œλ¦¬μΌ€μ΄μ…˜λ“€μ„ κ΄€λ¦¬ν•˜κΈ°λ„ ν•˜λ©° producer 와 consumer λ‘œλΆ€ν„° λ“€μ–΄μ˜€λŠ” read/write request λ₯Ό μ²˜λ¦¬ν•œλ‹€

 

λ§Žμ€ 일을 ν•˜λŠ”κ²ƒ 처럼 λ³΄μ΄μ§€λ§Œ confluent κ°€ μ œκ³΅ν•˜λŠ” kafka 101 μ΄λΌλŠ” ν•™μŠ΅μš© μ˜μƒμ—μ„œλŠ” kafka broker dont do a lot, They are intentionally kept very simple 라고 ν•œλ‹€.

 

λ²ˆμ™Έλ‘œ, μΉ΄ν”„μΉ΄ ν΄λŸ¬μŠ€ν„°λΌλŠ” μš©μ–΄λ„ 많이 듀어봀을 것이닀

 

이 μΉ΄ν”„μΉ΄ ν΄λŸ¬μŠ€ν„°κ°€ λ°”λ‘œ μ—¬λŸ¬κ°œμ˜ μΉ΄ν”„μΉ΄ λΈŒλ‘œμ»€λ“€μ„ 묢어놓은 κ°œλ…μ΄λ‹€.

 

즉, μš°λ¦¬λŠ” ν΄λŸ¬μŠ€ν„°μ˜ ν•œ λΈŒλ‘œμ»€μ— connection 을 λ§Ίμ–΄ μƒν˜Έμž‘μš©μ„ ν•˜κ²Œ λœλ‹€.

 

μž¬λ―ΈμžˆλŠ” νŠΉμ§•μœΌλ‘œλŠ” μΉ΄ν”„μΉ΄ λΈŒλ‘œμ»€λŠ” bootstrap server λ‘œμ„œ 역할을 μˆ˜ν–‰ν•œλ‹€.

 

bootstrap 은 일반적으둜 initialize λ‹¨κ³„μ—μ„œ μ‚¬μš©λ˜λŠ” μ΄ˆκΈ°ν™” 데이터 ν˜Ήμ€ 싀행을 μœ„ν•œ 초기 μ„€μ • λ‹¨κ³„μ˜ μž‘μ—…μ„ μ΄μ•ΌκΈ°ν•œλ‹€.

 

κ·Έλž˜μ„œ νŠΉμ • λΈŒλ‘œμ»€κ°€ bootstrap server λ₯Ό μˆ˜ν–‰ν•˜μ—¬ λ‹€λ₯Έ λΈŒλ‘œμ»€λ“€κ³Ό μ—°κ²°ν•  수 있고, μ—°κ²°λœ λΈŒλ‘œμ»€λ“€ μžμ²΄κ°€ bootstraping 을 ν•  수 μžˆλ‹€λŠ” 것이닀.

 

confluent.io

 

κ·Έλž˜μ„œ ν΄λŸ¬μŠ€ν„°μ— μ‘΄μž¬ν•˜λŠ” λͺ¨λ“  브둜컀 ν•˜λ‚˜ ν•˜λ‚˜κ°€ λ‹€λ₯Έ ν΄λŸ¬μŠ€ν„°μ˜ λŒ€ν‘œ λΈŒλ‘œμ»€κ°€ 될 수 μžˆλ‹€. (이 νŠΉμ„±μ΄ κ³ κ°€μš©μ„±μ„ μ§€μ›ν•˜λŠ” νŠΉμ„±μ΄ λœλ‹€)

 

κ²°κ΅­ ν΄λΌμ΄μ–ΈνŠΈλŠ” νŠΉμ • λΈŒλ‘œμ»€μ— μ ‘μ†ν•˜μ—¬ ν΄λŸ¬μŠ€ν„° λ‚΄μ˜ 메타데이터 (브둜컀 λͺ©λ‘, ν† ν”½ 정보 λ“±)을 κ°€μ Έμ˜€κ³  이 정보λ₯Ό 기반으둜 λ‹€λ₯Έ λΈŒλ‘œμ»€λ“€κ³Ό μ—°κ²°ν•  수 μžˆλ„λ‘ ν•˜λŠ” 것이닀.

 

2. μΉ΄ν”„μΉ΄μ˜ 데이터 μ €μž₯ ν…Œμ΄λΈ”, topic

 

topic 은 μΉ΄ν…Œκ³ λ¦¬λΌκ³  μƒκ°ν•˜λ©΄ λœλ‹€.

 

kafka 둜 λ“€μ–΄μ˜€λŠ” λͺ¨λ“  μ΄λ²€νŠΈλ“€μ— λŒ€ν•΄μ„œ ν† ν”½μ΄λΌλŠ” λ‹¨μœ„λ‘œ categorizing ν•˜μ—¬ 데이터λ₯Ό storing ν•œλ‹€.

 

μ΄λ²€νŠΈκ°€ μ €μž₯λ˜λŠ” κ°€μž₯ κΈ°λ³Έ ꡬ성 λ‹¨μœ„λΌκ³  ν•  수 있고, 토픽을 νŒŒμΌμ‹œμŠ€ν…œμœΌλ‘œ μ„€λͺ…ν•˜λŠ” 것이 κ°€μž₯ μΌλ°˜μ μ΄λ‹€.

 

토픽이 디렉토리라고 ν•œλ‹€λ©΄ μ΄λ²€νŠΈλ“€μ€ ν•΄λ‹Ή 디렉토리 내뢀에 μ‘΄μž¬ν•˜λŠ” νŒŒμΌλ“€μ΄λΌκ³  μƒκ°ν•˜λ©΄ λœλ‹€

 

.
β”œβ”€β”€ order.ordered <- topic
β”‚   β”œβ”€β”€ event-1
β”‚   β”œβ”€β”€ event-2
β”‚   β”œβ”€β”€ event-3
β”‚   β”œβ”€β”€ event-4
β”œβ”€β”€ member.terminated <- topic
β”‚   β”œβ”€β”€ event-1
β”‚   β”œβ”€β”€ event-2
β”‚   └── event-3

 

토픽은 append only 이며, μƒˆ 이벀트 λ©”μ‹œμ§€κ°€ 토픽에 듀어와 μ €μž₯이 λœλ‹€λ©΄ μ ˆλŒ€ μˆ˜μ •λ  수 μ—†λ‹€.

 

λ‹€λ₯Έ 일반적인 큐 ν˜•μ‹μ˜ λ©”μ‹œμ§• 인프라와 달리 ν† ν”½μ—λŠ” producer 와 consumer κ°€ μ—¬λŸ¬κ°œ 일 수 μžˆλŠ” 것을 κΈ°μ–΅ν•˜μž

 

μ—­μ‹œ kafka 101 μ˜μƒμ—μ„œλŠ” 토픽을 queue κ°€ μ•„λ‹ˆλΌ log of events 라고 ν‘œν˜„ν•œλ‹€. log λΌλŠ” 컨셉이 μžˆκΈ°μ— immutable, append only 그리고 seek by offset 이 μžμ—°μŠ€λŸ¬μš΄ 것이닀.

3. μΉ΄ν”„μΉ΄μ˜ μ—…μŠ€νŠΈλ¦Ό ν΄λΌμ΄μ–ΈνŠΈ, producer

 

producer λŠ” 이벀트λ₯Ό μƒμ‚°ν•˜λŠ” ν΄λΌμ΄μ–ΈνŠΈλ‹€.

 

보톡 upstream ν˜Ήμ€ μƒμ‚°μž ν˜Ήμ€ publisher 라고 ν‘œν˜„ν•˜κΈ°λ„ ν•˜λŠ”λ°, producer κ°€ topic 에 이벀트λ₯Ό μ „μ†‘ν•˜λŠ” 역할을 μˆ˜ν–‰ν•œλ‹€

 

 

ν”„λ‘œλ“€μ„œλŠ” μ›ν•œλ‹€λ©΄ νŠΉμ • topic λ‚΄μ˜ partition 에도 λ©”μ‹œμ§€λ₯Ό λ°œν–‰ν•  수 μžˆλ‹€

 

μžμ„Έν•œ 것은 후에 μžˆμ„ ν”„λ‘œλ“€μ„œ νŒŒνŠΈμ—μ„œ 더 μ΄μ•ΌκΈ°ν•˜λ„λ‘ ν•˜μž

 

4. μΉ΄ν”„μΉ΄μ˜ λ‹€μš΄μŠ€νŠΈλ¦Ό ν΄λΌμ΄μ–ΈνŠΈ, consumer

 

consumer λŠ” μΉ΄ν”„μΉ΄μ—μ„œ 이벀트λ₯Ό μ†ŒλΉ„ν•˜λŠ” ν΄λΌμ΄μ–ΈνŠΈλ‹€.

 

μ—­μ‹œ consumer λ₯Ό downstream, μ†ŒλΉ„μž ν˜Ήμ€ subscriber 라고 ν‘œν˜„ν•œλ‹€.

 

consumer λŠ” νŠΉμ • ν† ν”½μ—μ„œ 이벀트λ₯Ό 읽고 μ–΄λ””κΉŒμ§€ μ½μ—ˆλŠ”μ§€μ— λŒ€ν•œ 정보λ₯Ό μ˜€ν”„μ…‹ μ΄λΌλŠ” λ°μ΄ν„°λ‘œ κ΅¬λΆ„ν•œλ‹€.

 

일반적인 μƒν™©μ—μ„œλŠ” μ˜€ν”„μ…‹μ΄ 순차적으둜 μ¦κ°€ν•˜κ² μ§€λ§Œ, μ˜€ν”„μ…‹μ„ μ»¨μŠˆλ¨Έκ°€ κ²°μ •ν•˜μ—¬ μ–Έμ œλ“  νŠΉμ • μœ„μΉ˜λ‘œλΆ€ν„° 데이터λ₯Ό μ†ŒλΉ„ν•  수 μžˆλ‹€.

 

μžμ„Έν•œ 것은 μ—­μ‹œ 후에 μžˆμ„ 컨슈머 νŒŒνŠΈμ—μ„œ 더 μ΄μ•ΌκΈ°ν•˜λ„λ‘ ν•˜μž

 

5. μΉ΄ν”„μΉ΄μ˜ μ‹€μ§ˆμ μΈ μ €μž₯μ†Œ, partition

 

μ–΄λ– ν•œ μ΄λ²€νŠΈκ°€ μƒμ‚°μžμ— μ˜ν•΄μ„œ publish λœλ‹€λ©΄, μ‹€μ œλ‘œλŠ” 토픽에 μ €μž₯λ˜λŠ”κ²ƒμ΄ μ•„λ‹ˆλΌ 토픽에 μ‘΄μž¬ν•˜λŠ” νŠΉμ • νŒŒν‹°μ…˜μ— μ €μž₯λ˜λŠ” 것이닀.

 

μΉ΄ν”„μΉ΄λŠ” ν•˜λ‚˜μ˜ ν† ν”½ λ‚΄μ—μ„œ μ—¬λŸ¬κ°œμ˜ νŒŒν‹°μ…˜μ„ λ§Œλ“€ 수 μžˆλ„λ‘ ν•˜μ—¬ μ²˜λ¦¬λŸ‰μ„ λŠ˜λ¦°λ‹€.

 

6. μΉ΄ν”„μΉ΄μ˜ 핡심 μ•ˆμ „μš”μ†Œ, replication

 

μ•žμ „μ— μΉ΄ν”„μΉ΄λŠ” high availability 와 scalability λ₯Ό μ§€μ›ν•œλ‹€κ³  ν–ˆλŠ”λ°, κ·Έ 핡심 μš”μ†Œκ°€ λ°”λ‘œ 이 replication 이닀.

 

μΉ΄ν”„μΉ΄μ—μ„œ replication 을 ν™œμ„±ν™”ν•œλ‹€λ©΄ λͺ¨λ“  토픽을 λ³΅μ œν•˜μ—¬ μž₯애에 λŒ€ν•œ 내결함을 갖도둝 ν•œλ‹€.

 

μ‹€μ œλ‘œ 데이터가 μΉ΄ν”„μΉ΄ 브둜컀둜 듀어왔을 λ•Œ μ–΄λŠ ν•œ 토픽에 데이터가 μŒ“μΈλ‹€λ©΄ replication 에 μ˜ν•΄μ„œ 볡제본 토픽에 같이 μŒ“μ΄κ²Œ λœλ‹€.

 

λŒ“κΈ€