Skip to content

Commit

Permalink
add: πŸ“° [Chapter 08] β€˜μ •ν™•νžˆ ν•œ λ²ˆβ€™ 의미 ꡬ쑰
Browse files Browse the repository at this point in the history
  • Loading branch information
Shinminjin committed Jan 12, 2025
1 parent 1a9c6e9 commit 79d6aa1
Showing 1 changed file with 138 additions and 0 deletions.
138 changes: 138 additions & 0 deletions _posts/kafka/2025-01-12-chapter08.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,138 @@
---
title: Chapter 08. β€˜μ •ν™•νžˆ ν•œ λ²ˆβ€™ 의미 ꡬ쑰
date: 2025-01-12 10:10:00 +0900
categories: [μΉ΄ν”„μΉ΄ ν•΅μ‹¬κ°€μ΄λ“œ]
tags: [μΉ΄ν”„μΉ΄ ν•΅μ‹¬κ°€μ΄λ“œ]
---

## **8.1 멱등적 ν”„λ‘œλ“€μ„œ ✨**

### **8.1.1 멱등적 ν”„λ‘œλ“€μ„œλž€ πŸ€”**
- 멱등성은 λ™μΌν•œ μž‘μ—…μ„ **μ—¬λŸ¬ 번 싀행해도 κ²°κ³Όκ°€ λ™μΌν•œ μž‘μ—…**을 의미
- λ°μ΄ν„°λ² μ΄μŠ€ μ˜ˆμ‹œ

```sql
-- 멱등적이지 μ•ŠμŒ (μ‹€ν–‰ν•  λ•Œλ§ˆλ‹€ κ²°κ³Όκ°€ 달라짐)
UPDATE t SET x = x + 1 WHERE y = 5;

-- λ©±λ“±μ μž„ (μ—¬λŸ¬ 번 싀행해도 κ²°κ³Όκ°€ κ°™μŒ)
UPDATE t SET x = 18 WHERE y = 5;
```

- μΉ΄ν”„μΉ΄μ—μ„œ λ©”μ‹œμ§€ 전솑 μ‹œ λ„€νŠΈμ›Œν¬ μ§€μ—°μ΄λ‚˜ μž₯μ• λ‘œ 인해 쀑볡 λ©”μ‹œμ§€ λ°œμƒ κ°€λŠ₯
- νŒŒν‹°μ…˜ 리더 μž₯μ•  λ°œμƒ 이후, μƒˆλ‘œμš΄ λ¦¬λ”λ‘œ ꡐ체되면 쀑볡 λ©”μ‹œμ§€κ°€ μ €μž₯될 κ°€λŠ₯μ„± 쑴재


### **8.1.2 멱등적 ν”„λ‘œλ“€μ„œμ˜ μž‘λ™ 원리 βš™οΈ**

- λ©”μ‹œμ§€μ— **ν”„λ‘œλ“€μ„œ ID(PID)**와 **μ‹œν€€μŠ€ λ„˜λ²„**λ₯Ό μΆ”κ°€ν•΄ λ©”μ‹œμ§€ κ³ μœ μ„± 식별
- λΈŒλ‘œμ»€λŠ” 각 νŒŒν‹°μ…˜μ—μ„œ λ§ˆμ§€λ§‰ 5개의 λ©”μ‹œμ§€λ₯Ό 좔적해 쀑볡 λ©”μ‹œμ§€ 차단
- μ˜ˆμƒλ³΄λ‹€ 높은 μ‹œν€€μŠ€ λ„˜λ²„κ°€ μˆ˜μ‹ λ˜λ©΄ `out of order sequence number` μ—λŸ¬ λ°œμƒ


### **8.1.3 μž₯μ•  λ°œμƒ μ‹œ 처리 방법 🚨**

