Skip to content

architsuki-labs/gafka

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

16 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

πŸš€ gafka

κΈ°κ°„: 2025λ…„ 7μ›” 28일 ~ 9μ›” 26일 (9μ£Ό)
λͺ©ν‘œ: Kafka 핡심 κ°œλ…μ„ 담은 λ©”μ‹œμ§€ 큐 MVP κ΅¬ν˜„ + λΆ„μ‚° μ‹œμŠ€ν…œ 섀계 μ—­λŸ‰ μŠ΅λ“


1. 🧠 Why - μ™œ 이 μ‹œμŠ€ν…œμ„ λ§Œλ“œλŠ”κ°€?

πŸ“Œ 문제 μ •μ˜

κΈ°μ‘΄ μ‹œμŠ€ν…œμ—μ„œ μ„œλΉ„μŠ€ κ°„ 직접 호좜 방식은 λ‹€μŒκ³Ό 같은 ν•œκ³„λ₯Ό κ°€μ§„λ‹€:

  • 결합도: ν”„λ‘œλ“€μ„œμ™€ 컨슈머 κ°„ κ°•κ²°ν•©μœΌλ‘œ μ„œλΉ„μŠ€ λ³€κ²½ μ‹œ 영ν–₯도가 큼
  • ν™•μž₯μ„±: λŒ€μš©λŸ‰ 처리 μ‹œ λ™μ‹œμ„± 확보 어렀움
  • μ‹ λ’°μ„±: λ„€νŠΈμ›Œν¬ 이슈 λ°œμƒ μ‹œ λ©”μ‹œμ§€ μœ μ‹€ κ°€λŠ₯
  • 볡원λ ₯: μž₯μ•  μ‹œ 전체 흐름 쀑단 (예: 동기 호좜 μ‹€νŒ¨ μ „νŒŒ)

🎯 섀계 λͺ©ν‘œ

ν•­λͺ© λͺ©ν‘œ 수치 ν…ŒμŠ€νŠΈ 쑰건
μ²˜λ¦¬λŸ‰ (Throughput) β‰₯ 5,000 msg/s (1KB λ©”μ‹œμ§€ κΈ°μ€€) 단일 브둜컀 + 2νŒŒν‹°μ…˜ (HTTP/JSON ν•œκ³„ κ³ λ €)
μ§€μ—°μ‹œκ°„ (Latency) 평균 ≀ 100ms, P95 ≀ 200ms E2E μΈ‘μ • (Producerβ†’Consumer)
내ꡬ성 승인된 λ©”μ‹œμ§€ 100% 볡ꡬ 보μž₯ WAL 기반 μ™„μ „ 볡ꡬ ν…ŒμŠ€νŠΈ
μž₯μ•  볡ꡬ μ‹œκ°„ ≀ 30초 (μˆ˜λ™ 볡ꡬ 포함) 브둜컀 κ°•μ œ μ’…λ£Œ ν›„ 볡ꡬ μ‹œλ‚˜λ¦¬μ˜€
μˆœμ„œ 보μž₯ νŒŒν‹°μ…˜ λ‚΄ 100% μˆœμ„œ 보μž₯ λ©”μ‹œμ§€ μˆœμ„œ ν…ŒμŠ€νŠΈ

2. πŸ“Œ What - 무엇을 λ§Œλ“œλŠ”κ°€?

βœ”οΈ κΈ°λŠ₯ μš”κ΅¬μ‚¬ν•­

  • ν† ν”½/νŒŒν‹°μ…˜ ꡬ쑰: hash(key) % partitions λΌμš°νŒ…
  • λ©”μ‹œμ§€ λ°°μΉ­ 및 전솑: λ„€νŠΈμ›Œν¬ νš¨μœ¨μ„± ν–₯상 (100개 λ˜λŠ” 10ms λ‹¨μœ„)
  • μ˜€ν”„μ…‹ 기반 μ†ŒλΉ„ 및 재처리: μž₯μ•  μ‹œ νŠΉμ • 지점뢀터 μž¬μ‹œμž‘
  • λ©”μ‹œμ§€ μ˜μ†ν™” (WAL): 브둜컀 μž¬μ‹œμž‘ 후에도 데이터 μœ μ§€
  • Consumer Group 지원: λ©”μ‹œμ§€ 병렬 처리 및 λ‘œλ“œ λ°ΈλŸ°μ‹±
  • Long Polling 기반 Pull: μ‹€μ‹œκ°„μ„±κ³Ό νš¨μœ¨μ„± κ· ν˜•
  • 리더-νŒ”λ‘œμ›Œ 볡제: 데이터 이쀑화 (λ‹¨μˆœ κ΅¬ν˜„)
  • Heartbeat & νŒŒν‹°μ…˜ ν• λ‹Ή μœ μ§€: Consumer 생쑴 확인

