Tôi đã triển khai hệ thống AI proxy cho 3 startup trong năm qua, và một điều tôi học được: không có API nào đáng tin 100%. Tuần trước, một khách hàng của tôi mất 40 phút downtime vì OpenAI rate limit - doanh thu trực tiếp bị ảnh hưởng. Sau khi chuyển sang kiến trúc retry-thông-minh với multi-vendor fallback, họ giảm 97% downtime và tiết kiệm 85% chi phí API.

Bài viết này là playbook thực chiến tôi đã áp dụng cho các đội ngũ production, từ việc chuyển đổi kiến trúc đến tối ưu chi phí với HolySheep AI.

Vì Sao Cần Retry Thông Minh và Multi-Vendor Fallback?

Khi xây dựng hệ thống AI production, có 3 vấn đề không thể tránh khỏi:

Chi phí khi không có fallback:

HolySheep AI là gì và Tại Sao Tôi Chuyển Đội Ngũ Qua?

HolySheep AI là AI API gateway tập trung với ưu điểm vượt trội:

Nếu bạn đang sử dụng API từ OpenAI hoặc Anthropic trực tiếp, chi phí sẽ cao hơn nhiều. Đăng ký tại đây để nhận ưu đãi và bắt đầu tiết kiệm ngay hôm nay.

Kiến Trúc Retry + Fallback Toàn Diện

1. Exponential Backoff - Chiến Lược Retry Thông Minh

Exponential backoff là kỹ thuật tăng thời gian chờ theo cấp số nhân sau mỗi lần thử thất bại. Thay vì retry liên tục (gây quá tải), ta chờ lâu hơn giữa các lần thử.

"""
HolySheep AI - Exponential Backoff Retry Client
Base URL: https://api.holysheep.ai/v1
"""

import time
import random
import logging
from typing import Optional, Dict, Any, Callable
from dataclasses import dataclass
from enum import Enum

logger = logging.getLogger(__name__)


class RetryStrategy(Enum):
    """Chiến lược retry khả dụng"""
    EXPONENTIAL = "exponential"
    LINEAR = "linear"
    FIBONACCI = "fibonacci"


@dataclass
class RetryConfig:
    """Cấu hình retry - tối ưu cho HolySheep API"""
    max_retries: int = 5
    base_delay: float = 0.5  # 500ms ban đầu
    max_delay: float = 30.0  # Tối đa 30 giây
    exponential_base: float = 2.0
    jitter: bool = True  # Thêm ngẫu nhiên để tránh thundering herd
    retry_on_status: tuple = (429, 500, 502, 503, 504)  # HTTP status cần retry


