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

[ν•™μŠ΅ ν…ŒμŠ€νŠΈλ‘œ λ°°μ›Œλ³΄λŠ” kafka] 1. μΉ΄ν”„μΉ΄ 핡심 λΉ λ₯΄κ²Œ 훑어보고 μ•„λŠ”μ²΄ν•˜κΈ°

by Wonit 2023. 8. 16.

ν•΄λ‹Ή μ‹œλ¦¬μ¦ˆμ—μ„œ μ œκ³΅ν•˜λŠ” λͺ¨λ“  μ†ŒμŠ€μ½”λ“œλŠ” 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 κ°€ μ™œ ν•„μš”ν• κΉŒ?

 

μΉ΄ν”„μΉ΄κ°€ 무엇인지 ChatGPT μ—κ²Œ 물어보면 λ‹€μŒκ³Ό 같은 말을 ν•œλ‹€

 

 

이 말은 당신이 μΉ΄ν”„μΉ΄λ₯Ό 배우기 μœ„ν•΄μ„œ 이 글을 μ°Ύμ•„ λ“€μ–΄μ˜€κΈ° μ „λΆ€ν„° 읡히 듀어왔을 말이닀.

 

μ‹€μ‹œκ°„ 데이터 슀트리밍 처리 라고 ν‘œν˜„ν•˜λŠ”λ°, 일반적으둜 일괄 μž‘μ—…μ„ μ§€μ›ν•˜λŠ” 배치 μ²˜λ¦¬μ™€ λ°˜λŒ€λ˜λŠ” κ°œλ…μ΄λ‹€.

 

ν˜„λŒ€ μ•„ν‚€ν…μ²˜μ˜ 흐름상 단일 μ„œλ²„ μžμ›λ§ŒμœΌλ‘œ λ³΅μž‘ν•΄μ§„ μ„œλΉ„μŠ€λ₯Ό μ§€νƒ±ν•˜κΈ° μ–΄λ ΅λ‹€.

 

κ·Έλž˜μ„œ 일반적으둜 μ—¬λŸ¬ μžμ›(μ„œλ²„, μ»΄ν“¨νŒ… 엔진)을 λΆ„μ‚°μ‹œμΌœ 각각을 κ³ λ„ν™”ν•˜λŠ” 방식 일λͺ… λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€ μ•„ν‚€ν…μ²˜λ₯Ό μ μš©ν•˜λŠ” 곳이 λ§Žμ•„μ‘Œκ³  성곡 사둀가 λ§Žμ•„μ‘Œλ‹€.

 

λΆ„μ‚°λœ μ„œλ²„κ°„μ— λ°œμƒν•˜λŠ” μ΄λ²€νŠΈλ‚˜ 둜그 데이터, 일λͺ… 슀트리밍 데이터라고 λΆˆλ¦¬λŠ” 것듀을 μ‹€μ‹œκ°„μœΌλ‘œ μ²˜λ¦¬ν•΄μ•Όν•˜λŠ” μš”κ΅¬μ‚¬ν•­μ΄ 점점 λŠ˜μ–΄λ‚˜κ²Œ λ˜μ—ˆλŠ”λ°, 이에 λ°˜ν•΄ 기쑴의 μ•„ν‚€ν…μ²˜μ—μ„œλŠ” 이런 μ‹€μ‹œκ°„ 슀트리밍 데이터에 λŒ€ν•œ μ²˜λ¦¬κ°€ 쉽지 μ•Šμ•˜λ‹€.

 

confluent.io - λ³΅μž‘ν•œ ν˜„λŒ€μ˜ μ›Ή μ•„ν‚€ν…μ²˜

 

μœ„μ˜ 그림은 λ³΅μž‘ν•œ ν˜„λŒ€ μ›Ή μ•„ν‚€ν…μ²˜λ₯Ό 잘 보여쀀닀.

 

μœ„ κ·Έλ¦Όμ—μ„œλ„ μ•Œ 수 μžˆλ“― ν•˜λ‚˜μ˜ μ•±/μ„œλΉ„μŠ€μ—μ„œ λ°œμƒν•œ 데이터듀이 (일λͺ… 슀트리밍 데이터) μ‹œμŠ€ν…œ μ „λ°˜μ— κ±Έμ³μ„œ μ‚¬μš©λ˜λŠ”κ²ƒμ„ λ³Ό 수 μžˆλ‹€.

 