βœ”οΈ λΉ„κΈ°λŠ₯ μš”κ΅¬μ‚¬ν•­

  • κ³ μ„±λŠ₯ 처리: 5K msg/s 이상 (HTTP/JSON μ œμ•½ κ³ λ €)
  • 평균 μ§€μ—°μ‹œκ°„: 100ms μ΄ν•˜
  • μž₯μ•  볡ꡬ: μ‹œλ‚˜λ¦¬μ˜€ 기반 볡ꡬ 맀뉴얼
  • ν…ŒμŠ€νŠΈ 기반 개발: TDD 적용
  • ν™•μž₯ κ°€λŠ₯ μ•„ν‚€ν…μ²˜: Phase 2μ—μ„œ gRPC/TCP λ§ˆμ΄κ·Έλ ˆμ΄μ…˜

πŸ“– μ˜ˆμƒ μ‹œλ‚˜λ¦¬μ˜€

  1. 둜그 μˆ˜μ§‘: μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 둜그 β†’ 쀑앙 μ €μž₯μ†Œ 전달
  2. 이벀트 처리: μ£Όλ¬Έ 생성 이벀트 β†’ 재고/결제 μ„œλΉ„μŠ€ μ•Œλ¦Ό
  3. 데이터 νŒŒμ΄ν”„λΌμΈ: μ‹€μ‹œκ°„ 데이터 β†’ 뢄석 μ‹œμŠ€ν…œ 전달

3. βš™οΈ How - μ–΄λ–»κ²Œ κ΅¬ν˜„ν•  것인가?

🧱 μ‹œμŠ€ν…œ μ•„ν‚€ν…μ²˜ (MVP)

flowchart TD
    Producer["Producer(CLI or SDK)"] --> Broker1["Broker-1(Leader)"]
    Broker1 --> WAL1[(WAL File)]
    Broker1 --> Broker2["Broker-2(Follower)"]
    Broker2 --> WAL2[(WAL File)]
    Consumer1["Consumer-1(Group-A)"] --> Broker1
    Consumer2["Consumer-2(Group-B)"] --> Broker1
    Admin[Admin CLI] --> Broker1
Loading

🧩 μ£Όμš” μ»΄ν¬λ„ŒνŠΈμ™€ μ±…μž„

μ»΄ν¬λ„ŒνŠΈ μ—­ν•  μ„€λͺ…
Producer λ©”μ‹œμ§€ 전솑, νŒŒν‹°μ…”λ‹ key 기반 λΌμš°νŒ… (hash(key) % N)
Broker λ©”μ‹œμ§€ μˆ˜μ‹ /μ €μž₯/μ„œλΉ™ WAL 기반 μ˜μ†μ„±, Consumer μš”μ²­ 응닡
Consumer λ©”μ‹œμ§€ Pull, μ˜€ν”„μ…‹ 관리 Long Polling, 컨슈머 κ·Έλ£Ή 지원
Coordinator (MVP λ‹¨μˆœν™”) Consumer Group 및 ν• λ‹Ή μƒνƒœ μœ μ§€ 인메λͺ¨λ¦¬ κ΅¬ν˜„, Heartbeat둜 λ¦¬λ°ΈλŸ°μ‹± 감지
WAL λ©”μ‹œμ§€ 볡ꡬ용 둜그 offset, checksum 포함
Replication λ¦¬λ”β†’νŒ”λ‘œμ›Œ 비동기 볡제 리더 κΈ°μ€€ μ΅œμ‹  λ©”μ‹œμ§€ 전달

🧠 코디넀이터 섀계 (κ°„μ†Œν™” MVP κΈ°μ€€)

ν•­λͺ© MVP 섀계 κΈ°μ€€
Group Metadata 브둜컀 인메λͺ¨λ¦¬λ‘œ 관리 (etcd λ“± μ™ΈλΆ€ 도ꡬ μ—†μŒ)
Consumer Registration group_id, consumer_id둜 등둝
Heartbeat API 주기적 호좜 (예: 5초) μ—†μœΌλ©΄ λ¦¬λ°ΈλŸ°μ‹±
Partition Assignment Round-Robin 방식 λ‹¨μˆœ κ΅¬ν˜„
Failover λŒ€μ‘ heartbeat λˆ„λ½ μ‹œ β†’ νŒŒν‹°μ…˜ μž¬ν• λ‹Ή

πŸ’  데이터 λͺ¨λΈλ§

// λ©”μ‹œμ§€ ꡬ쑰
type Message struct {
    Topic     string    `json:"topic"`
    Partition int32     `json:"partition"`
    Offset    int64     `json:"offset"`
    Key       string    `json:"key,omitempty"`
    Value     string    `json:"value"`          // MVPμ—μ„œλŠ” string으둜 λ‹¨μˆœν™”
    Timestamp int64     `json:"timestamp"`
    Size      int32     `json:"size"`           // λ©”μ‹œμ§€ 크기 (KB μ œν•œμš©)
}