1. **ν”„λ‘œλ“€μ„œ μž¬μ‹œμž‘**
- μž₯μ•  ν›„ μƒˆλ‘œμš΄ ν”„λ‘œλ“€μ„œ 생성 μ‹œ, μƒˆλ‘œμš΄ PIDλ₯Ό ν• λ‹Ήλ°›μ•„ κΈ°μ‘΄ λ©”μ‹œμ§€ 쀑볡 감지 λΆˆκ°€
2. **브둜컀 μž₯μ•  볡ꡬ**
- 리더 λ³€κ²½ μ‹œ μƒˆλ‘œμš΄ 리더가 이전 λ¦¬λ”μ˜ μ‹œν€€μŠ€ μƒνƒœλ₯Ό 이어받아 쀑볡 λ©”μ‹œμ§€ 방지
- μ’…λ£Œ μ „ μƒνƒœλ₯Ό μŠ€λƒ…μƒ·μœΌλ‘œ μ €μž₯ν•΄ 볡ꡬ μ‹œ ν™œμš©


### **8.1.4 멱등적 ν”„λ‘œλ“€μ„œ μ‚¬μš©λ²• πŸ“‹**

- `enable.idempotence=true`λ₯Ό μ„€μ •ν•΄ ν™œμ„±ν™”
- `acks=all`κ³Ό ν•¨κ»˜ μ‚¬μš© μ‹œ μ„±λŠ₯ μ €ν•˜ μ—†μŒ
- λ©”μ‹œμ§€ μˆœμ„œλ₯Ό μœ μ§€ν•˜λ©° 쀑볡 λ©”μ‹œμ§€λ₯Ό 차단


### **8.1.5 멱등적 ν”„λ‘œλ“€μ„œμ˜ ν•œκ³„ ⚠️**

- λ‚΄λΆ€ μž¬μ‹œλ„λ‘œ λ°œμƒν•œ μ€‘λ³΅λ§Œ 방지
- μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ 동일 λ©”μ‹œμ§€λ₯Ό `producer.send()` 둜 μ—¬λŸ¬ 번 ν˜ΈμΆœν•˜λ©΄ 쀑볡 λ°œμƒ κ°€λŠ₯
- 닀쀑 ν”„λ‘œλ“€μ„œ ν™˜κ²½μ—μ„œ 쀑볡 κ°€λŠ₯μ„±
- μ—¬λŸ¬ ν”„λ‘œλ“€μ„œκ°€ 동일 데이터λ₯Ό μ²˜λ¦¬ν•˜λ©΄ 쀑볡 λ©”μ‹œμ§€κ°€ λ°œμƒν•  수 있음


## **8.2 νŠΈλžœμž­μ…˜ πŸ”„**

### **8.2.1 νŠΈλžœμž­μ…˜ λ„μž… λ°°κ²½ πŸ—οΈ**

- μΉ΄ν”„μΉ΄μ˜ 슀트림 처리 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ **μ •ν™•νžˆ ν•œ 번 처리**λ₯Ό 보μž₯ν•˜κΈ° μœ„ν•΄ λ„μž…
- μž…λ ₯ λ ˆμ½”λ“œμ™€ μ²˜λ¦¬ν•œ κ²°κ³Όλ₯Ό 좜λ ₯ν•˜λ©°, 집계 및 쑰인 μž‘μ—…μ—μ„œ λ°μ΄ν„°μ˜ μ •ν™•μ„± 보μž₯


### **8.2.2 νŠΈλžœμž­μ…˜μ˜ μ£Όμš” κΈ°λŠ₯ πŸ’‘**

- λ©”μ‹œμ§€ μ²˜λ¦¬μ™€ μ˜€ν”„μ…‹ 컀밋을 μ›μžμ μœΌλ‘œ μˆ˜ν–‰
- νŠΈλžœμž­μ…˜ μ‹€νŒ¨ μ‹œ λ©”μ‹œμ§€ 좜λ ₯κ³Ό μ˜€ν”„μ…‹ 컀밋을 λͺ¨λ‘ 쀑단
- 동일 `transactional.id`λ₯Ό 가진 μ’€λΉ„ μΈμŠ€ν„΄μŠ€λ₯Ό 차단해 λ©”μ‹œμ§€ 쀑볡 방지


