FastAPI/Starlette graceful shutdown server-sent events
💡
原文中文,约4400字,阅读约需11分钟。
📝
内容提要
本文介绍了使用FastAPI/Starlette框架写Server-sent Events时如何优雅地关闭连接,通过定时判断unicorn的cycle实例中的shutdown赋值来实现。同时分享了实践中的坑和解决方法。
🎯
关键要点
- 使用FastAPI/Starlette框架时,Server-sent Events连接在重启服务器后不会自动断开。
- 尝试使用FastAPI的shutdown事件和ASGI的lifespan,但未能成功。
- 暴力监听Linux信号也未能解决问题,发现UvicornWorker的信号处理存在问题。
- 观察到Uvicorn的Server.shutdown()方法在关闭连接时的关键日志信息。
- 通过FastAPI/Starlette请求的.receive属性获取unicorn的cycle实例,定时判断shutdown状态。
- 发现cycle.keep_alive属性默认为False,导致连接无法保持。
- 通过修改HTTP版本配置解决keep_alive问题,但仍需在代码中强制设置keep_alive为True。
- 最终代码实现了在worker重启时,连接能够优雅地断开,确保平稳重启。
➡️