// WAL μ—”νŠΈλ¦¬
type WALEntry struct {
    Offset    int64   `json:"offset"`
    Message   Message `json:"message"`
    Checksum  uint32  `json:"checksum"`         // CRC32 체크섬
}

// νŒŒν‹°μ…˜ ꡬ쑰
type Partition struct {
    ID          int32             `json:"id"`
    Messages    []Message         `json:"-"`        // 인메λͺ¨λ¦¬
    OffsetIndex map[int64]int     `json:"-"`        // μ˜€ν”„μ…‹ β†’ 인덱슀
    LastOffset  int64             `json:"last_offset"`
    WALPath     string            `json:"wal_path"`
    MaxSize     int64             `json:"max_size"` // νŒŒν‹°μ…˜ μ΅œλŒ€ 크기 (MB)
    mutex       sync.RWMutex      `json:"-"`        // λ™μ‹œμ„± μ œμ–΄
}

🀿 Kafka와 차이

1. μ‹œμŠ€ν…œ ꡬ성

ν•­λͺ© gafka Kafka
λ©”μ‹œμ§€ 경둜 Producer β†’ Broker (Leader) β†’ WAL β†’ Consumer μœ μ‚¬
볡제 방식 리더 β†’ νŒ”λ‘œμ›Œ 비동기 ISR 기반 볡제
Offset 관리 In-memory + 일뢀 API 지원 Zookeeper or Kafka Internal
톡신 방식 HTTP + JSON TCP + Binary Protocol
λ©”μ‹œμ§€ 전솑 방식 Batching 지원 Batching + Compression + Zero-Copy
μž₯μ•  볡ꡬ WAL 기반 μˆ˜λ™ 볡ꡬ μžλ™ 리더 μ„ μΆœ + ISR 볡제

2. 섀계 μ˜μ‚¬κ²°μ •

  • HTTP 기반 톡신: MVP 개발 속도λ₯Ό μœ„ν•œ μ˜λ„λœ μ„ νƒμ΄μ§€λ§Œ, μ„±λŠ₯ ν•œκ³„ 쑴재
  • Coordinator λ‹¨μˆœν™”: μ™ΈλΆ€ μ‹œμŠ€ν…œ (e.g., Zookeeper) 제거 β†’ ꡬ쑰 λ‹¨μˆœν™”
  • WAL 섀계: 단일 파일 기반 WAL둜 μ΅œμ†Œ μ˜μ†μ„± κ΅¬ν˜„, ν–₯ν›„ μ„Έκ·Έλ¨ΌνŠΈ 관리 ν•„μš”

4. πŸ› οΈ 기술 μŠ€νƒ

ν•­λͺ© 기술 이유
μ–Έμ–΄ Go 1.22 λΉ λ₯Έ λ™μ‹œμ„± 처리, κ°„λ‹¨ν•œ 배포
톡신 HTTP + JSON 개발 νŽΈμ˜μ„± μš°μ„  (μ„±λŠ₯ μ œμ•½ 인지)
μ €μž₯ In-memory + WAL 파일 μ˜μ†μ„±κ³Ό μ„±λŠ₯ κ°„ κ· ν˜•
CLI Cobra μ»€λ§¨λ“œ 라인 도ꡬ 개발
ν…ŒμŠ€νŠΈ go test TDD 기반 개발
μ„±λŠ₯ μΈ‘μ • wrk, custom tool Throughput, P95 μΈ‘μ •
λ‘œκΉ… logrus 단계별 λ‘œκΉ… 처리

μ•Œλ €μ§„ μ„±λŠ₯ μ œμ•½μ‚¬ν•­

μ œμ•½ μš”μ†Œ 영ν–₯ μ™„ν™” λ°©μ•ˆ
HTTP/JSON μ˜€λ²„ν—€λ“œ JSON νŒŒμ‹±μœΌλ‘œ μΈν•œ μ²˜λ¦¬λŸ‰ μ œν•œ (5K msg/s) 배칭으둜 μ™„ν™”, Phase 2μ—μ„œ gRPC λ§ˆμ΄κ·Έλ ˆμ΄μ…˜
인메λͺ¨λ¦¬ μ €μž₯μ†Œ νŒŒν‹°μ…˜λ‹Ή 1M λ©”μ‹œμ§€ μ œν•œ WAL 기반 μž¬μ‹œμž‘ μ‹œ 볡ꡬ, ν–₯ν›„ μ„Έκ·Έλ¨ΌνŠΈ λΆ„ν• 

μ‹œμŠ€ν…œ μ œν•œμ‚¬ν•­