class HolySheepRetryClient:
    """
    Client với retry logic thông minh cho HolySheep AI API
    - Exponential backoff với jitter
    - Automatic fallback khi primary vendor fail
    - Circuit breaker pattern để tránh overload
    """
    
    def __init__(
        self,
        api_key: str,
        base_url: str = "https://api.holysheep.ai/v1",
        config: Optional[RetryConfig] = None
    ):
        self.api_key = api_key
        self.base_url = base_url.rstrip('/')
        self.config = config or RetryConfig()
        
        # Circuit breaker state
        self.failure_count = 0
        self.failure_threshold = 5
        self.circuit_open = False
        self.circuit_open_time = 0
        self.circuit_reset_timeout = 60  # 60 giây
        
        # Stats tracking
        self.stats = {
            'total_requests': 0,
            'successful_requests': 0,
            'retried_requests': 0,
            'fallback_requests': 0,
            'circuit_breaker_trips': 0
        }
    
    def _calculate_delay(self, attempt: int) -> float:
        """
        Tính toán delay với exponential backoff + jitter
        Công thức: min(max_delay, base_delay * (exponential_base ^ attempt)) + random_jitter
        """
        # Exponential backoff
        delay = self.config.base_delay * (self.config.exponential_base ** attempt)
        delay = min(delay, self.config.max_delay)
        
        # Thêm jitter (0.5x - 1.5x) để tránh thundering herd
        if self.config.jitter:
            jitter_range = delay * 0.5
            delay = delay + random.uniform(-jitter_range, jitter_range)
        
        # Đảm bảo không âm
        return max(0.1, delay)
    
    def _should_retry(self, status_code: int, attempt: int) -> bool:
        """Kiểm tra xem có nên retry không"""
        if attempt >= self.config.max_retries:
            return False
        if status_code in self.config.retry_on_status:
            return True
        # Retry on network errors (status_code = 0)
        if status_code == 0 and attempt < self.config.max_retries:
            return True
        return False
    
    def _update_circuit_breaker(self, success: bool):
        """Cập nhật circuit breaker state"""
        if success:
            self.failure_count = 0
            if self.circuit_open:
                # Thử đóng circuit
                time_since_open = time.time() - self.circuit_open_time
                if time_since_open >= self.circuit_reset_timeout:
                    self.circuit_open = False
                    logger.info("Circuit breaker closed - API responding normally")
        else:
            self.failure_count += 1
            if self.failure_count >= self.failure_threshold and not self.circuit_open:
                self.circuit_open = True
                self.circuit_open_time = time.time()
                self.stats['circuit_breaker_trips'] += 1
                logger.warning("Circuit breaker opened - too many failures")
    
    async def chat_completion_with_retry(
        self,
        messages: list,
        model: str = "gpt-4.1",
        **kwargs
    ) -> Dict[str, Any]:
        """
        Gọi chat completion với retry logic
        
        Args:
            messages: List of message dicts
            model: Model name (gpt-4.1, claude-sonnet-4.5, etc.)
            **kwargs: Các param khác (temperature, max_tokens, etc.)
        
        Returns:
            API response dict
        """
        self.stats['total_requests'] += 1
        
        # Check circuit breaker
        if self.circuit_open:
            time_since_open = time.time() - self.circuit_open_time
            if time_since_open < self.circuit_reset_timeout:
                logger.warning(f"Circuit breaker open, waiting {self.circuit_reset_timeout - time_since_open:.1f}s")
                raise Exception("Circuit breaker open - too many recent failures")
            else:
                # Thử lại
                self.circuit_open = False
                self.failure_count = 0
        
        last_error = None
        for attempt in range(self.config.max_retries + 1):
            try:
                response = await self._make_request(messages, model, attempt, **kwargs)
                self._update_circuit_breaker(True)
                self.stats['successful_requests'] += 1
                return response
                
            except Exception as e:
                last_error = e
                status_code = getattr(e, 'status_code', 0)
                
                logger.warning(
                    f"Attempt {attempt + 1}/{self.config.max_retries + 1} failed: {str(e)} "
                    f"(status: {status_code})"
                )
                
                if not self._should_retry(status_code, attempt):
                    self._update_circuit_breaker(False)
                    break
                
                self.stats['retried_requests'] += 1
                
                # Tính delay và chờ
                if attempt < self.config.max_retries:
                    delay = self._calculate_delay(attempt)
                    logger.info(f"Waiting {delay:.2f}s before retry...")
                    await self._async_sleep(delay)
        
        # Tất cả retry đều thất bại
        raise Exception(f"All retries exhausted. Last error: {last_error}")
    
    async def _make_request(
        self,
        messages: list,
        model: str,
        attempt: int,
        **kwargs
    ) -> Dict[str, Any]:
        """Thực hiện HTTP request đến HolySheep API"""
        import aiohttp
        
        url = f"{self.base_url}/chat/completions"
        headers = {
            "Authorization": f"Bearer {self.api_key}",
            "Content-Type": "application/json"
        }
        payload = {
            "model": model,
            "messages": messages,
            **kwargs
        }
        
        timeout = aiohttp.ClientTimeout(total=60)
        
        async with aiohttp.ClientSession(timeout=timeout) as session:
            async with session.post(url, json=payload, headers=headers) as response:
                if response.status == 200:
                    return await response.json()
                else:
                    error_body = await response.text()
                    raise APIError(
                        message=f"API request failed: {error_body}",
                        status_code=response.status,
                        attempt=attempt
                    )
    
    async def _async_sleep(self, seconds: float):
        """Async sleep wrapper"""
        import asyncio
        await asyncio.sleep(seconds)
    
    def get_stats(self) -> Dict[str, Any]:
        """Lấy thống kê retry"""
        total = self.stats['total_requests']
        return {
            **self.stats,
            'success_rate': f"{(self.stats['successful_requests'] / total * 100):.2f}%" if total > 0 else "N/A",
            'retry_rate': f"{(self.stats['retried_requests'] / total * 100):.2f}%" if total > 0 else "N/A"
        }


