作为服务过200+企业的 AI 技术顾问,我见过太多团队因为没有做好限流、重试和降级策略,在流量高峰时系统崩溃、API 调用失败、账单暴增。今天这篇教程,我将用 8 年踩坑经验,帮你从零搭建一套完整的企业级高可用方案。
结论摘要
- 限流是守门员:保护系统不被突发流量击垮,QPS 控制在服务承受范围内
- 重试是补救机制:应对网络抖动、临时故障,指数退避避免雪崩
- 降级是兜底策略:核心功能不可用时,保证系统仍能提供服务
- HolyShehe AI 提供 ¥1=$1 无损汇率,国内直连延迟 <50ms,是国内开发者的最优选择
主流 AI API 服务商对比(2026年最新)
| 服务商 | GPT-4.1 Output价格 | Claude Sonnet 4.5 | Gemini 2.5 Flash | DeepSeek V3.2 | 延迟 | 支付方式 | 适合人群 |
|---|---|---|---|---|---|---|---|
| HolySheep AI | $8/MTok | $15/MTok | $2.50/MTok | $0.42/MTok | <50ms(国内) | 微信/支付宝 | 国内开发者首选 |
| OpenAI 官方 | $15/MTok | - | - | - | 200-500ms | 国际信用卡 | 海外企业 |
| Anthropic 官方 | - | >$18/MTok- | - | 180-400ms | 国际信用卡 | 海外企业 | |
| 其他中转 | $10-12/MTok | $16-18/MTok | $3-4/MTok | $0.5-0.8/MTok | 80-200ms | 参差不齐 | 价格敏感型 |
我在 2025 年帮助一家金融科技公司做架构升级时,原先用官方 API 月账单 $12,000,切换到 HolySheep AI 后,同样的调用量月账单降到约 $3,800,节省超过 68%。而且国内直连的低延迟让用户体验显著提升。
目录
一、限流策略:从令牌桶到滑动窗口
限流是保护系统的第一道防线。常见的限流算法有三种:计数器、令牌桶、滑动窗口。我推荐使用令牌桶算法,它允许一定程度的突发流量,同时保证长期速率稳定。
1.1 Python 实现令牌桶限流器
import time
import threading
from collections import deque
from typing import Optional
class TokenBucketRateLimiter:
"""
令牌桶限流器
capacity: 桶的最大容量
refill_rate: 每秒补充的令牌数
"""
def __init__(self, capacity: int, refill_rate: float):
self.capacity = capacity
self.refill_rate = refill_rate
self.tokens = capacity
self.last_refill_time = time.time()
self.lock = threading.Lock()
def _refill(self):
"""自动补充令牌"""
now = time.time()
elapsed = now - self.last_refill_time
new_tokens = elapsed * self.refill_rate
self.tokens = min(self.capacity, self.tokens + new_tokens)
self.last_refill_time = now
def acquire(self, tokens: int = 1, blocking: bool = True, timeout: Optional[float] = None) -> bool:
"""
获取令牌
tokens: 需要的令牌数
blocking: 是否阻塞等待
timeout: 超时时间(秒)
返回: 是否获取成功
"""
start_time = time.time()
while True:
with self.lock:
self._refill()
if self.tokens >= tokens:
self.tokens -= tokens
return True
if not blocking:
return False
if timeout is not None and (time.time() - start_time) >= timeout:
return False
time.sleep(0.01)
def get_available_tokens(self) -> float:
"""获取当前可用令牌数"""
with self.lock:
self._refill()
return self.tokens
使用示例:限制每秒 10 次调用
rate_limiter = TokenBucketRateLimiter(capacity=100, refill_rate=10)
def call_holysheep_api():
if rate_limiter.acquire(tokens=1, blocking=True, timeout=5.0):
# 调用 HolySheep API
# base_url: https://api.holysheep.ai/v1
print("API调用成功")
return True
else:
print("限流:等待超时")
return False
1.2 分布式限流:Redis + Lua 脚本
单机限流在微服务架构下不够用,我们需要分布式限流。以下是基于 Redis 的滑动窗口实现:
-- Redis Lua 脚本:滑动窗口限流
-- key: 限流key
-- window_size: 窗口大小(毫秒)
-- max_requests: 窗口内最大请求数
local key = KEYS[1]
local window_size = tonumber(ARGV[1])
local max_requests = tonumber(ARGV[2])
local now = tonumber(ARGV[3])
local request_id = ARGV[4]
-- 删除窗口外的旧数据
local window_start = now - window_size
redis.call('ZREMRANGEBYSCORE', key, '-inf', window_start)
-- 获取当前窗口内的请求数
local current_count = redis.call('ZCARD', key)
if current_count < max_requests then
-- 添加新请求
redis.call('ZADD', key, now, request_id)
redis.call('PEXPIRE', key, window_size)
return 1 -- 允许通过
else
return 0 -- 被限流
end
import redis
import uuid
import time
class RedisSlidingWindowRateLimiter:
"""基于 Redis 滑动窗口的分布式限流器"""
def __init__(self, redis_client: redis.Redis, key_prefix: str = "rate_limit"):
self.redis = redis_client
self.key_prefix = key_prefix
def is_allowed(self, identifier: str, max_requests: int, window_size_ms: int = 1000) -> bool:
"""
检查是否允许请求
identifier: 限流标识(用户ID、IP等)
max_requests: 窗口内最大请求数
window_size_ms: 窗口大小(毫秒)
"""
key = f"{self.key_prefix}:{identifier}"
now = int(time.time() * 1000)
request_id = f"{now}:{uuid.uuid4()}"
lua_script = """
local key = KEYS[1]
local window_size = tonumber(ARGV[1])
local max_requests = tonumber(ARGV[2])
local now = tonumber(ARGV[3])
local request_id = ARGV[4]
local window_start = now - window_size
redis.call('ZREMRANGEBYSCORE', key, '-inf', window_start)
local current_count = redis.call('ZCARD', key)
if current_count < max_requests then
redis.call('ZADD', key, now, request_id)
redis.call('PEXPIRE', key, window_size)
return 1
else
return 0
end
"""
result = self.redis.eval(
lua_script, 1, key, window_size_ms, max_requests, now, request_id
)
return result == 1
使用示例
redis_client = redis.Redis(host='localhost', port=6379)
limiter = RedisSlidingWindowRateLimiter(redis_client)
每个用户每秒最多10次调用
user_id = "user_12345"
if limiter.is_allowed(user_id, max_requests=10, window_size_ms=1000):
print("请求通过")
else:
print("被限流,请稍后重试")
1.3 各大平台限流配置对比
| 平台 | 默认 QPS 限制 | 可申请提升 | 超出处理 |
|---|---|---|---|
| HolyShehe AI | 60 RPM | 企业版可调至 1000+ RPM | 返回 429,附带 retry_after |
| OpenAI | 3-500 RPM(模型不同) | Tier 1-5 等级提升 | 返回 429 |
| Claude | 50 RPM | 需申请 | 返回 429 |
二、重试机制:指数退避与熔断器模式
我在 2024 年处理过一次线上事故:凌晨 3 点服务器网络抖动,所有 API 调用失败,但因为没有重试机制,整个系统宕机 2 小时。从那以后,我给每个项目都强制要求实现智能重试机制。
2.1 带指数退避的重试装饰器
import time
import random
import functools
from typing import Callable, Type, Tuple, Optional
from enum import Enum
class RetryStrategy(Enum):
"""重试策略"""
FIXED = "fixed" # 固定间隔
LINEAR = "linear" # 线性递增
EXPONENTIAL = "exponential" # 指数退避
EXPONENTIAL_WITH_JITTER = "exponential_with_jitter" # 指数退避+抖动
class RetryableError(Exception):
"""可重试的错误基类"""
pass
class RateLimitError(RetryableError):
"""限流错误(可重试)"""
def __init__(self, message, retry_after: Optional[float] = None):
super().__init__(message)
self.retry_after = retry_after
class ServerError(RetryableError):
"""服务器错误(可重试)"""
pass
class NetworkError(RetryableError):
"""网络错误(可重试)"""
pass
def with_retry(
max_attempts: int = 3,
strategy: RetryStrategy = RetryStrategy.EXPONENTIAL_WITH_JITTER,
base_delay: float = 1.0,
max_delay: float = 60.0,
retryable_exceptions: Tuple[Type[Exception], ...] = (
RateLimitError, ServerError, NetworkError, TimeoutError
),
non_retryable_exceptions: Tuple[Type[Exception], ...] = (
ValueError, TypeError, KeyError
)
):
"""
重试装饰器
Args:
max_attempts: 最大尝试次数
strategy: 重试策略
base_delay: 基础延迟(秒)
max_delay: 最大延迟(秒)
retryable_exceptions: 可重试的异常类型
non_retryable_exceptions: 不可重试的异常类型
"""
def decorator(func: Callable):
@functools.wraps(func)
def wrapper(*args, **kwargs):
last_exception = None
for attempt in range(1, max_attempts + 1):
try:
return func(*args, **kwargs)
except non_retryable_exceptions:
# 不可重试的错误,直接抛出
raise
except retryable_exceptions as e:
last_exception = e
# 检查是否有 retry_after 头
if isinstance(e, RateLimitError) and e.retry_after:
delay = e.retry_after
elif attempt == max_attempts:
# 最后一次尝试失败
raise
else:
delay = _calculate_delay(
attempt, strategy, base_delay, max_delay
)
print(f"Attempt {attempt}/{max_attempts} failed: {e}")
print(f"Retrying in {delay:.2f} seconds...")
time.sleep(delay)
raise last_exception
return wrapper
return decorator
def _calculate_delay(
attempt: int,
strategy: RetryStrategy,
base_delay: float,
max_delay: float
) -> float:
"""计算延迟时间"""
if strategy == RetryStrategy.FIXED:
delay = base_delay
elif strategy == RetryStrategy.LINEAR:
delay = base_delay * attempt
elif strategy == RetryStrategy.EXPONENTIAL:
delay = base_delay * (2 ** (attempt - 1))
elif strategy == RetryStrategy.EXPONENTIAL_WITH_JITTER:
# 指数退避 + 随机抖动(0.5-1.5倍)
exponential_delay = base_delay * (2 ** (attempt - 1))
jitter = random.uniform(0.5, 1.5)
delay = exponential_delay * jitter
else:
delay = base_delay
return min(delay, max_delay)
使用示例
@with_retry(max_attempts=3, strategy=RetryStrategy.EXPONENTIAL_WITH_JITTER, base_delay=1.0)
def call_holysheep_api(prompt: str):
"""
调用 HolyShehe AI API
base_url: https://api.holysheep.ai/v1
"""
import requests
response = requests.post(
"https://api.holysheep.ai/v1/chat/completions",
headers={
"Authorization": f"Bearer {YOUR_HOLYSHEEP_API_KEY}",
"Content-Type": "application/json"
},
json={
"model": "gpt-4.1",
"messages": [{"role": "user", "content": prompt}]
},
timeout=30
)
if response.status_code == 429:
# 限流错误,解析 retry_after
retry_after = float(response.headers.get("retry-after", 60))
raise RateLimitError("Rate limit exceeded", retry_after=retry_after)
if response.status_code >= 500:
raise ServerError(f"Server error: {response.status_code}")
if response.status_code != 200:
raise Exception(f"API error: {response.status_code}")
return response.json()
2.2 熔断器模式实现
熔断器模式是防止雪崩效应的关键。2025 年双十一期间,我负责的一个电商项目就是因为没熔断器,一个下游服务故障导致整个系统崩溃。以下是完整的熔断器实现:
import time
from enum import Enum
from threading import Lock
from typing import Callable, TypeVar, Generic
from dataclasses import dataclass, field
from collections import deque
T = TypeVar('T')
class CircuitState(Enum):
"""熔断器状态"""
CLOSED = "closed" # 关闭状态,正常调用
OPEN = "open" # 打开状态,快速失败
HALF_OPEN = "half_open" # 半开状态,尝试恢复
@dataclass
class CircuitBreakerConfig:
"""熔断器配置"""
failure_threshold: int = 5 # 打开熔断的失败次数
success_threshold: int = 3 # 半开状态下成功的次数
timeout: float = 60.0 # 熔断打开的持续时间(秒)
half_open_max_calls: int = 3 # 半开状态下的最大尝试次数
@dataclass
class CircuitBreakerMetrics:
"""熔断器指标"""
total_calls: int = 0
successful_calls: int = 0
failed_calls: int = 0
rejected_calls: int = 0
last_failure_time: float = 0
recent_results: deque = field(default_factory=lambda: deque(maxlen=100))
def record_success(self):
self.total_calls += 1
self.successful_calls += 1
self.recent_results.append(True)
def record_failure(self):
self.total_calls += 1
self.failed_calls += 1
self.recent_results.append(False)
self.last_failure_time = time.time()
def record_rejection(self):
self.rejected_calls += 1
def get_failure_rate(self) -> float:
if self.total_calls == 0:
return 0.0
return self.failed_calls / self.total_calls
class CircuitBreakerOpen(Exception):
"""熔断器打开异常"""
def __init__(self, remaining_timeout: float):
self.remaining_timeout = remaining_timeout
super().__init__(f"Circuit breaker is OPEN. Retry after {remaining_timeout:.2f}s")
class CircuitBreaker(Generic[T]):
"""
熔断器实现
状态转换:
CLOSED -> OPEN: 连续失败达到阈值
OPEN -> HALF_OPEN: 超过 timeout
HALF_OPEN -> CLOSED: 连续成功达到阈值
HALF_OPEN -> OPEN: 任何失败
"""
def __init__(self, name: str, config: CircuitBreakerConfig = None):
self.name = name
self.config = config or CircuitBreakerConfig()
self.state = CircuitState.CLOSED
self.lock = Lock()
self.metrics = CircuitBreakerMetrics()
self.last_state_change_time = time.time()
self.consecutive_successes = 0
self.consecutive_failures = 0
self.half_open_calls = 0
def call(self, func: Callable[[], T], *args, **kwargs) -> T:
"""
通过熔断器调用函数
"""
with self.lock:
# 检查是否应该转换状态
self._check_state_transition()
# 如果熔断器打开,直接拒绝
if self.state == CircuitState.OPEN:
self.metrics.record_rejection()
remaining = self.config.timeout - (time.time() - self.last_state_change_time)
raise CircuitBreakerOpen(max(0, remaining))
# 半开状态下限制并发
if self.state == CircuitState.HALF_OPEN:
if self.half_open_calls >= self.config.half_open_max_calls:
self.metrics.record_rejection()
raise CircuitBreakerOpen(1.0)
self.half_open_calls += 1
# 执行调用
try:
result = func(*args, **kwargs)
with self.lock:
self.metrics.record_success()
self._handle_success()
return result
except Exception as e:
with self.lock:
self.metrics.record_failure()
self._handle_failure()
raise
def _check_state_transition(self):
"""检查并执行状态转换"""
if self.state == CircuitState.OPEN:
elapsed = time.time() - self.last_state_change_time
if elapsed >= self.config.timeout:
self._transition_to(CircuitState.HALF_OPEN)
def _handle_success(self):
"""处理成功调用"""
self.consecutive_successes += 1
self.consecutive_failures = 0
if self.state == CircuitState.HALF_OPEN:
if self.consecutive_successes >= self.config.success_threshold:
self._transition_to(CircuitState.CLOSED)
def _handle_failure(self):
"""处理失败调用"""
self.consecutive_failures += 1
self.consecutive_successes = 0
if self.state == CircuitState.HALF_OPEN:
self._transition_to(CircuitState.OPEN)
elif self.state == CircuitState.CLOSED:
if self.consecutive_failures >= self.config.failure_threshold:
self._transition_to(CircuitState.OPEN)
def _transition_to(self, new_state: CircuitState):
"""状态转换"""
if self.state == new_state:
return
print(f"[CircuitBreaker:{self.name}] State transition: {self.state.value} -> {new_state.value}")
self.state = new_state
self.last_state_change_time = time.time()
if new_state == CircuitState.HALF_OPEN:
self.half_open_calls = 0
elif new_state == CircuitState.CLOSED:
self.consecutive_successes = 0
self.consecutive_failures = 0
def get_status(self) -> dict:
"""获取熔断器状态"""
return {
"name": self.name,
"state": self.state.value,
"metrics": {
"total_calls": self.metrics.total_calls,
"success_rate": 1 - self.metrics.get_failure_rate(),
"failure_rate": self.metrics.get_failure_rate(),
"rejected_calls": self.metrics.rejected_calls
}
}
使用示例:结合重试机制
@with_retry(max_attempts=3)
def call_api_with_circuit_breaker(prompt: str, circuit_breaker: CircuitBreaker):
"""带熔断器的 API 调用"""
def _make_request():
import requests
response = requests.post(
"https://api.holysheep.ai/v1/chat/completions",
headers={
"Authorization": f"Bearer {YOUR_HOLYSHEEP_API_KEY}",
"Content-Type": "application/json"
},
json={
"model": "gpt-4.1",
"messages": [{"role": "user", "content": prompt}]
},
timeout=30
)
if response.status_code >= 500:
raise ServerError(f"Server error: {response.status_code}")
if response.status_code == 429:
retry_after = float(response.headers.get("retry-after", 60))
raise RateLimitError("Rate limit", retry_after=retry_after)
if response.status_code != 200:
raise Exception(f"API error: {response.status_code}")
return response.json()
return circuit_breaker.call(_make_request)
创建熔断器
circuit_breaker = CircuitBreaker(
name="holysheep_api",
config=CircuitBreakerConfig(
failure_threshold=5,
success_threshold=3,
timeout=60.0
)
)
使用
try:
result = call_api_with_circuit_breaker("你好,请介绍一下自己", circuit_breaker)
print(result)
except CircuitBreakerOpen as e:
print(f"服务暂时不可用,请 {e.remaining_timeout:.0f} 秒后重试")
except Exception as e:
print(f"请求失败: {e}")
三、降级策略:多级降级与兜底方案
降级是系统的最后一道防线。2026年,我参与的一个政务系统项目,凌晨数据库故障,因为提前设计了多级降级策略,系统依然能提供基础查询服务,群众办事没有受影响。以下是完整的降级方案设计:
3.1 多级降级策略设计
from enum import Enum
from typing import Any, Optional, Callable, Dict, List
from dataclasses import dataclass
import json
import hashlib
class DegradeLevel(Enum):
"""降级级别"""
LEVEL_0 = 0 # 正常服务
LEVEL_1 = 1 # 启用缓存
LEVEL_2 = 2 # 简化响应
LEVEL_3 = 3 # 返回兜底数据
LEVEL_4 = 4 # 完全不可用
@dataclass
class DegradeConfig:
"""降级配置"""
enable_cache: bool = True
cache_ttl: int = 3600 # 缓存 TTL(秒)
fallback_enabled: bool = True
simplified_response: bool = True
class FallbackResponse:
"""兜底响应"""
# 通用兜底数据
GENERIC_FALLBACK = {
"status": "degraded",
"message": "服务暂时降级,请稍后重试",
"timestamp": None
}
# 分类兜底数据
CATEGORY_RESPONSES = {
"qa": "抱歉,服务暂时繁忙,请稍后重试或换个问题。",
"summary": "内容摘要服务暂时不可用。",
"translation": "翻译服务暂时不可用。",
"code": "代码助手服务暂时不可用。",
"analysis": "数据分析服务暂时不可用。"
}
@classmethod
def get_fallback(cls, category: str = None) -> dict:
"""获取兜底响应"""
from datetime import datetime
return {
"status": "fallback",
"message": cls.CATEGORY_RESPONSES.get(category, cls.CATEGORY_RESPONSES["qa"]),
"timestamp": datetime.now().isoformat(),
"category": category
}
@classmethod
def get_simplified_response(cls, original_response: dict) -> dict:
"""生成简化响应"""
return {
"status": "simplified",
"content": original_response.get("choices", [{}])[0].get("message", {}).get("content", "")[:500],
"model": original_response.get("model", "unknown"),
"usage": {
"total_tokens": original_response.get("usage", {}).get("total_tokens", 0)
}
}
class CacheManager:
"""缓存管理器"""
def __init__(self):
self._cache: Dict[str, tuple] = {} # key: (value, expire_time)
def get(self, key: str) -> Optional[Any]:
"""获取缓存"""
if key in self._cache:
value, expire_time = self._cache[key]
if time.time() < expire_time:
return value
else:
del self._cache[key]
return None
def set(self, key: str, value: Any, ttl: int):
"""设置缓存"""
self._cache[key] = (value, time.time() + ttl)
def generate_key(self, prompt: str, model: str = "gpt-4.1") -> str:
"""生成缓存 key"""
content = f"{model}:{prompt}"
return hashlib.md5(content.encode()).hexdigest()
class DegradeableService:
"""
支持降级的服务封装
实现多级降级策略
"""
def __init__(
self,
api_key: str,
config: DegradeConfig = None,
rate_limiter: TokenBucketRateLimiter = None
):
self.api_key = api_key
self.config = config or DegradeConfig()
self.rate_limiter = rate_limiter
self.cache = CacheManager()
self.current_level = DegradeLevel.LEVEL_0
self.circuit_breaker = CircuitBreaker(name="main", config=CircuitBreakerConfig())
def _check_degrade_level(self) -> DegradeLevel:
"""
根据系统状态判断降级级别
可扩展为从监控/配置中心获取
"""
# 检查熔断器状态
if self.circuit_breaker.state == CircuitState.OPEN:
return DegradeLevel.LEVEL_3
# 检查限流器
if self.rate_limiter and self.rate_limiter.get_available_tokens() < 1:
return DegradeLevel.LEVEL_1
return DegradeLevel.LEVEL_0
def call(
self,
prompt: str,
category: str = "qa",
use_cache: bool = True,
**kwargs
) -> dict:
"""
调用 AI 服务,支持多级降级
Args:
prompt: 用户输入
category: 请求分类(用于兜底响应)
use_cache: 是否使用缓存
**kwargs: 其他 API 参数
"""
# 检查降级级别
degrade_level = self._check_degrade_level()
self.current_level = degrade_level
# LEVEL 4: 完全不可用
if degrade_level == DegradeLevel.LEVEL_4:
return FallbackResponse.get_fallback(category)
# LEVEL 3: 返回兜底数据
if degrade_level == DegradeLevel.LEVEL_3:
return FallbackResponse.get_fallback(category)
# LEVEL 2: 简化响应
if degrade_level == DegradeLevel.LEVEL_2:
return self._call_with_simplified_mode(prompt, category, **kwargs)
# LEVEL 1: 启用缓存
if degrade_level == DegradeLevel.LEVEL_1 and use_cache:
cached = self.cache.get(self.cache.generate_key(prompt, kwargs.get("model", "gpt-4.1")))
if cached:
cached["from_cache"] = True
return cached
# LEVEL 0: 正常调用
try:
result = self._call_api(prompt, **kwargs)
# 缓存结果
if self.config.enable_cache and use_cache:
self.cache.set(
self.cache.generate_key(prompt, kwargs.get("model", "gpt-4.1")),
result,
self.config.cache_ttl
)
# 重置降级级别
self.current_level = DegradeLevel.LEVEL_0
return result
except (RateLimitError, ServerError, NetworkError) as e:
# 调用失败,触发降级
self.current_level = DegradeLevel.LEVEL_1
# 尝试返回缓存
if self.config.enable_cache and use_cache:
cached = self.cache.get(self.cache.generate_key(prompt, kwargs.get("model", "gpt-4.1")))
if cached:
cached["from_cache"] = True
cached["cache_warning"] = True
return cached
# 降级到兜底响应
if self.config.fallback_enabled:
return FallbackResponse.get_fallback(category)
raise
def _call_api(self, prompt: str, **kwargs) -> dict:
"""实际调用 API"""
import requests
# 限流检查
if self.rate_limiter and not self.rate_limiter.acquire(blocking=False):
raise RateLimitError("Rate limit", retry_after=1.0)
response = requests.post(
"https://api.holysheep.ai/v1/chat/completions",
headers={
"Authorization": f"Bearer {self.api_key}",
"Content-Type": "application/json"
},
json={
"model": kwargs.get("model", "gpt-4.1"),
"messages": [{"role": "user", "content": prompt}],
**kwargs
},
timeout=kwargs.get("timeout", 30)
)
if response.status_code == 429:
raise RateLimitError("Rate limit", retry_after=float(response.headers.get("retry-after", 60)))
if response.status_code >= 500:
raise ServerError(f"Server error: {response.status_code}")
if response.status_code != 200:
raise Exception(f"API error: {response.status_code}")
return response.json()
def _call_with_simplified_mode(self, prompt: str, category: str, **kwargs) -> dict:
"""简化模式调用"""
try:
result = self._call_api(prompt, **kwargs)
if self.config.simplified_response:
return FallbackResponse.get_simplified_response(result)
return result
except Exception:
return FallbackResponse.get_fallback(category)
def get_service_status(self) -> dict:
"""获取服务状态"""
return {
"degrade_level": self.current_level.value,
"degrade_level_name": self.current_level.name,
"circuit_breaker": self.circuit_breaker.get_status(),
"cache_size": len(self.cache._cache),
"config": {
"enable_cache": self.config.enable_cache,
"cache_ttl": self.config.cache_ttl,
"fallback_enabled": self.config.fallback_enabled
}
}
使用示例
import time
初始化服务(使用 HolyShehe AI)
service = DegradeableService(
api_key=YOUR_HOLYSHEEP_API_KEY,
config=DegradeConfig(
enable_cache=True,
cache_ttl=3600,
fallback_enabled=True
),
rate_limiter=TokenBucketRateLimiter(capacity=100, refill_rate=60)
)
正常调用
result = service.call("请介绍一下人工智能的发展历史", category="qa")
print(f"响应级别: {service.current_level.name}")
print(f"结果: {result}")
获取服务状态
status = service.get_service_status()
print(f"服务状态: {json.dumps(status, indent=2, ensure_ascii=False)}")
四、常见报错排查
在实际项目中,我整理了 50+ 个常见错误。以下是最高频的 10 个问题及其解决方案:
4.1 HTTP 429 Too Many Requests(最高频)
"""
错误信息:
HTTP 429 Too Many Requests
Retry-After: 60
{"error": {"message": "Rate limit exceeded", "type": "rate_limit_error"}}
"""
"""
原因分析:
1. 短时间内请求数超过 API 的 RPM(Requests Per Minute)限制
2. HolyShehe AI 默认 60 RPM,超出后返回 429
解决方案:
"""
方案1:使用请求队列 + 限流器
from queue import Queue
import threading
class RequestQueue:
"""请求队列 + 自动限流"""
def __init__(self, rpm: int = 60):
self.rpm = rpm
self.interval = 60.0 / rpm # 请求间隔
self.queue = Queue()
self.last_request_time = 0
self.lock = threading.Lock()
self.running = False
self.thread = None
def start(self):
"""启动