μ œν•œ ν•­λͺ© μ΅œλŒ€κ°’ 이유
λ©”μ‹œμ§€ 크기 1MB HTTP μš”μ²­ 크기 μ œν•œ, λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰ 관리
ν† ν”½λ‹Ή νŒŒν‹°μ…˜ 수 100개 Consumer Group 관리 λ³΅μž‘λ„ μ œν•œ
νŒŒν‹°μ…˜λ‹Ή λ©”μ‹œμ§€ 수 1M개 인메λͺ¨λ¦¬ μ €μž₯ ν•œκ³„
Consumer Group 수 μ œν•œ μ—†μŒ 각 그룹은 λ…λ¦½μ μœΌλ‘œ 관리
Topicλͺ… 길이 255자 νŒŒμΌμ‹œμŠ€ν…œ ν˜Έν™˜μ„±
Consumer ID 길이 128자 HTTP URL 길이 μ œν•œ

5. πŸš€ μ‹€ν–‰ 방법

# 1. ν”„λ‘œμ νŠΈ 클둠 및 λΉŒλ“œ
git clone <repo> && cd gafka
make build

# 2. 브둜컀 μ‹œμž‘ (리더)
./bin/broker --id=1 --port=9001 --data-dir=/tmp/gafka-1 --role=leader

# 3. 브둜컀 μ‹œμž‘ (νŒ”λ‘œμ›Œ)  
./bin/broker --id=2 --port=9002 --data-dir=/tmp/gafka-2 --role=follower --leader=localhost:9001

# 4. ν† ν”½ 생성
./bin/admin create-topic --name=test-topic --partitions=2 --broker=localhost:9001

# 5. λ©”μ‹œμ§€ 전솑
./bin/producer --topic=test-topic --broker=localhost:9001 --message="Hello World" --key="user123"

# 6. λ©”μ‹œμ§€ μ†ŒλΉ„ (Long Polling)
./bin/consumer --topic=test-topic --group=test-group --broker=localhost:9001 --timeout=30s

API μ‚¬μš© μ˜ˆμ‹œ

# λ©”μ‹œμ§€ 전솑
curl -X POST http://localhost:9001/api/v1/produce \
  -H "Content-Type: application/json" \
  -d '{"topic":"test-topic","key":"user123","value":"Hello World"}'

# λ©”μ‹œμ§€ μ†ŒλΉ„ (Consumer Group 기반 - λΈŒλ‘œμ»€κ°€ offset 관리)
curl "http://localhost:9001/api/v1/consume?topic=test-topic&count=10&consumer_id=consumer-1&group_id=test-group&timeout=30s"

# λ©”μ‹œμ§€ μ†ŒλΉ„ (κ°œλ³„ Consumer - 직접 offset μ§€μ •)
curl "http://localhost:9001/api/v1/consume?topic=test-topic&partition=0&offset=100&count=10&timeout=30s"

# Consumer Group μƒνƒœ 확인
curl "http://localhost:9001/api/v1/consumer-groups/test-group/status"

# Consumer Heartbeat
curl -X POST "http://localhost:9001/api/v1/consumer-groups/test-group/members/consumer-1/heartbeat"

6. πŸ§ͺ μ„±λŠ₯ ν…ŒμŠ€νŠΈ κ³„νš

ν…ŒμŠ€νŠΈ μ‹œλ‚˜λ¦¬μ˜€

ν…ŒμŠ€νŠΈ ν•­λͺ© 도ꡬ λͺ©ν‘œ 검증 방법
μ²˜λ¦¬λŸ‰ μΈ‘μ • wrk + Lua β‰₯5K msg/s 1KB λ©”μ‹œμ§€λ‘œ 30초 λΆ€ν•˜
μ§€μ—°μ‹œκ°„ μΈ‘μ • Go client P95 ≀ 200ms produce β†’ consume μΈ‘μ •
μž₯μ•  볡ꡬ μˆ˜λ™ ≀30초 브둜컀 kill ν›„ 볡원
배치 효과 wrk TPS 비ꡐ 배치 vs 단건 전솑 비ꡐ

μ„±λŠ₯ ν…ŒμŠ€νŠΈ 슀크립트

-- scripts/produce.lua (wrk용)
wrk.method = "POST"
wrk.headers["Content-Type"] = "application/json"

-- 1KB λ©”μ‹œμ§€λ‘œ ν…ŒμŠ€νŠΈ
local message_1kb = string.rep("a", 1024)

function request()
    local body = string.format('{"topic":"test-topic","key":"test-%d","value":"%s"}', 
        math.random(1000), message_1kb)
    return wrk.format(wrk.method, wrk.path, wrk.headers, body)
end

function response(status, headers, body)
    if status ~= 200 and status ~= 201 then
        print("Error: " .. status .. " " .. body)
    end
end