이런 λ³΅μž‘ν•œ μ•„ν‚€ν…μ³μ—μ„œ λ§Žμ€ μ‚¬λžŒλ“€μ€ λ‹€μŒ 3가지에 ν”Όλ‘œλ₯Ό λŠκΌˆλ‹€

 

  • κ±°μ§“λœ 데이터
  • μ‹€μ‹œκ°„ νŠΈλžœμž­μ…˜μ— μ˜ν•œ μ„±λŠ₯ μ €ν•˜
  • μ€€μˆ˜ν•˜μ§€ λͺ»ν•œ λ©”μ‹œμ§• μ‹œμŠ€ν…œμ˜ μ„±λŠ₯

 

ν”Όλ‘œκ° 1. κ±°μ§“λœ 데이터

 

μœ„μ˜ λ³΅μž‘ν•œ μ•„ν‚€ν…μ²˜λ₯Ό 잘 보면 user side μ—μ„œ λ°œμƒν•œ 데이터가 μ—¬λŸ¬ μ‹œμŠ€ν…œ μ»΄ν¬λ„ŒνŠΈλ₯Ό κ±°μ³μ„œ μž¬κ°€κ³΅λ˜λŠ” 것을 λ³Ό 수 μžˆλ‹€.

 

 

μ΄λŸ¬ν•œ μƒν™©μ—μ„œ λ©”μ‹œμ§€ μžμ²΄κ°€ 점점 본래의 의미λ₯Ό μžƒκ²Œλ˜κ³  μ‹œμŠ€ν…œ 이곳 μ €κ³³μ—μ„œ μ„œλ‘œ λ‹€λ₯Έ μ •λ³΄λ‘œμ„œ μ‚¬μš©λ˜λŠ” 것이닀.

 

μ‹œκ°„μ˜ 흐름에 따라 λͺ‡λͺ‡μ€ λ°μ΄ν„°μ˜ λ³Έμ—°μ˜ 의미λ₯Ό λ³΄μ‘΄ν•˜κ³  증λͺ…ν•˜λŠ” 무언가가 ν•„μš”ν•˜λ‹€κ³  μ£Όμž₯ν–ˆλ‹€

 

μš°λ¦¬λŠ” 이λ₯Ό Single Source of Truth, 단일 진싀 곡급원 이라고 λΆ€λ₯΄λŠ”데, κ²°κ΅­ λ‹¨μΌμ§„μ‹€κ³΅κΈ‰μ›μ˜ 역할을 μˆ˜ν–‰ν•  λˆ„κ΅°κ°€κ°€ ν•„μš”ν–ˆλ‹€.

 

ν”Όλ‘œκ° 2. μ‹€μ‹œκ°„ νŠΈλžœμž­μ…˜μ— μ˜ν•œ μ„±λŠ₯ μ €ν•˜

 

μ˜μ†ν™” κ³Όμ •μ—μ„œ μ—…λ°μ΄νŠΈ 연산을 μ•ˆμ „ν•˜κ²Œ μˆ˜ν–‰ν•˜κΈ° μœ„ν•΄μ„œ 일반적으둜 hold and wait 방식을 μ‚¬μš©ν•œλ‹€.

 

https://www.geeksforgeeks.org/deadlock-in-dbms/

 

λŒ€λΆ€λΆ„μ˜ λ³΅μž‘ν•œ λΉ„μ¦ˆλ‹ˆμŠ€ 상황은 νŠΉμ • 데이터에 λŒ€ν•œ μ μœ μ™€ κ·Έ 데이터λ₯Ό μ›ν•˜λŠ” λ‹€λ₯Έ κ²½μŸμžλ“€μ˜ λŒ€κΈ°λ‘œ μ•ˆμ „μ„±μ„ 보μž₯ν•œλ‹€.

 

이 κ³Όμ •μ—μ„œ λŒ€κΈ°μ‹œκ°„μ΄ λŠ˜μ–΄λ‚˜κ²Œ 되며 그에 λŒ€ν•œ μ—¬νŒŒλ‘œ μ„œλΉ„μŠ€ 응닡 μ‹œκ°„μ˜ μ €ν•˜κ°€ λ°œμƒν•˜μ—¬ μ‚¬μš©μžμ—κ²Œ λΆˆνŽΈν•œ κ²½ν—˜μ„ μ œκ³΅ν•˜κ²Œ λ˜μ—ˆλ‹€.

 

μ΄λŸ¬ν•œ 상황은 μ‹€μ‹œκ°„ νŠΈλžœμž­μ…˜ (OLTP, OnLine Transaction Process) 이 λ™κΈ°μ μœΌλ‘œ λ°œμƒν•˜κΈ° λ•Œλ¬Έμ— λ¬Έμ œκ°€ λ˜λŠ” 것이닀.

 