class APIError(Exception):
    """Custom exception cho API errors"""
    def __init__(self, message: str, status_code: int, attempt: int = 0):
        super().__init__(message)
        self.status_code = status_code
        self.attempt = attempt


============== USAGE EXAMPLE ==============

async def example_usage(): """Ví dụ sử dụng HolySheep retry client""" # Khởi tạo client client = HolySheepRetryClient( api_key="YOUR_HOLYSHEEP_API_KEY", config=RetryConfig( max_retries=5, base_delay=0.5, max_delay=30.0, jitter=True ) ) # Gọi API với retry tự động try: response = await client.chat_completion_with_retry( messages=[ {"role": "system", "content": "Bạn là trợ lý AI hữu ích."}, {"role": "user", "content": "Giải thích exponential backoff"} ], model="gpt-4.1", temperature=0.7, max_tokens=500 ) print(f"Success: {response['choices'][0]['message']['content']}") except Exception as e: print(f"Failed after all retries: {e}") # Xem stats print(f"Stats: {client.get_stats()}") if __name__ == "__main__": import asyncio asyncio.run(example_usage())

2. Multi-Vendor Fallback - Tự Động Chuyển Provider

Đây là phần quan trọng nhất. Khi vendor chính fail, ta cần tự động chuyển sang vendor backup mà không ảnh hưởng trải nghiệm user.

"""
HolySheep AI - Multi-Vendor Fallback Manager
Tự động chuyển đổi giữa các provider khi xảy ra lỗi
"""

import asyncio
import logging
from typing import List, Dict, Any, Optional, Tuple
from dataclasses import dataclass, field
from datetime import datetime, timedelta
from enum import Enum

logger = logging.getLogger(__name__)


class ProviderStatus(Enum):
    """Trạng thái provider"""
    HEALTHY = "healthy"
    DEGRADED = "degraded"
    UNHEALTHY = "unhealthy"
    MAINTENANCE = "maintenance"


@dataclass
class Provider:
    """Thông tin một provider AI"""
    name: str
    api_type: str  # 'openai', 'anthropic', 'google', 'deepseek', etc.
    base_url: str
    api_key: str
    priority: int = 1  # Priority càng thấp = càng được ưu tiên
    status: ProviderStatus = ProviderStatus.HEALTHY
    failure_count: int = 0
    last_failure: Optional[datetime] = None
    latency_p95: float = 0.0  # P95 latency in ms
    cost_per_1k_tokens: float = 0.0
    
    # Health check
    consecutive_health_checks: int = 0
    is_healthy_for_fallback: bool = True
    
    def get_effective_priority(self) -> int:
        """Tính priority có xét đến health status"""
        if not self.is_healthy_for_fallback:
            return self.priority + 100  # Giảm ưu tiên
        if self.status == ProviderStatus.DEGRADED:
            return self.priority + 10
        return self.priority


@dataclass 
class FallbackConfig:
    """Cấu hình fallback behavior"""
    health_check_interval: int = 30  # seconds
    unhealth_threshold: int = 3  # Số lần fail liên tiếp để mark unhealthy
    recovery_threshold: int = 2  # Số lần success để mark healthy
    max_fallback_depth: int = 5  # Tối đa bao nhiêu provider fallback
    enable_cost_based_routing: bool = True  # Chuyển sang provider rẻ hơn khi có vấn đề
    latency_sla_ms: float = 2000.0  # SLA latency