function done(summary, latency, requests)
    print("Throughput: " .. string.format("%.2f", summary.requests / (summary.duration / 1000000)) .. " requests/sec")
    print("Average latency: " .. latency.mean / 1000 .. "ms")
end

7. πŸ§ͺ TDD 개발 κ°€μ΄λ“œ

TDD 사이클 적용

Red β†’ Green β†’ Refactor 사이클 반볡
1. μ‹€νŒ¨ν•˜λŠ” ν…ŒμŠ€νŠΈ μž‘μ„±
2. ν…ŒμŠ€νŠΈλ₯Ό ν†΅κ³Όν•˜λŠ” μ΅œμ†Œ μ½”λ“œ κ΅¬ν˜„  
3. μ½”λ“œ κ°œμ„  (λ¦¬νŒ©ν† λ§)

주차별 TDD λͺ©ν‘œ

μ£Όμ°¨ TDD ν…ŒμŠ€νŠΈ λŒ€μƒ μ˜ˆμ‹œ ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€
1-2μ£Όμ°¨ λ©”μ‹œμ§€ ꡬ쑰체, νŒŒν‹°μ…˜ 둜직 TestMessage_Serialize(), TestPartition_AddMessage()
3-4μ£Όμ°¨ ν”„λ‘œλ“€μ„œ/컨슈머 API TestProducer_SendMessage(), TestConsumer_PullMessages()
5-6μ£Όμ°¨ WAL μ˜μ†ν™”, Consumer Group TestWAL_WriteAndRecover(), TestConsumerGroup_Rebalancing()
7-8μ£Όμ°¨ 톡합 ν…ŒμŠ€νŠΈ, μ„±λŠ₯ ν…ŒμŠ€νŠΈ TestBroker_HandleHighLoad(), TestFailover_Recovery()
9μ£Όμ°¨ E2E ν…ŒμŠ€νŠΈ, λ¬Έμ„œν™” TestFullWorkflow_ProducerToBrokerToConsumer()

8. 🧾 μ˜ˆμƒ 질문 & λŒ€μ‘ μ „λž΅

질문 λŒ€μ‘
μ™œ Kafka 클둠을 Go둜 λ§Œλ“œλ‚˜μš”? λ™μ‹œμ„±, ν•™μŠ΅ 효율, κ°€λ…μ„±μ—μ„œ Goκ°€ 적합
μ™ΈλΆ€ Zookeeper/etcd μ™œ μ•ˆ μΌλ‚˜μš”? MVP에선 였히렀 λ³΅μž‘λ„ 증가. ν–₯ν›„ ν™•μž₯ κ³„νš 있음
λ©”μ‹œμ§€ μˆœμ„œλŠ” μ–΄λ–»κ²Œ 보μž₯λ˜λ‚˜μš”? νŒŒν‹°μ…˜ λ‚΄ offset λ‹¨μœ„ 순차 처리, key 기반 νŒŒν‹°μ…”λ‹
브둜컀 μž₯μ•  μ‹œ λ³΅κ΅¬λŠ” μ–΄λ–»κ²Œ λ˜λ‚˜μš”? WAL 파일 기반 μžλ™ 볡ꡬ + νŒ”λ‘œμ›Œβ†’λ¦¬λ” μˆ˜λ™ 승격. 리더 μ„ μΆœ μžλ™ν™”λŠ” Phase 2
Pull λ°©μ‹μ˜ μ‹€μ‹œκ°„μ„±μ€ μ–΄λ–»κ²Œ 보μž₯λ˜λ‚˜μš”? Long Polling μ‚¬μš©, μ΅œλŒ€ 30초 이내 응닡 보μž₯
WAL 손상 μ‹œ λ³΅κ΅¬λŠ” μ–΄λ–»κ²Œ λ˜λ‚˜μš”? CRC32 기반 손상 검증, 볡ꡬ μ‹€νŒ¨ μ‹œ fail-safe 처리 ν•„μš”
λ©”μ‹œμ§€ 쀑볡 λ°©μ§€λŠ”? at-least-once만 보μž₯. 쀑볡 λ°©μ§€λŠ” Consumerμ—μ„œ 처리 ν•„μš”
Consumer Groupμ—μ„œ λ™μ‹œμ„± λ¬Έμ œλŠ” μ–΄λ–»κ²Œ ν•΄κ²°ν•˜λ‚˜μš”? Heartbeat + νŒŒν‹°μ…˜ ν• λ‹ΉμœΌλ‘œ ν•œ νŒŒν‹°μ…˜μ€ ν•œ Consumer만 μ†ŒλΉ„. 409 Conflict둜 쀑볡 λ°©μ§€
HTTP + JSON μ„±λŠ₯ ν•œκ³„λŠ” μ–΄λ–»κ²Œ ν•΄κ²°ν•˜λ‚˜μš”? MVPμ—μ„œλŠ” 개발 νŽΈμ˜μ„± μš°μ„ . 5K msg/s λͺ©ν‘œλ‘œ ν˜„μ‹€μ  μ„€μ •. Phase 2μ—μ„œ gRPC둜 λ§ˆμ΄κ·Έλ ˆμ΄μ…˜
Zero-copy μ΅œμ ν™”λŠ” HTTPμ—μ„œ κ°€λŠ₯ν•œκ°€μš”? HTTP μŠ€νƒμ—μ„œλŠ” λΆˆκ°€λŠ₯. Phase 2μ—μ„œ TCP 기반 μ»€μŠ€ν…€ ν”„λ‘œν† μ½œλ‘œ μ „ν™˜ν•΄μ•Ό κ΅¬ν˜„ κ°€λŠ₯