### **8.2.3 νŠΈλžœμž­μ…˜μ΄ ν•΄κ²°ν•˜λŠ” 문제 βœ…**

1. **μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μž₯μ• λ‘œ μΈν•œ 쀑볡 처리 방지**
- λ©”μ‹œμ§€ 좜λ ₯ ν›„ μ˜€ν”„μ…‹ 컀밋 전에 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μž₯μ•  λ°œμƒ μ‹œ 쀑볡 처리 방지
2. **μ’€λΉ„ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 문제 ν•΄κ²°**
- ν•˜νŠΈλΉ„νŠΈλ₯Ό μžƒμ€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μž¬ν™œμ„±ν™”λ˜μ–΄ 동일 λ©”μ‹œμ§€ 처리 μ‹œλ„λ₯Ό 차단


### **8.2.4 νŠΈλžœμž­μ…˜μœΌλ‘œ ν•΄κ²°ν•  수 μ—†λŠ” 문제 ❌**

- μ™ΈλΆ€ μ‹œμŠ€ν…œκ³Όμ˜ μž‘μ—…μ€ νŠΈλžœμž­μ…˜μœΌλ‘œ 처리 λΆˆκ°€ (ex. 이메일 λ°œμ†‘, API 호좜)
- μΉ΄ν”„μΉ΄ λ©”μ‹œμ§€λ₯Ό λ°μ΄ν„°λ² μ΄μŠ€μ— μ €μž₯ν•˜λŠ” μž‘μ—…μ€ 보μž₯ λΆˆκ°€
- ν΄λŸ¬μŠ€ν„° κ°„ 데이터 λ³΅μ œμ—μ„œ μ •ν™•νžˆ ν•œ 번 μ²˜λ¦¬λŠ” 보μž₯λ˜μ§€ μ•ŠμŒ


### **8.2.5 νŠΈλžœμž­μ…˜ μ‚¬μš©λ²• πŸ› οΈ**

1. **νŠΈλžœμž­μ…˜ ν™œμ„±ν™”**
- `enable.idempotence=true` μ„€μ • ν•„μˆ˜
- νŠΈλžœμž­μ…˜ ID(`transactional.id`) 지정 ν•„μš”
2. **μ½”λ“œ μ‚¬μš© 흐름**
- `beginTransaction()`: νŠΈλžœμž­μ…˜ μ‹œμž‘
- `sendOffsetsToTransaction()`: μ†ŒλΉ„ν•œ μ˜€ν”„μ…‹μ„ νŠΈλžœμž­μ…˜μ— 포함
- `commitTransaction()`: λ©”μ‹œμ§€μ™€ μ˜€ν”„μ…‹ ν™•μ •
- `abortTransaction()`: λ©”μ‹œμ§€μ™€ μ˜€ν”„μ…‹ λ‘€λ°±
3. **μ£Όμš” νŠΉμ§•**
- ν”„λ‘œλ“€μ„œ μ‹€νŒ¨ μ‹œ, νŠΈλžœμž­μ…˜ 볡ꡬ κ°€λŠ₯
- 컨슈머 그룹의 μ •ν™•νžˆ ν•œ 번 처리(`exactly-once semantics`) 보μž₯
- 단일 νŠΈλžœμž­μ…˜ λ‚΄μ—μ„œ λ™μΌν•œ Topic-Partition에 λŒ€ν•œ λ©”μ‹œμ§€ μˆœμ„œ 보μž₯
4. **μ£Όμ˜μ‚¬ν•­**
- νŠΈλžœμž­μ…˜ 처리 μ‹œκ°„ μ œν•œμ΄ 있으며 초과 μ‹œ 였λ₯˜ λ°œμƒ


### **8.2.6 νŠΈλžœμž­μ…˜ ID와 νŽœμ‹± πŸ†”**

