首页/系统与基础设施/自动化运维速查/自助交付的失败回退设计
巡检与自助运维60 条

自助交付的失败回退设计

自助交付多为多步操作,失败必然留下中间状态,因此要为每个有副作用的步骤定义补偿动作并按逆序回退,回退后必须校验资源删除、配置恢复与配额释放。数据写入与对外通知通常不可回退,应尽量放在流程末尾,并明确人工接管的边界。

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌​​​​‌​‌‌‌​‌​‌​‌‌‌​‌​​​‌‌​‌‌‌‌​‌‌​‌‌​‌​‌‌​​​​‌​‌‌‌​‌​​​‌‌​‌​​‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​​‌​‌‌‌‌​‌‌‌​​‌‌​‌‌​​‌​‌​‌‌​‌‌​​​‌‌​​‌‌​​​‌​‌‌​‌​‌‌‌​​‌‌​‌‌​​‌​‌​‌‌‌​​‌​​‌‌‌​‌‌​​‌‌​‌​​‌​‌‌​​​‌‌​‌‌​​‌​‌​​‌​‌‌​‌​‌‌​​‌‌​​‌‌​​​​‌​‌‌​‌​​‌​‌‌​‌‌​​​‌‌‌​‌​‌​‌‌‌​​‌​​‌‌​​‌​‌​​‌​‌‌​‌​‌‌‌​​‌​​‌‌​‌‌‌‌​‌‌​‌‌​​​‌‌​‌‌​​​‌‌​​​‌​​‌‌​​​​‌​‌‌​​​‌‌​‌‌​‌​‌‌​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​

失败要回到明确状态

自助交付常常包含多步操作,任何一步失败都会留下中间状态。回退设计的目标是让失败后的环境要么回到初始状态,要么停在一个明确可继续的状态。做法是先识别有副作用的步骤,为每一步定义补偿动作,并明确哪些步骤无法补偿、需要人工接管。

基本信息

识别对象有副作用的步骤及其顺序依赖
回退方式补偿动作、整体重建、快照还原
状态记录每步执行状态与已完成步骤清单
不可回退项数据写入、对外通知、已释放的资源
验收要求回退后校验环境与初始状态一致

典型使用场景

  • 多步交付中断:按已完成步骤逆序执行补偿动作,避免残留半成品
  • 资源创建失败:删除已创建的部分资源,避免占用配额却无法使用
  • 配置生效失败:回滚配置并重新加载,恢复到变更前状态
  • 通知已发出:通知无法撤回,需在回退后追加更正通知
  • 无法回退时:明确升级路径与人工清理步骤,而不是停留在中间态

回退策略对照

策略适用情形代价
逆序补偿步骤相对独立需为每步实现补偿动作
整体重建资源可快速重建交付时间变长
快照还原交付前可做快照占用存储,还原影响范围大
人工接管存在不可回退步骤依赖人工,响应时间较长

逆序补偿与状态记录

逆序补偿与状态记录
# 每完成一步登记状态,失败时按逆序补偿已完成的步骤
state_write step=create_db status=done
if ! provision_app; then
  echo failed-at-provision_app >> deliver.log
  rollback_all                        # 从最近完成的一步开始回退
fi
rollback_all() {
  grep status=done deliver.log | tac | while read -r line; do
    ./compensate.sh $line >> deliver.log   # 每步对应的补偿动作
  done
}
回退必须校验,否则回退过程本身失败会留下更隐蔽的问题。校验内容至少包含资源是否已删除、配置是否已恢复、配额是否已释放,并把结果写入执行记录。
数据写入与对外通知通常无法回退。设计时应把不可回退步骤尽量放在流程末尾,减少失败时需要人工介入的范围,并在交付说明中明确告知用户。

易错点

  • 没有补偿动作:交付失败留下半成品资源,占用配额且状态不明
  • 回退不校验:补偿动作自身失败未被发现,环境处于更隐蔽的不一致状态
  • 不可回退动作放在流程前段:失败时已产生外部影响,回退范围被放大
  • 不做状态记录:中断后无法判断执行到哪一步,只能全部重建或人工排查

数据来源与参考

  • Saga 模式相关技术文献:分布式事务的补偿机制
  • ITIL 4 服务管理实践:变更使能与发布管理
  • Kubernetes 官方文档:资源回收与清理策略

整理校对:其其网ICT文档中心 · 本页地址:docs.qiqicto.com/automation/self-service-failure-rollback.html

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌​​​​‌​‌‌‌​‌​‌​‌‌‌​‌​​​‌‌​‌‌‌‌​‌‌​‌‌​‌​‌‌​​​​‌​‌‌‌​‌​​​‌‌​‌​​‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​​‌​‌‌‌‌​‌‌‌​​‌‌​‌‌​​‌​‌​‌‌​‌‌​​​‌‌​​‌‌​​​‌​‌‌​‌​‌‌‌​​‌‌​‌‌​​‌​‌​‌‌‌​​‌​​‌‌‌​‌‌​​‌‌​‌​​‌​‌‌​​​‌‌​‌‌​​‌​‌​​‌​‌‌​‌​‌‌​​‌‌​​‌‌​​​​‌​‌‌​‌​​‌​‌‌​‌‌​​​‌‌‌​‌​‌​‌‌‌​​‌​​‌‌​​‌​‌​​‌​‌‌​‌​‌‌‌​​‌​​‌‌​‌‌‌‌​‌‌​‌‌​​​‌‌​‌‌​​​‌‌​​​‌​​‌‌​​​​‌​‌‌​​​‌‌​‌‌​‌​‌‌​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​