跳转到内容

超时配置

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_timeout30客户端请求处理的最大时间(秒)ROBYN_CLIENT_TIMEOUT
keep_alive_timeout20保持空闲连接的时间(秒)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)

故障排除

"打开文件过多"错误

如果遇到文件描述符耗尽:

  1. 增加系统限制:

    bash
    ulimit -n 65536
  2. 优化超时设置:

    python
    app.start(
        client_timeout=15,      # 更短的超时
        keep_alive_timeout=5,   # 更快的连接清理
    )
  3. 在部署中使用环境变量:

    bash
    export 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秒)

与其他框架的比较

框架默认客户端超时默认保持连接配置方式
Robyn30秒20秒方法参数 + 环境变量
Uvicorn20秒构造函数参数
Express.js120秒5秒方法链式调用
Django/Gunicorn30秒不适用配置文件
Flask/Gunicorn30秒2秒命令行选项

最佳实践

  1. 在生产环境中始终设置明确的超时
  2. 使用环境变量进行特定部署的配置
  3. 在负载下监控文件描述符使用
  4. 用现实负载模式测试超时设置
  5. 从保守值开始,根据指标进行调优

迁移指南

从早期版本

如果从早期 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,
)

基于 MIT 许可发布