mirror of
https://github.com/hwanny1128/HGZero.git
synced 2025-12-06 23:06:23 +00:00
357 lines
8.4 KiB
Markdown
357 lines
8.4 KiB
Markdown
# Event Hub Basic Tier 제약사항 및 해결 방법
|
|
|
|
## 현재 상황
|
|
|
|
```
|
|
Event Hub Namespace: hgzero-eventhub-ns
|
|
Resource Group: rg-digitalgarage-02
|
|
Location: koreacentral
|
|
Tier: Basic ⚠️
|
|
Status: Active
|
|
```
|
|
|
|
## Basic Tier 제약사항
|
|
|
|
| 기능 | Basic | Standard | Premium |
|
|
|------|-------|----------|---------|
|
|
| **Consumer Groups** | **1개만** ($Default) | **최대 20개** | 최대 100개 |
|
|
| 파티션 | 최대 32개 | 최대 32개 | 최대 100개 |
|
|
| 메시지 보존 | 1일 | 7일 | 90일 |
|
|
| Capture | ❌ | ✅ | ✅ |
|
|
| 가격 | 낮음 | 중간 | 높음 |
|
|
|
|
**Basic Tier에서는 `$Default` Consumer Group만 사용할 수 있습니다.**
|
|
|
|
---
|
|
|
|
## 해결 방법
|
|
|
|
### 방법 1: Tier 업그레이드 (권장) ⭐️
|
|
|
|
Event Hub를 Basic → Standard로 업그레이드하면 최대 20개의 Consumer Group 사용 가능
|
|
|
|
#### 업그레이드 방법
|
|
|
|
**Azure Portal:**
|
|
1. Event Hub Namespace (hgzero-eventhub-ns) 페이지로 이동
|
|
2. 왼쪽 메뉴에서 "Pricing tier" 클릭
|
|
3. "Standard" 선택
|
|
4. "Apply" 버튼 클릭
|
|
5. 약 1-2분 후 적용 완료
|
|
|
|
**Azure CLI:**
|
|
```bash
|
|
az eventhubs namespace update \
|
|
--resource-group rg-digitalgarage-02 \
|
|
--name hgzero-eventhub-ns \
|
|
--sku Standard \
|
|
--capacity 1
|
|
```
|
|
|
|
**비용:**
|
|
- Basic: ~$0.015/시간 (~$11/월)
|
|
- Standard: ~$0.03/시간 (~$22/월)
|
|
- 차이: 약 $11/월 추가
|
|
|
|
**장점:**
|
|
- ✅ 여러 Consumer Group 사용 가능
|
|
- ✅ 메시지 보존 기간 7일로 증가
|
|
- ✅ Capture 기능 사용 가능
|
|
- ✅ 영구적 해결책
|
|
|
|
**단점:**
|
|
- ❌ 비용 증가 (약 2배)
|
|
- ❌ 관리자 승인 필요할 수 있음
|
|
|
|
---
|
|
|
|
### 방법 2: $Default Consumer Group 공유 사용 (임시)
|
|
|
|
개발/테스트 시 기존 프로덕션 Consumer를 잠시 중지하고 테스트
|
|
|
|
#### 실행 순서
|
|
|
|
**Step 1: 프로덕션 Consumer 중지**
|
|
```bash
|
|
# 기존 Consumer 프로세스 확인
|
|
ps aux | grep "start_consumer.py" | grep -v grep
|
|
|
|
# PID 확인 후 종료
|
|
kill <PID>
|
|
|
|
# 예시
|
|
kill 51257
|
|
```
|
|
|
|
**Step 2: 테스트 Consumer 실행**
|
|
```bash
|
|
cd /Users/daewoong/home/workspace/HGZero/rag
|
|
python start_consumer.py
|
|
```
|
|
|
|
**Step 3: 테스트 완료 후 프로덕션 재시작**
|
|
```bash
|
|
# Ctrl+C로 테스트 Consumer 종료
|
|
|
|
# 프로덕션 Consumer 재시작
|
|
python start_consumer.py &
|
|
```
|
|
|
|
**장점:**
|
|
- ✅ 추가 비용 없음
|
|
- ✅ 즉시 테스트 가능
|
|
- ✅ 권한 불필요
|
|
|
|
**단점:**
|
|
- ❌ 프로덕션 서비스 중단
|
|
- ❌ 동시 실행 불가
|
|
- ❌ 임시 방법
|
|
|
|
**주의사항:**
|
|
- ⚠️ 프로덕션 환경에서만 사용 중이라면 비추천
|
|
- ⚠️ 업무 시간 외에만 테스트
|
|
- ⚠️ 테스트 후 반드시 프로덕션 재시작 확인
|
|
|
|
---
|
|
|
|
### 방법 3: Checkpoint 위치 변경으로 독립 실행
|
|
|
|
동일한 Consumer Group을 사용하되, checkpoint 저장 위치를 다르게 하여 독립적으로 실행
|
|
|
|
#### 구현 방법
|
|
|
|
**Step 1: 별도 Storage Container 생성**
|
|
|
|
Azure Portal:
|
|
1. Storage Account (hgzerostorage) 접속
|
|
2. "Containers" 클릭
|
|
3. "+ Container" 클릭
|
|
4. 이름: `hgzero-checkpoints-dev`
|
|
5. Create
|
|
|
|
**Step 2: config_dev.yaml 생성**
|
|
|
|
```yaml
|
|
# config_dev.yaml
|
|
eventhub:
|
|
connection_string: ${EVENTHUB_CONNECTION_STRING}
|
|
name: ${EVENTHUB_NAME}
|
|
consumer_group: "$Default" # 동일
|
|
storage:
|
|
connection_string: ${AZURE_STORAGE_CONNECTION_STRING}
|
|
container_name: "hgzero-checkpoints-dev" # 다른 컨테이너!
|
|
|
|
# 나머지는 config.yaml과 동일
|
|
```
|
|
|
|
**Step 3: 개발용 Consumer 실행 스크립트**
|
|
|
|
```python
|
|
# start_dev_consumer.py
|
|
import asyncio
|
|
from pathlib import Path
|
|
|
|
from src.utils.config import load_config
|
|
from src.db.rag_minutes_db import RagMinutesDB
|
|
from src.db.postgres_vector import PostgresVectorDB
|
|
from src.utils.embedding import EmbeddingGenerator
|
|
from src.services.eventhub_consumer import start_consumer
|
|
|
|
async def main():
|
|
# 개발용 설정 파일 로드
|
|
config_path = Path(__file__).parent / "config_dev.yaml"
|
|
config = load_config(str(config_path))
|
|
|
|
# ... 나머지는 start_consumer.py와 동일
|
|
|
|
if __name__ == "__main__":
|
|
asyncio.run(main())
|
|
```
|
|
|
|
**Step 4: 실행**
|
|
|
|
```bash
|
|
# Terminal 1: 프로덕션 Consumer
|
|
python start_consumer.py
|
|
|
|
# Terminal 2: 개발 Consumer (다른 checkpoint)
|
|
python start_dev_consumer.py
|
|
```
|
|
|
|
**장점:**
|
|
- ✅ 동시 실행 가능
|
|
- ✅ 독립적인 checkpoint
|
|
- ✅ 추가 비용 거의 없음 (Storage만)
|
|
- ✅ Tier 업그레이드 불필요
|
|
|
|
**단점:**
|
|
- ❌ 동일 파티션을 두 Consumer가 읽으려 하면 ownership 경쟁
|
|
- ❌ 한쪽만 이벤트 수신 (ownership을 가진 쪽)
|
|
- ❌ 완전한 독립 실행은 아님
|
|
|
|
**결론:**
|
|
- 이 방법은 **checkpoint만 독립**이고, **여전히 ownership 경쟁** 발생
|
|
- **동시 실행은 불가능**
|
|
- 권장하지 않음 ❌
|
|
|
|
---
|
|
|
|
### 방법 4: 로컬 개발 환경에서만 테스트
|
|
|
|
Event Hub 대신 로컬 메시지 큐 사용
|
|
|
|
#### 옵션 A: Azure Event Hub Emulator (권장)
|
|
|
|
현재는 공식 Emulator가 없으므로, Kafka나 RabbitMQ로 대체
|
|
|
|
#### 옵션 B: 메모리 큐로 테스트
|
|
|
|
```python
|
|
# test_consumer_local.py
|
|
import asyncio
|
|
import json
|
|
from queue import Queue
|
|
|
|
# 로컬 메모리 큐
|
|
local_queue = Queue()
|
|
|
|
async def test_event_processing():
|
|
"""로컬에서 이벤트 처리 로직만 테스트"""
|
|
|
|
# 테스트 이벤트 생성
|
|
test_event = {
|
|
'eventType': 'MINUTES_FINALIZED',
|
|
'data': {
|
|
'meetingId': 'test-001',
|
|
'title': '테스트 회의',
|
|
'minutesId': 'minutes-001',
|
|
'sections': []
|
|
}
|
|
}
|
|
|
|
# Consumer의 _process_minutes_event 로직만 테스트
|
|
from src.services.eventhub_consumer import EventHubConsumer
|
|
|
|
# 실제 처리 로직 테스트
|
|
# ...
|
|
|
|
asyncio.run(test_event_processing())
|
|
```
|
|
|
|
**장점:**
|
|
- ✅ 완전 독립 실행
|
|
- ✅ 무료
|
|
- ✅ 빠른 테스트
|
|
|
|
**단점:**
|
|
- ❌ 실제 Event Hub와 다른 환경
|
|
- ❌ 통합 테스트 불가
|
|
|
|
---
|
|
|
|
## 권장 솔루션
|
|
|
|
### 개발 단계별 권장 방법
|
|
|
|
| 단계 | 권장 방법 | 이유 |
|
|
|------|----------|------|
|
|
| **로컬 개발** | 방법 4 (메모리 큐) | 빠르고 비용 없음 |
|
|
| **통합 테스트** | 방법 2 ($Default 공유) | 실제 환경, 단기간 |
|
|
| **지속적 개발** | 방법 1 (Tier 업그레이드) | 영구 해결, 동시 실행 |
|
|
| **프로덕션** | 방법 1 (Standard Tier) | 고가용성, 확장성 |
|
|
|
|
### 최종 권장: Tier 업그레이드
|
|
|
|
**이유:**
|
|
1. ✅ 여러 Consumer Group으로 개발/테스트 분리
|
|
2. ✅ 메시지 보존 기간 증가 (1일 → 7일)
|
|
3. ✅ 향후 확장 가능 (Capture 등)
|
|
4. ✅ 프로덕션 안정성 향상
|
|
|
|
**비용 대비 효과:**
|
|
- 월 $11 추가로 개발 생산성 향상
|
|
- 프로덕션 중단 없이 테스트 가능
|
|
- 장기적으로 더 경제적
|
|
|
|
---
|
|
|
|
## 실행 가이드
|
|
|
|
### 즉시 테스트가 필요한 경우 (방법 2)
|
|
|
|
```bash
|
|
# 1. 프로덕션 Consumer 중지
|
|
ps aux | grep "start_consumer.py" | grep -v grep
|
|
kill <PID>
|
|
|
|
# 2. 테스트 실행
|
|
cd /Users/daewoong/home/workspace/HGZero/rag
|
|
python start_consumer.py
|
|
|
|
# 3. 테스트 완료 후
|
|
# Ctrl+C로 종료
|
|
|
|
# 4. 프로덕션 재시작
|
|
python start_consumer.py &
|
|
```
|
|
|
|
### Tier 업그레이드 후 (방법 1)
|
|
|
|
```bash
|
|
# 1. Tier 업그레이드 (Azure Portal 또는 CLI)
|
|
az eventhubs namespace update \
|
|
--resource-group rg-digitalgarage-02 \
|
|
--name hgzero-eventhub-ns \
|
|
--sku Standard
|
|
|
|
# 2. Consumer Group 생성
|
|
az eventhubs eventhub consumer-group create \
|
|
--resource-group rg-digitalgarage-02 \
|
|
--namespace-name hgzero-eventhub-ns \
|
|
--eventhub-name hgzero-eventhub-name \
|
|
--name development
|
|
|
|
# 3. config.yaml 수정
|
|
# consumer_group: "development"
|
|
|
|
# 4. 프로덕션은 계속 실행, 개발 Consumer 별도 실행
|
|
python start_consumer.py
|
|
```
|
|
|
|
---
|
|
|
|
## 요약
|
|
|
|
### 현재 상황
|
|
- ❌ Event Hub Tier: **Basic**
|
|
- ❌ Consumer Group: **$Default만 사용 가능**
|
|
- ❌ 추가 Consumer Group 생성 불가
|
|
|
|
### 해결책
|
|
1. **단기**: 프로덕션 Consumer 잠시 중지하고 테스트 (방법 2)
|
|
2. **장기**: Standard Tier로 업그레이드 (방법 1) ⭐️
|
|
|
|
### 다음 액션
|
|
관리자에게 **Tier 업그레이드** 요청하거나,
|
|
긴급하다면 **프로덕션 중지 후 테스트** 진행
|
|
|
|
---
|
|
|
|
## 참고: Tier 비교
|
|
|
|
```
|
|
Basic Tier (현재)
|
|
├─ Consumer Groups: 1개 ($Default만)
|
|
├─ 보존 기간: 1일
|
|
├─ 비용: ~$11/월
|
|
└─ ❌ 개발/테스트 분리 불가
|
|
|
|
Standard Tier (권장)
|
|
├─ Consumer Groups: 최대 20개 ✅
|
|
├─ 보존 기간: 7일
|
|
├─ 비용: ~$22/월 (+$11)
|
|
└─ ✅ 개발/테스트 완전 분리
|
|
```
|
|
|
|
Standard Tier로 업그레이드하는 것을 강력히 권장합니다! 🎯
|