class MultiVendorFallbackManager:
    """
    Manager xử lý multi-vendor fallback
    - Health check định kỳ tất cả provider
    - Tự động fallback khi provider primary fail
    - Cost-based routing khi provider rẻ hơn có latency tốt
    """
    
    def __init__(self, config: Optional[FallbackConfig] = None):
        self.config = config or FallbackConfig()
        self.providers: Dict[str, Provider] = {}
        self.request_history: List[Dict[str, Any]] = []
        self.max_history = 1000
        
        # Stats
        self.stats = {
            'total_requests': 0,
            'successful_requests': 0,
            'failed_requests': 0,
            'fallback_events': 0,
            'provider_switches': {},
            'cost_savings_usd': 0.0
        }
    
    def add_provider(self, provider: Provider):
        """Đăng ký một provider mới"""
        self.providers[provider.name] = provider
        logger.info(f"Added provider: {provider.name} (priority: {provider.priority})")
    
    def add_holy_sheep(self, api_key: str, models: List[str] = None):
        """
        Thêm HolySheep như gateway chính
        HolySheep cung cấp unified access đến nhiều provider
        """
        holy_sheep = Provider(
            name="holysheep-primary",
            api_type="gateway",
            base_url="https://api.holysheep.ai/v1",
            api_key=api_key,
            priority=1,
            cost_per_1k_tokens=0.0,  # Tính sau
            status=ProviderStatus.HEALTHY
        )
        self.add_provider(holy_sheep)
        
        # Thêm các model variants
        if models:
            for i, model in enumerate(models):
                self.providers[f"holysheep-{model}"] = Provider(
                    name=f"holysheep-{model}",
                    api_type="gateway-model",
                    base_url="https://api.holysheep.ai/v1",
                    api_key=api_key,
                    priority=2 + i,  # Backup sau primary
                    cost_per_1k_tokens=self._get_model_cost(model)
                )
    
    def _get_model_cost(self, model: str) -> float:
        """Lấy cost per 1M tokens - HolySheep pricing 2026"""
        costs = {
            'gpt-4.1': 8.0,
            'claude-sonnet-4.5': 15.0,
            'gemini-2.5-flash': 2.50,
            'deepseek-v3.2': 0.42
        }
        return costs.get(model, 5.0)
    
    def get_sorted_providers(self) -> List[Provider]:
        """Lấy danh sách provider theo priority và health"""
        return sorted(
            self.providers.values(),
            key=lambda p: (p.get_effective_priority(), p.latency_p95)
        )
    
    def get_fallback_chain(
        self, 
        exclude: List[str] = None,
        max_cost: float = None
    ) -> List[Provider]:
        """
        Lấy chain của provider để fallback
        
        Args:
            exclude: List provider name cần loại trừ
            max_cost: Max cost per 1M tokens
        
        Returns:
            List provider theo thứ tự fallback
        """
        exclude = exclude or []
        chain = []
        
        for provider in self.get_sorted_providers():
            if provider.name in exclude:
                continue
            if not provider.is_healthy_for_fallback:
                continue
            if max_cost and provider.cost_per_1k_tokens > max_cost:
                continue
            
            chain.append(provider)
            
            if len(chain) >= self.config.max_fallback_depth:
                break
        
        return chain
    
    async def execute_with_fallback(
        self,
        request_func: callable,
        model: str = None,
        context: str = None,
        **kwargs
    ) -> Tuple[Any, Provider]:
        """
        Thực thi request với automatic fallback
        
        Args:
            request_func: Function nhận provider và trả về response
            model: Model name (nếu cần chỉ định)
            context: Request context cho logging
        
        Returns:
            (response, used_provider)
        """
        self.stats['total_requests'] += 1
        last_error = None
        used_provider = None
        fallback_chain = self.get_fallback_chain()
        
        for provider in fallback_chain:
            try:
                logger.info(
                    f"Trying provider: {provider.name} "
                    f"(priority: {provider.priority}, latency_p95: {provider.latency_p95:.0f}ms)"
                )
                
                # Thực hiện request
                start_time = datetime.now()
                response = await request_func(provider, model, **kwargs)
                latency_ms = (datetime.now() - start_time).total_seconds() * 1000
                
                # Update stats
                self._record_success(provider, latency_ms)
                used_provider = provider
                
                logger.info(
                    f"✓ Success with {provider.name} "
                    f"(latency: {latency_ms:.0f}ms)"
                )
                
                # Check if should switch to cheaper provider
                if self.config.enable_cost_based_routing:
                    await self._check_cost_rerouting(provider, latency_ms)
                
                return response, provider
                
            except Exception as e:
                last_error = e
                self._record_failure(provider)
                self.stats['fallback_events'] += 1
                
                logger.warning(
                    f"✗ {provider.name} failed: {str(e)}. "
                    f"Falling back to next provider..."
                )
                
                # Continue to next provider in chain
                continue
        
        # Tất cả provider đều fail
        self.stats['failed_requests'] += 1
        raise MultiVendorFallbackError(
            f"All providers exhausted. Last error: {last_error}",
            attempted_providers=[p.name for p in fallback_chain]
        )
    
    def _record_success(self, provider: Provider, latency_ms: float):
        """Ghi nhận thành công"""
        provider.consecutive_health_checks += 1
        provider.failure_count = 0
        provider.is_healthy_for_fallback = True
        provider.latency_p95 = latency_ms * 1.2  # Ước tính P95
        
        if provider.consecutive_health_checks >= self.config.recovery_threshold:
            provider.status = ProviderStatus.HEALTHY
        
        self.stats['successful_requests'] += 1
        self._add_to_history(provider.name, 'success', latency_ms)
    
    def _record_failure(self, provider: Provider):
        """Ghi nhận thất bại"""
        provider.failure_count += 1
        provider.consecutive_health_checks = 0
        provider.last_failure = datetime.now()
        
        if provider.failure_count >= self.config.unhealth_threshold:
            provider.is_healthy_for_fallback = False
            provider.status = ProviderStatus.UNHEALTHY
            logger.warning(f"Provider {provider.name} marked as unhealthy")
    
    async def _check_cost_rerouting(
        self, 
        current: Provider,
        latency_ms: float
    ):
        """Kiểm tra xem có nên chuyển sang provider rẻ hơn không"""
        if latency_ms <= self.config.latency_sla_ms:
            # Latency tốt, kiểm tra option rẻ hơn
            cheaper = self._find_cheaper_healthy_provider(current)
            if cheaper:
                savings = current.cost_per_1k_tokens - cheaper.cost_per_1k_tokens
                if savings > 0:
                    # Log potential savings
                    logger.info(
                        f"Cheaper provider available: {cheaper.name} "
                        f"(savings: ${savings:.2f}/1M tokens)"
                    )
    
    def _find_cheaper_healthy_provider(
        self, 
        current: Provider
    ) -> Optional[Provider]:
        """Tìm provider rẻ hơn và vẫn healthy"""
        for provider in self.get_sorted_providers():
            if (provider.cost_per_1k_tokens < current.cost_per_1k_tokens
                and provider.is_healthy_for_fallback
                and provider.name != current.name):
                return provider
        return None
    
    def _add_to_history(
        self, 
        provider_name: str, 
        status: str, 
        latency_ms: float
    ):
        """Thêm vào request history"""
        self.request_history.append({
            'timestamp': datetime.now().isoformat(),
            'provider': provider_name,
            'status': status,
            'latency_ms': latency_ms
        })
        
        # Trim history
        if len(self.request_history) > self.max_history:
            self.request_history = self.request_history[-self.max_history:]
    
    def get_stats(self) -> Dict[str, Any]:
        """Lấy thống kê fallback"""
        return {
            **self.stats,
            'success_rate': (
                f"{self.stats['successful_requests'] / self.stats['total_requests'] * 100:.2f}%"
                if self.stats['total_requests'] > 0 else "N/A"
            ),
            'fallback_rate': (
                f"{self.stats['fallback_events'] / self.stats['total_requests'] * 100:.2f}%"
                if self.stats['total_requests'] > 0 else "N/A"
            ),
            'providers': {
                name: {
                    'status': p.status.value,
                    'is_healthy': p.is_healthy_for_fallback,
                    'latency_p95_ms': p.latency_p95,
                    'failure_count': p.failure_count
                }
                for name, p in self.providers.items()
            }
        }