문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄μ„œλŠ” 동기 λ°©μ‹μ˜ νŠΈλžœμž­μ…˜μ„ μ—†μ• κ³  비동기 λ°©μ‹μ˜ 처리 ν”„λ‘œμ„ΈμŠ€λ₯Ό μ§€μ›ν•˜κΈ° μœ„ν•΄μ„œ λ©”μ‹œμ§• 인프라가 ν•„μš”ν•˜κ²Œ λ˜μ—ˆλ‹€.

 

ν”Όλ‘œκ° 3. μ€€μˆ˜ν•˜μ§€ λͺ»ν•œ λ©”μ‹œμ§• μ‹œμŠ€ν…œμ˜ μ„±λŠ₯

 

λ©”μ‹œμ§• μΈν”„λΌλŠ” μ•žμ„  동기 λ°©μ‹μ˜ νŠΈλžœμž­μ…˜ μ €ν•˜λ₯Ό νšŒν”Όν•  수 μžˆλŠ” 쒋은 κΈ°μˆ μ΄λ‹€.

 

messaging pub/sub infra - aws

 

μ΄λŸ¬ν•œ λ©”μ‹œμ§• μΈν”„λΌλŠ” 데이터 μƒν˜Έμž‘μš©μ„ μœ„ν•œ μ»΄ν¬λ„ŒνŠΈκ°€ 직접 연결을 ν•˜λŠ”κ²ƒμ΄ μ•„λ‹ˆλΌ 쀑간에 μœ„μΉ˜ν•œ message exchange κ°€ μ‹€μ œ λ©”μ‹œμ§€λ₯Ό κ΅ν™˜ν•΄μ£ΌλŠ” 역할을 μˆ˜ν–‰ν–ˆλ‹€.

 

λ©”μ‹œμ§• μ‹œμŠ€ν…œ λ‚΄λΆ€μ˜ exchanger 듀은 μ‹œμŠ€ν…œ λ‚΄μ—μ„œ ν†΅μ‹ μ΄λΌλŠ” μ€‘μš”ν•œ 역할을 μˆ˜ν–‰ν•˜κΈ° λ•Œλ¬Έμ— 신뒰성에 μ§‘μ€‘ν•˜μ—¬ μ„€κ³„λ˜μ—ˆλ‹€.

 

κ²°κ΅­ 신뒰성에 μ§‘μ€‘ν•˜λ‹€λ³΄λ‹ˆ μ„±λŠ₯에 λŒ€ν•΄μ„œλŠ” 큰 관심사가 μ•„λ‹ˆμ—ˆλŠ”λ°, λ©”μ‹œμ§€ 인프라에 λŒ€ν•œ μ±…μž„μ΄ 컀지며 λΆ€ν•˜κ°€ λ§Žμ•„μ Έ κ²°κ΅­ 쒋지 μ•Šμ€ μ‚¬μš© κ²½ν—˜μ„ μ‚¬μš©μžμ—κ²Œ μ œκ³΅ν•˜μ˜€λ‹€.

 

이 μƒν™©μ—μ„œ λ“±μž₯ν•œ μΉ΄ν”„μΉ΄

 

λ³΅μž‘ν•΄μ§„ ν˜„λŒ€ μ›Ή μ•„ν‚€ν…μ²˜λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ linkedin μ—μ„œλŠ” Jay Kreps 와 μ—¬λŸ¬ μ—”μ§€λ‹ˆμ–΄λ“€μ„ ν•„λ‘λ‘œ μ‚¬λ‚΄μ—μ„œ μ‚¬μš©ν•  쀑앙 μ§‘μ€‘ν˜• λ©”μ‹œμ§• 인프라인 kafka λ₯Ό κ°œλ°œν•˜μ˜€λ‹€.

 

그리고 μ•žμ„œ λ§ν•œ 3κ°€μ§€μ˜ 문제λ₯Ό λ©‹μ§€κ²Œ ν•΄κ²°ν•˜λ©° linkedin 의 핡심 infrastructure 둜 자리작게 λ˜μ—ˆκ³  μ•žμ„  μ•„ν‚€ν…μ²˜λ₯Ό λ‹€μŒκ³Ό 같은 ν˜•νƒœλ‘œ κ°„μ†Œν™”ν•˜κ²Œ λ˜μ—ˆλ‹€κ³  ν•œλ‹€

 

confluent.io - linkedin with kafka

 