πŸ— λ°œμ „ κ°€λŠ₯ν•œ λ² μ΄μŠ€μΈμ§€?

βœ… μΆ©λΆ„νžˆ λ°œμ „ κ°€λŠ₯ν•œ 섀계

  • λͺ¨λ“  핡심 μ»΄ν¬λ„ŒνŠΈκ°€ λͺ¨λ“ˆν™”λ˜μ–΄ 있음 (internal/broker, internal/consumer λ“±)
  • ν…ŒμŠ€νŠΈ 기반 개발 ν”„λ‘œμ„ΈμŠ€ νƒ‘μž¬ (TDD + wrk)
  • 디버깅과 ν™•μž₯ λͺ¨λ‘ κ³ λ €ν•œ 디렉토리 ꡬ쑰

ν•˜μ§€λ§Œ μ•„λž˜μ™€ 같은 μš”μ†ŒλŠ” μ‹œμŠ€ν…œ ν™•μž₯의 μ‹€μ§ˆμ  μž₯μ• λ¬Όλ‘œ μž‘μš© κ°€λŠ₯

🚫 μ‹€μ§ˆμ μΈ μž₯μ• λ¬Ό

  1. 톡신 계측 ν•œκ³„
    • HTTP + JSON β†’ 5K msg/s μ œν•œ
    • TCP 기반 μ»€μŠ€ν…€ ν”„λ‘œν† μ½œ ν•„μš” (Zero-copy λ“±)
  2. Coordinator 지속성 μ—†μŒ
    • ν˜„μž¬λŠ” 인메λͺ¨λ¦¬ 기반 (Consumer Group, Offset λ“± λͺ¨λ‘ νœ˜λ°œμ„±)
  3. 볡제/μž₯μ•  볡ꡬ μžλ™ν™” λΆ€μ‘±
    • νŒ”λ‘œμ›Œμ˜ 리더 μ „ν™˜ μˆ˜λ™
    • ISR, 리더 μ„ μΆœ μ•Œκ³ λ¦¬μ¦˜ λΆ€μž¬
  4. μ„Έκ·Έλ¨ΌνŠΈ 및 인덱싱 κΈ°λŠ₯ λΆ€μž¬
    • WAL은 ν•˜λ‚˜μ˜ κΈ΄ 둜그둜만 쑴재 β†’ 볡ꡬ/μ••μΆ•/GC μ–΄λ ΅λ‹€

9. πŸ—“οΈ 개발 일정 (주차별)

μ£Όμ°¨ 핡심 κ΅¬ν˜„ 사항 TDD λͺ©ν‘œ 검증 κΈ°μ€€
1μ£Όμ°¨
(7/28-8/3)
ν”„λ‘œμ νŠΈ μ…‹μ—…, λ©”μ‹œμ§€ ꡬ쑰체 Message, Partition λ‹¨μœ„ ν…ŒμŠ€νŠΈ ν…ŒμŠ€νŠΈ 컀버리지 > 80%
2μ£Όμ°¨
(8/4-8/10)
νŒŒν‹°μ…˜ 둜직, WAL κΈ°λ³Έ κ΅¬ν˜„ WAL 읽기/μ“°κΈ° ν…ŒμŠ€νŠΈ 파일 μ˜μ†ν™” λ™μž‘ 확인
3μ£Όμ°¨
(8/11-8/17)
HTTP API, ν”„λ‘œλ“€μ„œ κ΅¬ν˜„ HTTP ν•Έλ“€λŸ¬ ν…ŒμŠ€νŠΈ 1K msg/s 처리 확인
4μ£Όμ°¨
(8/18-8/24)
컨슈머, μ˜€ν”„μ…‹ 관리 컨슈머 κ·Έλ£Ή ν…ŒμŠ€νŠΈ E2E λ©”μ‹œμ§€ ν”Œλ‘œμš° λ™μž‘
5μ£Όμ°¨
(8/25-8/31)
λ°°μΉ­, μ„±λŠ₯ μ΅œμ ν™” λ°°μΉ­ 둜직 ν…ŒμŠ€νŠΈ 5K msg/s λͺ©ν‘œ 달성
6μ£Όμ°¨
(9/1-9/7)
Consumer Group, νŒŒν‹°μ…˜ ν• λ‹Ή λ¦¬λ°ΈλŸ°μ‹± ν…ŒμŠ€νŠΈ Consumer μΆ”κ°€/μ‚­μ œ μ‹œ μžλ™ μž¬ν• λ‹Ή
7μ£Όμ°¨
(9/8-9/14)
볡제 κΈ°λŠ₯, μž₯μ•  볡ꡬ 볡제 동기화 ν…ŒμŠ€νŠΈ 데이터 일관성 확인, 30초 λ‚΄ 볡ꡬ
8μ£Όμ°¨
(9/15-9/21)
μ„±λŠ₯ ν…ŒμŠ€νŠΈ, 버그 μˆ˜μ • λΆ€ν•˜ ν…ŒμŠ€νŠΈ μžλ™ν™” λͺ¨λ“  μ„±λŠ₯ λͺ©ν‘œ 달성
9μ£Όμ°¨
(9/22-9/26)
λ¬Έμ„œν™”, 데λͺ¨ μ€€λΉ„ 톡합 ν…ŒμŠ€νŠΈ μ™„λ£Œ README, API λ¬Έμ„œ μ™„μ„±

