Cloud Foundry V2 API停止应用后如何确认应用已真实停止
Cloud Foundry V2 API 停止应用的状态判定方案
接口返回state字段的实际含义
你调用PUT /v2/apps/{app-guid}传入{"state": "stopped"}触发停止操作时,响应体里的state字段存的是平台侧记录的应用期望状态,绝对不是应用当下的实际运行状态。
CF本身是声明式架构,Cloud Controller收到停止请求后,第一步只是把期望状态更新到自身数据库,再异步给后端运行时(Diego/老版本DEA)下发实例销毁指令,接口返回的时候实例销毁流程往往才刚触发,远没到执行完成的状态,完全不能拿这个返回值当停止成功的依据。
确认应用真正停止的校验方法
按下面的逻辑做校验即可,能100%覆盖异常场景:
- 固定间隔轮询调用
GET /v2/apps/{app-guid}/instances接口,这个接口返回的是所有应用实例的实时运行态数据 - 判定停止成功必须同时满足两个条件:
- 实例查询接口要么返回错误码
40004(代表当前不存在任何运行中的应用实例),要么返回的所有实例条目里的state字段值全为STOPPED - 再调用一次
GET /v2/apps/{app-guid}查询应用详情,确认详情里的state字段为STOPPED,排除期望状态更新失败、自动回滚的异常情况
- 实例查询接口要么返回错误码
- 轮询建议设2-3秒的间隔,同时根据你的应用实例规模设30-120秒的超时阈值,别高频刷接口触发CF的API限流。
别偷懒只查应用详情接口的state字段,我之前在线上踩过实坑:停止接口返回成功、查应用详情state也显示STOPPED,但Diego后端因为组件临时通信延迟,旧的业务实例足足跑了20多秒才被真正销毁,直接导致后续做应用覆盖发布的时候出现了双实例流量冲突。
内容的提问来源于stack exchange,提问作者SoaAlex
相关产品推荐
相关产品推荐