class MultiVendorFallbackError(Exception):
    """Exception khi tất cả provider đều fail"""
    def __init__(self, message: str, attempted_providers: List[str]):
        super().__init__(message)
        self.attempted_providers = attempted_providers


============== COMPLETE INTEGRATION EXAMPLE ==============

async def complete_example(): """ Ví dụ hoàn chỉnh: Multi-vendor fallback với HolySheep """ # 1. Khởi tạo manager manager = MultiVendorFallbackManager( config=FallbackConfig( max_fallback_depth=5, enable_cost_based_routing=True, latency_sla_ms=2000.0 ) ) # 2. Thêm HolySheep làm primary gateway manager.add_holy_sheep( api_key="YOUR_HOLYSHEEP_API_KEY", models=['gpt-4.1', 'claude-sonnet-4.5', 'deepseek-v3.2'] ) # 3. Thêm provider backup khác (nếu cần) # manager.add_provider(Provider(...)) # 4. Define request function async def make_request(provider: Provider, model: str, messages: list, **kwargs): import aiohttp url = f"{provider.base_url}/chat/completions" headers = { "Authorization": f"Bearer {provider.api_key}", "Content-Type": "application/json" } payload = { "model": model, "messages": messages, **kwargs } async with aiohttp.ClientSession() as session: async with session.post(url, json=payload, headers=headers) as response: if response.status == 200: return await response.json() else: raise Exception(f"HTTP {response.status}: {await response.text()}") # 5. Execute với automatic fallback try: messages = [ {"role": "user", "content": "Giải thích multi-vendor fallback"} ] response, provider = await manager.execute_with_fallback( request_func=make_request, model="gpt-4.1", messages=messages, temperature=0.7 ) print(f"Success! Used provider: {provider.name}") print(f"Response: {response['choices'][0]['message']['content']}") except MultiVendorFallbackError as e: print(f"All providers failed: {e}") print(f"Attempted: {e.attempted_providers}") # 6. Xem stats print(f"\nStats: {manager.get_stats()}") if __name__ == "__main__": asyncio.run(complete_example())