10. πŸ“¦ 디렉토리 ꡬ쑰 (Go Best Practice)

gafka/
β”œβ”€β”€ cmd/                           # μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ§„μž…μ 
β”‚   β”œβ”€β”€ broker/
β”‚   β”‚   └── main.go               # 브둜컀 μ„œλ²„ μ‹€ν–‰
β”‚   β”œβ”€β”€ producer/
β”‚   β”‚   └── main.go               # ν”„λ‘œλ“€μ„œ CLI
β”‚   β”œβ”€β”€ consumer/
β”‚   β”‚   └── main.go               # 컨슈머 CLI
β”‚   └── admin/
β”‚       └── main.go               # 관리 도ꡬ CLI
β”œβ”€β”€ internal/                      # λ‚΄λΆ€ νŒ¨ν‚€μ§€ (μ™ΈλΆ€ λ…ΈμΆœ λΆˆκ°€)
β”‚   β”œβ”€β”€ broker/                   # 브둜컀 μ½”μ–΄ 둜직
β”‚   β”‚   β”œβ”€β”€ broker.go
β”‚   β”‚   β”œβ”€β”€ broker_test.go
β”‚   β”‚   β”œβ”€β”€ partition.go
β”‚   β”‚   β”œβ”€β”€ partition_test.go
β”‚   β”‚   β”œβ”€β”€ wal.go
β”‚   β”‚   β”œβ”€β”€ wal_test.go
β”‚   β”‚   β”œβ”€β”€ replication.go
β”‚   β”‚   └── replication_test.go
β”‚   β”œβ”€β”€ producer/                 # ν”„λ‘œλ“€μ„œ 둜직
β”‚   β”‚   β”œβ”€β”€ producer.go
β”‚   β”‚   β”œβ”€β”€ producer_test.go
β”‚   β”‚   β”œβ”€β”€ batcher.go
β”‚   β”‚   β”œβ”€β”€ batcher_test.go
β”‚   β”‚   └── partitioner.go
β”‚   β”œβ”€β”€ consumer/                 # 컨슈머 둜직
β”‚   β”‚   β”œβ”€β”€ consumer.go
β”‚   β”‚   β”œβ”€β”€ consumer_test.go
β”‚   β”‚   β”œβ”€β”€ group.go
β”‚   β”‚   β”œβ”€β”€ group_test.go
β”‚   β”‚   └── offset.go
β”‚   └── api/                      # HTTP API ν•Έλ“€λŸ¬
β”‚       β”œβ”€β”€ handlers.go
β”‚       β”œβ”€β”€ handlers_test.go
β”‚       β”œβ”€β”€ middleware.go
β”‚       └── routes.go
β”œβ”€β”€ pkg/                          # μ™ΈλΆ€ νŒ¨ν‚€μ§€ (μž¬μ‚¬μš© κ°€λŠ₯)
β”‚   β”œβ”€β”€ protocol/                 # λ©”μ‹œμ§€ ν”„λ‘œν† μ½œ
β”‚   β”‚   β”œβ”€β”€ message.go
β”‚   β”‚   └── message_test.go
β”‚   └── client/                   # Go ν΄λΌμ΄μ–ΈνŠΈ SDK
β”‚       β”œβ”€β”€ client.go
β”‚       └── client_test.go
β”œβ”€β”€ configs/                      # μ„€μ • 파일
β”‚   β”œβ”€β”€ broker.yaml
β”‚   └── examples/
β”œβ”€β”€ scripts/                      # 슀크립트 및 도ꡬ
β”‚   β”œβ”€β”€ produce.lua              # wrk ν…ŒμŠ€νŠΈ 슀크립트
β”‚   β”œβ”€β”€ setup.sh                 # ν™˜κ²½ μ„€μ •
β”‚   └── benchmark.sh             # μ„±λŠ₯ ν…ŒμŠ€νŠΈ
β”œβ”€β”€ docs/                        # λ¬Έμ„œ
β”‚   β”œβ”€β”€ api.md                   # API λ¬Έμ„œ
β”‚   β”œβ”€β”€ architecture.md          # μ•„ν‚€ν…μ²˜ κ°€μ΄λ“œ
β”‚   └── operations.md            # 운영 κ°€μ΄λ“œ
β”œβ”€β”€ examples/                    # μ‚¬μš© μ˜ˆμ‹œ
β”‚   β”œβ”€β”€ simple_producer/
β”‚   └── simple_consumer/
β”œβ”€β”€ Makefile                     # λΉŒλ“œ 슀크립트
β”œβ”€β”€ go.mod                       # Go λͺ¨λ“ˆ μ •μ˜
β”œβ”€β”€ go.sum                       # μ˜μ‘΄μ„± 체크섬
β”œβ”€β”€ README.md                    # ν”„λ‘œμ νŠΈ κ°œμš”
└── .gitignore                   # Git λ¬΄μ‹œ 파일