μΉ΄ν”„μΉ΄κ°€ λ‹€λ₯Έ λ©”μ‹œμ§• 인프라와 차별점을 가지며 ν˜„μ‘΄ν•˜λŠ” μ΅œκ°•μ˜ 데이터 ν”Œλž«νΌ μΈν”„λΌλ‘œ μžλ¦¬μž‘μ•˜λ‹€.

 

κ·Έ νŠΉμ„±μ„ ν•œ 번 μ‚΄νŽ΄λ³΄μž.

 

log based architecture

 

μΉ΄ν”„μΉ΄λ₯Ό μ„€λͺ…ν•˜κΈ° μœ„ν•΄ κ°€μž₯ μ ν•©ν•œ λ‹¨μ–΄λŠ” 둜그 μ‹œμŠ€ν…œμ΄λ‹€.

 

λ‘œκ·ΈλŠ” append only 와 seeking by offset μ΄λΌλŠ” νŠΉμ„±μ΄ μžˆλŠ”λ°, μΉ΄ν”„μΉ΄ μ—­μ‹œ 이벀트 λ©”μ‹œμ§€λ“€μ„ 둜그둜 μ·¨κΈ‰ν•œλ‹€.

 

μΉ΄ν”„μΉ΄λŠ” 둜그 지ν–₯ μ‹œμŠ€ν…œμ΄κΈ° λ•Œλ¬Έμ— νŠΉμ • μ‹œμ μ— λ°œμƒν•œ 둜그λ₯Ό λ³€κ²½ν•˜κ±°λ‚˜ 쀑간 μ‚½μž…μ„ μ§€μ›ν•˜μ§€ μ•ŠλŠ”λ‹€.

 

 

μΉ΄ν”„μΉ΄λŠ” νœ˜λ°œμ„± λ©”λͺ¨λ¦¬μ—λ§Œ μž„μ‹œλ‘œ μ €μž₯ν•˜μ—¬ νŠΉμ • ν΄λΌμ΄μ–ΈνŠΈκ°€ μ†ŒλΉ„ν•˜κ²Œλ˜λ©΄ 사라지도둝 μ„€κ³„λœ λ‹€λ₯Έ λ©”μ‹œμ§• 인프라와 λ‹€λ₯΄κ²Œ, λ©”μ‹œμ§€λ₯Ό μ „λΆ€ μ €μž₯ν•œλ‹€

 

λ©”μ‹œμ§€λ₯Ό μ „λΆ€ μ €μž₯ν•˜λŠ” νŠΉμ„±λ•μ— μΆ”ν›„ 컨슈머 νŒŒνŠΈμ—μ„œ μ΄μ•ΌκΈ°ν•˜κ² μ§€λ§Œ μΉ΄ν”„μΉ΄λ₯Ό μ‚¬μš©ν•œλ‹€λ©΄ λ©”μ‹œμ§€λ₯Ό μ–Έμ œλ“ μ§€ λ‹€μ‹œ, μ–΄λŠ μ‹œμ μ΄λ“  μ½μ–΄μ˜¬ 수 μžˆλ‹€.

 

high availability & high scalability

 

μΉ΄ν”„μΉ΄λŠ” 일반적으둜 zookeeper λΌλŠ” λΆ„μ‚° 코디넀이터와 ν•¨κ»˜ λ™μž‘ν•œλ‹€.

 

λΆ„μ‚°λ˜μ–΄μžˆλŠ” μΉ΄ν”„μΉ΄ μΈμŠ€ν„΄μŠ€λ“€μ„ ν΄λŸ¬μŠ€ν„°λ§ν•˜λŠ” 것을 기쑰둜 ν•˜κΈ° λ•Œλ¬Έμ— 이 νŠΉμ„±μ„ ν™œμš©ν•˜μ—¬ zero downtime 을 μ§€μ›ν•˜λŠ” scaling 이 κ°€λŠ₯ν•˜λ‹€.

 

λ˜ν•œ μΉ΄ν”„μΉ΄λŠ” ν˜„λŒ€μ˜ λ‹€λ₯Έ λ©”μ‹œμ§• μΈν”„λΌμ˜ μž₯점듀과 λ§ˆμ°¬κ°€μ§€λ‘œ producer 와 consumer κ°€ λͺ…ν™•νžˆ λΆ„λ¦¬λ˜μ–΄μžˆλ‹€.

 

κ²°κ΅­ κ³Όκ±° messaging infra μ—μ„œ λ³Ό 수 μžˆλŠ” κ³Όμ€‘ν•œ 일을 μ²˜λ¦¬ν•˜λŠ” exchanger 보닀 λΉ λ₯Έ μ„±λŠ₯을 μ œκ³΅ν•œλ‹€.

 

Refs

λŒ“κΈ€