3. Circuit Breaker Pattern - Ngăn Chặn Cascade Failure

Circuit breaker là pattern giúp ngăn chặn cascade failure - khi một provider fail quá nhiều, ta "ngắt mạch" để không gửi request nữa trong một khoảng thời gian.

"""
Circuit Breaker Implementation cho AI API Gateway
Bảo vệ hệ thống khỏi cascade failure
"""

import time
from enum import Enum
from dataclasses import dataclass
from typing import Callable, Any, Optional
import threading


class CircuitState(Enum):
    """Trạng thái circuit breaker"""
    CLOSED = "closed"     # Bình thường - request đi qua
    OPEN = "open"         # Mở - request bị reject ngay
    HALF_OPEN = "half_open"  # Thử lại - cho phép 1 request test


@dataclass
class CircuitBreakerConfig:
    """Cấu hình circuit breaker"""
    failure_threshold: int = 5      # Số lần fail để mở circuit
    success_threshold: int = 2       # Số lần success để đóng circuit (từ HALF_OPEN)
    timeout: float = 60.0            # Thời gian chờ trước khi thử lại (giây)
    excluded_exceptions: tuple = ()  # Exception không tính là failure


class CircuitBreaker:
    """
    Circuit Breaker Implementation
    
    States:
    - CLOSED: Bình thường, request đi qua
    - OPEN: Fail quá nhiều, reject tất cả request
    - HALF_OPEN: Thử nghiệm, nếu success -> CLOSED, fail -> OPEN
    """
    
    def __init__(self, name: str, config: Optional[CircuitBreakerConfig] = None):
        self.name = name
        self.config = config or CircuitBreakerConfig()
        
        self._state = CircuitState.CLOSED
        self._failure_count = 0
        self._success_count = 0
        self._last_failure_time: Optional[float] = None
        self._lock = threading.RLock()
        
        # Metrics
        self.metrics = {
            'total_calls': 0,
            'successful_calls': 0,
            'failed_calls': 0,
            'rejected_calls': 0,
            'state_changes': []
        }
    
    @property
    def state(self) -> CircuitState:
        """Lấy trạng thái hiện tại"""
        with self._lock:
            if self._state == CircuitState.OPEN:
                # Kiểm tra timeout
                if self._should_attempt_reset():
                    self._transition_to(CircuitState.HALF_OPEN)
            return self._state
    
    def _should_attempt_reset(self) -> bool:
        """Kiểm tra xem có nên thử reset không"""
        if self._last_failure_time is None:
            return True
        elapsed = time.time() - self._last_failure_time
        return elapsed >= self.config.timeout
    
    def _transition_to(self, new_state: CircuitState):
        """Chuyển trạng thái"""
        old_state = self._state
        self._state = new_state
        self.metrics['state_changes'].append({
            'from': old_state.value,
            'to': new_state.value,
            'timestamp': time.time()
        })
        
        if new_state == CircuitState.HALF_OPEN:
            self._success_count = 0
        elif new_state == CircuitState.CLOSED:
            self._failure_count = 0
    
    def call(self, func: Callable, *args, **kwargs) -> Any:
        """
        Execute function với circuit breaker protection
        
        Args:
            func: Function cần gọi
            *args, **kwargs: Arguments cho function
        
        Returns:
            Function result
        
        Raises:
            CircuitOpenError: Khi circuit đang OPEN
        """
        self.metrics['total_calls'] += 1
        
        # Check circuit state
        current_state = self.state
        
        if