# 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 # 예시 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 # 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로 업그레이드하는 것을 강력히 권장합니다! 🎯