- **νŠΈλžœμž­μ…˜ ID**
- ν”„λ‘œλ“€μ„œ μΈμŠ€ν„΄μŠ€λ§ˆλ‹€ κ³ μœ ν•˜κ²Œ μ„€μ •
- νŠΈλžœμž­μ…˜ μƒνƒœμ™€ Epoch 번호둜 μΈμŠ€ν„΄μŠ€ 좩돌 방지
- λ™μΌν•œ νŠΈλžœμž­μ…˜ IDλ₯Ό 가진 이전 μΈμŠ€ν„΄μŠ€(μ’€λΉ„ ν”„λ‘œλ“€μ„œ)λŠ” 차단됨
- **νŽœμ‹±(Fencing)**
- Epoch 번호λ₯Ό μ¦κ°€μ‹œμΌœ 이전 μ„Έμ…˜μ˜ μž‘μ—… 차단
- μž₯μ•  볡ꡬ 쀑 ν”„λ‘œλ“€μ„œ 쀑볡 싀행을 방지


### **8.2.7 νŠΈλžœμž­μ…˜μ˜ μž‘λ™μ›λ¦¬ πŸ”**

1. **νŠΈλžœμž­μ…˜ μ‹œμž‘**
- `beginTransaction()` 호좜둜 μƒνƒœ μ΄ˆκΈ°ν™”
- νŠΈλžœμž­μ…˜ ID둜 νŒŒν‹°μ…˜κ³Ό ν”„λ‘œλ“€μ„œ μ—°κ²°
2. **νŠΈλžœμž­μ…˜ 진행**
- λ©”μ‹œμ§€ 기둝 μ‹œ 각 λ©”μ‹œμ§€μ— νŠΈλžœμž­μ…˜ 정보λ₯Ό 포함
3. **νŠΈλžœμž­μ…˜ μ’…λ£Œ**
- `commitTransaction()` 호좜둜 λ©”μ‹œμ§€λ₯Ό ν™•μ • (컀밋 λ‘œκ·Έμ— 반영)
- `abortTransaction()` 호좜 μ‹œ λ©”μ‹œμ§€λ₯Ό 폐기
4. **νŠΈλžœμž­μ…˜ 관리**
- μ»¨νŠΈλ‘€λŸ¬μ™€ 코디넀이터가 νŠΈλžœμž­μ…˜ μƒνƒœ 및 μ˜€ν”„μ…‹ 처리 관리


## **8.3 νŠΈλžœμž­μ…˜ μ„±λŠ₯ πŸš€**

### **ν”„λ‘œλ“€μ„œ μΈ‘ μ„±λŠ₯ ⚑**
- νŠΈλžœμž­μ…˜ μ΄ˆκΈ°ν™”μ™€ 컀밋 μš”μ²­μ΄ λ™κΈ°μ μœΌλ‘œ 처리돼 데이터 전솑 지연 κ°€λŠ₯
- νŠΈλžœμž­μ…˜ λ‚΄ λ©”μ‹œμ§€ μˆ˜κ°€ λ§Žμ„μˆ˜λ‘ μ˜€λ²„ν—€λ“œ κ°μ†Œ 및 μ²˜λ¦¬λŸ‰ 증가

### **컨슈머 μΈ‘ μ„±λŠ₯ πŸ“Š**
- `read_committed` λͺ¨λ“œμ—μ„œ μ—΄λ¦° νŠΈλžœμž­μ…˜ λ©”μ‹œμ§€κ°€ λ°˜ν™˜λ˜μ§€ μ•Šμ•„ 지연 λ°œμƒ κ°€λŠ₯
- λΈŒλ‘œμ»€κ°€ μ—΄λ¦° νŠΈλžœμž­μ…˜ λ©”μ‹œμ§€λ₯Ό λ°˜ν™˜ν•˜μ§€ μ•Šμ•„ μ²˜λ¦¬λŸ‰μ—λŠ” 영ν–₯ μ—†μŒ

0 comments on commit 79d6aa1

Please sign in to comment.