面向高并发场景的 HTTP 连接复用和 WebSocket 连接池配置指南。
复用连接可以减少资源消耗、提升吞吐量。具体策略取决于协议类型:
连接池默认启用,可根据需要调整以下参数。
配置连接池参数并调用模型服务:
Python SDK 通过自定义 Session 实现连接复用,支持异步 (aiohttp)和同步 (requests.Session)两种方式。
使用
使用
在多次调用间复用同一个 Session:
TTS 服务使用 WebSocket 连接进行实时流式传输。在生产环境中,每次请求都新建连接会浪费资源并增加延迟。本节介绍面向高吞吐 TTS 场景的连接池、对象池和并发请求管理方案。
Python SDK 提供
Java SDK 使用 OkHttp3 连接池(默认启用),并可选配 Apache Commons Pool2 对象池来管理
第 2 步:添加 commons-pool2 依赖
第 3 步:创建并使用对象池
跟踪以下指标以维护生产环境 TTS 服务的健康状态:
通过 SDK 获取这些指标:
上线前请确认以下事项:
- HTTP API(文本生成、多模态、Embeddings):通过连接池配置(Java)或 Session 对象(Python)复用 TCP 连接。
- WebSocket API(TTS、实时语音):池化持有长连接的合成器对象。
前提条件
- 已获取 API Key 并配置为
DASHSCOPE_API_KEY环境变量。 - 已安装最新版 DashScope SDK:
- Python SDK:>= 1.25.2
- Java SDK:>= 2.16.6
HTTP 连接复用
DashScope 端点因模型类型而异:
- 文本模型(
qwen-plus、qwen3-max等):使用Generation类,路由到/services/aigc/text-generation/generation。 - 多模态模型(
qwen3.7-plus、qwen3-vl-plus等):使用MultiModalConversation类,路由到/services/aigc/multimodal-generation/generation。
Java SDK
连接池默认启用,可根据需要调整以下参数。
| 参数 | 说明 | 默认值 | 单位 | 备注 |
|---|---|---|---|---|
connectTimeout | 建立连接的超时时间 | 120 | 秒 | 低延迟场景可缩短此值以减少等待时间。 |
readTimeout | 读取数据的超时时间 | 300 | 秒 | |
writeTimeout | 写入数据的超时时间 | 60 | 秒 | |
connectionIdleTimeout | 空闲连接的超时时间 | 300 | 秒 | 适当延长可避免高并发时频繁重连。 |
connectionPoolSize | 连接池最大连接数 | 32 | 个 | 过少会导致阻塞,过多会增加服务器压力。 |
maximumAsyncRequests | 所有主机的最大并发请求数,需 ≤ connectionPoolSize | 32 | 个 | |
maximumAsyncRequestsPerHost | 单个主机的最大并发请求数,需 ≤ maximumAsyncRequests | 32 | 个 |
Python SDK
Python SDK 通过自定义 Session 实现连接复用,支持异步 (aiohttp)和同步 (requests.Session)两种方式。
异步 (aiohttp)
使用 aiohttp.ClientSession 和 aiohttp.TCPConnector 实现异步连接复用。
| 参数 | 说明 | 默认值 | 备注 |
|---|---|---|---|
limit | 总连接数上限 | 100 | 增大此值可提升并发能力。 |
limit_per_host | 单主机连接数上限 | 0(不限) | 防止对单个主机施加过大压力。 |
ssl | SSL 上下文配置 | None | 用于 HTTPS 连接的 SSL 证书验证。 |
同步 (requests.Session)
使用 requests.Session 实现同步连接复用。同一 Session 内的请求会复用 TCP 连接。
WebSocket 连接池
TTS 服务使用 WebSocket 连接进行实时流式传输。在生产环境中,每次请求都新建连接会浪费资源并增加延迟。本节介绍面向高吞吐 TTS 场景的连接池、对象池和并发请求管理方案。
Python:对象池
Python SDK 提供 SpeechSynthesizerObjectPool 来管理和复用 SpeechSynthesizer 实例。对象池在初始化时预创建对象并建立 WebSocket 连接,消除了逐请求建连的开销。
池大小建议:将 max_size 设置为峰值并发的 1.5~2 倍,但不要超过账户的 QPS 上限。
如果任务失败或仍在运行,不要将合成器归还到池中,应手动调用 close 关闭。
Java:连接池 + 对象池
Java SDK 使用 OkHttp3 连接池(默认启用),并可选配 Apache Commons Pool2 对象池来管理 SpeechSynthesizer 实例。
第 1 步:通过环境变量配置连接池
| 变量 | 默认值 | 建议 |
|---|---|---|
DASHSCOPE_CONNECTION_POOL_SIZE | 32 | 峰值并发的 2 倍 |
DASHSCOPE_MAXIMUM_ASYNC_REQUESTS | 32 | 与连接池大小一致 |
DASHSCOPE_MAXIMUM_ASYNC_REQUESTS_PER_HOST | 32 | 与连接池大小一致 |
- Maven
- Gradle
| 变量 | 默认值 | 建议 |
|---|---|---|
SAMBERT_OBJECTPOOL_SIZE(Sambert) | 500 | 峰值并发的 1.5~2 倍,不超过连接池大小 |
服务器配置参考:4 核 8 GiB 机器可支撑约 600 个并发 Sambert TTS 任务,对象池大小 1200,连接池大小 2000。
最佳实践
- Java SDK:根据实际并发量设置
connectionPoolSize和maximumAsyncRequests。连接数过少会导致阻塞,过多会增加服务器压力。 - Python SDK:使用
with语句管理 Session 生命周期,确保资源正确释放。 - 选择合适的调用方式:异步应用(如 asyncio 或 FastAPI)使用异步调用,传统应用使用同步调用。
- WebSocket 对象池:如果任务失败或仍在运行,不要将合成器归还到池中,应手动调用 close 关闭。
性能监控
跟踪以下指标以维护生产环境 TTS 服务的健康状态:
| 指标 | 说明 | 目标值 |
|---|---|---|
| 首包延迟 | 从发送请求到收到第一个音频分片的时间 | < 500 ms |
| 端到端延迟 | 完成整个合成的总时间 | 取决于文本长度 |
| 错误率 | 失败请求的百分比 | < 0.1% |
| 池使用率 | 已借出对象数 / 池大小 | 峰值时 60%~80% |
| 连接复用率 | 复用连接数 / 总请求数 | > 95% |
上线检查清单
上线前请确认以下事项:
- API Key 存储在环境变量中,未硬编码到代码里。
- 连接池和对象池大小已按预期峰值负载配置。
- 池大小未超过账户的 QPS 上限。
- 错误处理逻辑将失败对象销毁(而非归还到池中)。
- 优雅停机时调用了
pool.shutdown()(Python)或关闭池(Java)。 - WebSocket 连接使用了正确的区域端点。
- 监控面板已配置首包延迟、错误率和池使用率等指标。
- 已完成 2 倍预期峰值并发的压力测试。
- 已实现指数退避的重试逻辑以应对瞬时故障。