返回知识库

工程与栈 · 部署与上线

回滚Rollback

回滚是把流量切回已知良好的产物或开关,并在真实页面上验证;数据已经不兼容时不能硬切。

先认出这张坏掉的结账页,再决定切不切回

下面就是带着版本章的结账页。默认 v1.9.0 支付失败;切回上一版或数据不兼容,章和支付结果会一起变。

checkout当前 v1.9.0 · 异常

今日花束 · ¥128

支付失败 · 5xx 8.2%

确认支付线上坏了

线上坏了回滚结果长在同一张结账页上。

原因:v1.9.0 写坏了结账。下一步:切回已验收的 v1.8.4,或看数据不兼容时为什么不能硬切。

知识点:回退点、验证、兼容

结账页上的章已经演过,这里只给命名。

  • 回滚是切回已知良好的产物或开关,不是再发一个「热修猜测」。
  • 回退点必须事先标好:上一份已验收版本、兼容的数据和可验证的页面。
  • 切回去之后要在真实结账页上验证,不能只看部署任务变绿。
  • 数据已经不兼容时先做 expand-contract 或恢复备份,硬切会继续写坏。

什么时候用、怎么用

线上已经伤到真人,而且你知道上一版是好的,才谈回滚。

  • 信号:支付、登录、下单在新版本上突然失败,上一版仍可用。
  • 适用:产物可切、开关可关、数据库向后兼容。
  • 不适用:新列已经写入、旧代码读不懂;这时硬切只会换一种失败。
  • 最短路径:标回退点 → 切回 → 在真实页面下单验证 → 不兼容就先做兼容。

正反例:同一张故障结账页,只改能不能硬切

都要从 v1.9.0 回到上一版,差别只在数据还认不认得。

正例切回已验收的 v1.8.4,结账页当场恢复

数据库向后兼容。支付成功写回页面,用户能继续下单。

反例新列已写入仍硬切旧代码

失败仍写在结账页上。旧版本读不懂新列,订单继续报错。

快速自测

v1.9.0 已经往订单表写了新列,旧代码读这些行会报错。能不能立刻切回 v1.8.4?

继续查证

术语的技术定义和行为以这些一手或权威资料为准。

下一步学

和本知识点经常一起出现的概念。