超时配置
Robyn 支持全面的超时配置,以处理高并发场景并防止资源耗尽,如"打开文件过多"错误。
配置选项
方法参数
直接在 app.start()
方法中配置超时:
python
from robyn import Robyn
app = Robyn(__file__)
@app.get("/")
async def hello(request):
return "Hello, world!"
# 配置超时设置
app.start(
host="0.0.0.0",
port=8080,
client_timeout=30, # 客户端连接超时(秒)
keep_alive_timeout=20, # 保持连接超时(秒)
)
环境变量
使用环境变量覆盖配置:
bash
# 设置超时配置
export ROBYN_CLIENT_TIMEOUT=45
export ROBYN_KEEP_ALIVE_TIMEOUT=30
# 启动应用程序
python app.py
配置参数
参数 | 默认值 | 描述 | 环境变量 |
---|---|---|---|
client_timeout | 30 | 客户端请求处理的最大时间(秒) | ROBYN_CLIENT_TIMEOUT |
keep_alive_timeout | 20 | 保持空闲连接的时间(秒) | ROBYN_KEEP_ALIVE_TIMEOUT |
使用示例
基本配置
python
# 最小超时配置
app.start(client_timeout=30)
高流量生产设置
python
# 针对高流量场景优化
app.start(
host="0.0.0.0",
port=8080,
client_timeout=60, # 允许更长的处理时间
keep_alive_timeout=15, # 更短的保持连接以加快周转
)
开发设置
python
# 开发友好设置
app.start(
client_timeout=300, # 调试的长超时
keep_alive_timeout=60, # 测试的长保持连接
)
负载测试配置
python
# 针对 wrk 等工具的负载测试优化
app.start(
client_timeout=10, # 快速超时
keep_alive_timeout=5, # 快速连接周转
)
环境变量优先级
环境变量优先于方法参数:
python
# 如果设置了 ROBYN_CLIENT_TIMEOUT=60,将使用 60,否则使用 30
app.start(client_timeout=30)
故障排除
"打开文件过多"错误
如果遇到文件描述符耗尽:
增加系统限制:
bashulimit -n 65536
优化超时设置:
pythonapp.start( client_timeout=15, # 更短的超时 keep_alive_timeout=5, # 更快的连接清理 )
在部署中使用环境变量:
bashexport ROBYN_CLIENT_TIMEOUT=15 export ROBYN_KEEP_ALIVE_TIMEOUT=5
性能调优
对于高吞吐量 API:
- 较低的
keep_alive_timeout
(5-15秒) - 中等的
client_timeout
(15-30秒)
对于长时间运行的操作:
- 较高的
client_timeout
(60-300秒) - 标准的
keep_alive_timeout
(20-30秒)
与其他框架的比较
框架 | 默认客户端超时 | 默认保持连接 | 配置方式 |
---|---|---|---|
Robyn | 30秒 | 20秒 | 方法参数 + 环境变量 |
Uvicorn | 无 | 20秒 | 构造函数参数 |
Express.js | 120秒 | 5秒 | 方法链式调用 |
Django/Gunicorn | 30秒 | 不适用 | 配置文件 |
Flask/Gunicorn | 30秒 | 2秒 | 命令行选项 |
最佳实践
- 在生产环境中始终设置明确的超时
- 使用环境变量进行特定部署的配置
- 在负载下监控文件描述符使用
- 用现实负载模式测试超时设置
- 从保守值开始,根据指标进行调优
迁移指南
从早期版本
如果从早期 Robyn 版本升级,默认行为会改变:
之前(无限超时):
python
# 以前:无超时(可能导致资源耗尽)
app.start(host="0.0.0.0", port=8080)
之后(合理默认值):
python
# 现在:自动 30秒 客户端超时,20秒 保持连接
app.start(host="0.0.0.0", port=8080)
# 等价于:
app.start(
host="0.0.0.0",
port=8080,
client_timeout=30,
keep_alive_timeout=20,
)