ASGI应用需手动实现健康检查路由,因ASGI规范本身不定义liveness/readiness端点;须显式暴露如/live和/ready路径,分别验证进程存活与依赖就绪,并绕过中间件、控制响应精简、设置超时。

ASGI应用里加健康检查路由要自己写,没有内置
ASGI规范本身不定义健康检查端点,liveness 或 readiness 都得手动实现。主流ASGI服务器(如Uvicorn、Hypercorn)只负责转发请求,不提供默认健康接口。你得在应用逻辑里显式暴露一个路径,比如 /healthz 或 /live,并确保它返回 200 状态码和轻量响应体。
常见错误是直接复用 Flask/FastAPI 的 @app.get("/health") 写法,但若你用的是纯 ASGI app(比如自定义 app(scope, receive, send)),就必须手动构造响应 —— 否则会 500 或超时。
- FastAPI 用户:用
@app.get("/live")即可,它底层已适配 ASGI,但注意别在该路由里调用阻塞 I/O(如同步数据库查询),否则会卡住整个事件循环 - 纯 ASGI app(如 bare
async def app(...)):必须用await send(...)发送status=200和body=b"OK",不能 return 字符串 - 路径名建议统一用
/live(liveness)和/ready(readiness),避免和前端路由冲突;Kubernetes 默认探针路径是/healthz,但需提前和运维对齐
readiness 探针要检查依赖服务,不能只返回 OK
readiness 的语义是“是否准备好接收流量”,不是“进程是否活着”。所以它必须验证下游关键依赖:数据库连接、缓存、外部 API 可达性等。如果只返回 200 OK,Kubernetes 可能将流量导到尚未完成初始化或依赖失联的实例上。
典型陷阱是把 readiness 和 liveness 写成同一个函数。它们职责不同:liveness 应极简(仅确认进程未卡死),readiness 可稍重但必须有超时控制。
立即学习“Python免费学习笔记(深入)”;
快速生成专业的 Python 脚本和应用代码。一键创建完整项目结构,支持CLI、API、爬虫、Bot、Django等多种项目类型,包含完整的项目结构、配置文件、依赖管理、测试、README和文档。
- 数据库检查用异步驱动(如
asyncpg或aiomysql),避免psycopg2这类同步库造成阻塞 - 所有依赖检查必须设
timeout(例如asyncio.wait_for(..., timeout=2.0)),否则探针超时会导致 Pod 被反复重启 - 缓存检查别用
GET某个 key,而应发PING命令(Redis)或INFO(Memcached),更轻量且不污染业务数据
Uvicorn 启动参数影响探针响应延迟
Uvicorn 的 --workers、--limit-concurrency 和 --timeout-keep-alive 会间接导致健康检查失败。比如高并发下连接池耗尽,/ready 因拿不到 DB 连接而超时;或 --timeout-keep-alive=5 太短,导致探针 TCP 连接被主动断开。
Kubernetes 默认探针超时是 1 秒,失败阈值 3 次。如果 Uvicorn 响应慢于这个窗口,就会触发误杀。
- 生产环境建议固定
--workers=1(配合 Kubernetes 多副本),避免多进程间状态不一致影响 readiness 判断 -
--limit-concurrency设为略高于预期 QPS,防止健康检查请求排队等待 - 在
livenessProbe的 YAML 中显式设置timeoutSeconds: 2和periodSeconds: 5,比默认值更宽松
HTTP 头和响应体必须精简,避免中间件干扰
很多项目会全局挂载认证中间件(如 JWT 校验)、CORS、日志中间件。这些可能拦截或修改健康检查请求:比如认证中间件返回 401,CORS 中间件添加大量 Access-Control-* 头,日志中间件打满磁盘。
最稳妥的方式是让健康检查路由绕过所有中间件 —— 不是“忽略”,而是从 ASGI 生命周期最前端处理。
- FastAPI:用
@app.api_route("/live", include_in_schema=False)并确保没套Depends(),同时在middleware注册时用path="/live"排除 - Starlette:在
MiddlewareStack外层单独写一个live_app = Starlette(routes=[Route("/live", ...)]),再用Mount拼进主应用 - 务必检查响应头:禁用
Content-Encoding(gzip 会增加 CPU)、删掉Server、X-Powered-By等非必要字段,Body 控制在 2–4 字节(如b"ok")

