11. πŸ“Œ ν–₯ν›„ 과제

Phase 1 - MVP (ν˜„μž¬)

  • κΈ°λ³Έ ν”„λ‘œλ“€μ„œ/컨슈머 κ΅¬ν˜„
  • 단일 브둜컀 WAL μ €μž₯μ†Œ
  • HTTP API 기반 톡신

Phase 2 - μ„±λŠ₯ μ΅œμ ν™”

  • HTTP β†’ gRPC or TCP μ»€μŠ€ν…€ ν”„λ‘œν† μ½œ
  • WAL μ„Έκ·Έλ¨ΌνŠΈ ꡬ쑰 및 인덱싱 μΆ”κ°€
  • λ©”μ‹œμ§€ μ••μΆ• (gzip/snappy)

Phase 3 - λΆ„μ‚° μ‹œμŠ€ν…œ ν™•μž₯

  • Raft 기반 리더 μ„ μΆœ
  • Offset 및 Metadata μ˜μ†ν™” (BoltDB/Badger λ“± μ‚¬μš© κ°€λŠ₯)
  • 브둜컀 ν΄λŸ¬μŠ€ν„°λ§ + ZooKeeper or etcd 연동

βœ… 성곡 κΈ°μ€€

κΈ°λŠ₯적 κΈ°μ€€

  • λ©”μ‹œμ§€ μ²˜λ¦¬λŸ‰: 단일 브둜컀 5K msg/s 이상 (1KB λ©”μ‹œμ§€, HTTP/JSON κΈ°μ€€)
  • λ©”μ‹œμ§€ μˆœμ„œ 보μž₯: νŒŒν‹°μ…˜ λ‚΄ 100% μˆœμ„œ μœ μ§€
  • 데이터 μ˜μ†μ„±: 승인된 λ©”μ‹œμ§€ WAL 기반 100% 볡ꡬ 보μž₯
  • κΈ°λ³Έ 볡제: 리더-νŒ”λ‘œμ›Œ κ°„ 비동기 볡제 정상 λ™μž‘
  • Consumer Group: νŒŒν‹°μ…˜λ³„ 단일 Consumer 보μž₯

기술적 κΈ°μ€€

  • ν…ŒμŠ€νŠΈ 컀버리지: 80% 이상 μœ μ§€
  • TDD μ€€μˆ˜: λͺ¨λ“  κΈ°λŠ₯을 ν…ŒμŠ€νŠΈ λ¨Όμ € μž‘μ„±
  • μ½”λ“œ ν’ˆμ§ˆ: Go lint κ·œμΉ™ μ€€μˆ˜
  • API λ¬Έμ„œ: OpenAPI μŠ€νŽ™ μ™„μ„±

ν•™μŠ΅ λͺ©ν‘œ 달성도

  • λ©”μ‹œμ§€ 큐 핡심 κ°œλ…: ν† ν”½, νŒŒν‹°μ…˜, μ˜€ν”„μ…‹ 이해
  • λΆ„μ‚° μ‹œμŠ€ν…œ 기초: 볡제, 일관성, μž₯μ•  볡ꡬ κ²½ν—˜
  • κ³ μ„±λŠ₯ I/O: WAL, λ°°μΉ­ 기법 κ΅¬ν˜„
  • TDD μ—­λŸ‰: ν…ŒμŠ€νŠΈ 주도 개발 μ™„μ„±

About

A distributed message queue inspired by Kafka, built with Go

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors