场景参考
高并发落地实践
使用异步客户端、连接复用、信号量和有界队列构建稳定的并发调用服务。
高并发不是无限创建请求。复用客户端、限制在途数量、处理背压并观察长尾延迟,才能让服务稳定运行。
异步并发示例
import asyncio
import os
from openai import AsyncOpenAI
client = AsyncOpenAI(
api_key=os.environ["APIQIK_API_KEY"],
base_url="https://api.dimleap.cn/v1",
timeout=60.0,
max_retries=2,
)
semaphore = asyncio.Semaphore(20)
async def ask(question):
async with semaphore:
response = await client.chat.completions.create(
model="glm-5.1",
messages=[{"role": "user", "content": question}],
max_tokens=300,
)
return response.choices[0].message.content
async def main():
questions = [
"解释 API 网关",
"解释智能路由",
"解释指数退避",
]
results = await asyncio.gather(
*(ask(question) for question in questions),
return_exceptions=True,
)
for result in results:
print(result)
asyncio.run(main())容量保护
| 机制 | 作用 | 失败策略 |
|---|---|---|
| 并发信号量 | 限制同时在途的上游请求。 | 等待有上限,超时后返回繁忙提示。 |
| 有界队列 | 吸收短时突发流量。 | 队列满时拒绝低优先级请求。 |
| 速率限制 | 按用户、租户或功能控制发送速率。 | 返回明确的重试时间或降级结果。 |
| 熔断 | 持续失败时减少无效请求。 | 短时间快速失败,探测恢复后逐步放量。 |
| 缓存 | 复用稳定、重复且允许缓存的结果。 | 设置版本、有效期和数据隔离。 |
连接与客户端生命周期
- 在进程生命周期内复用客户端,不要为每个请求创建一个新客户端。
- 根据实例内存、文件描述符和业务延迟设定并发,而不是只看理论 QPS。
- 将大请求与小请求分队列,避免长生成阻塞所有交互请求。
- 压测应逐级升压并持续足够时间,观察 P99 和错误恢复过程。
- 平台自动容灾不能替代你的入口限流和资源隔离。