编写可回滚的代码

木小丰 2021年11月16日 126次浏览

一、导论

可回滚是软件发布的基本规范,尤其是在互联网分布式应用中,如果上线的新版本有bug又不能回滚止损,带来的后果将是灾难性的。

二、可回滚发布

回滚指的是程序或数据处理错误,将程序或数据恢复到上一次正确状态的行为。在回滚之后,程序依然能够正常处理,称为可回滚。

不可回滚原因大多是旧程序不能处理新数据导致的。

1、向前兼容的手段

(1)数据库兼容

新加字段:需要设置默认值,默认值要保证新旧代码逻辑的语义一致性。

删除字段:新版本全量发布后,最好迭代2-3个版本后,再删除无用字段,同时要做好数据库备份。

新加唯一约束:首先要确保原有的数据值没有重复的,再添加唯一索引。

(2)对外提供RPC服务

入参新加字段:设置为可选的,如果没设置值,要有老业务逻辑兼容代码

返回值字段:设置为可选的,如果是新版本肯定有值字段,需要在字段描述文档里做好备注

如果入参和返回值结果差异较大,建议新建一个RPC方法,逐渐把业务方调用迁移到新方法

(3)对外提供HTTP服务

​ HTTP接口和RPC接口的不同是没有强制的约束,数据交换大多采用JSON形式,虽然灵活性强,但是约束力低给维护带来很大的成本,采用比如Swagger等工具,比如给指定字段名、类型、是否必填、不填写的默认值等来解决。

2、可回滚测试

设计考虑可回滚性;通常要在测试环境演练可回滚性。同时QA同学要把可回滚作为质量验收的一部分。

3、发布手段

(1)蓝绿发布

线上部署两个集群,每个集群都能抗住所有的流量,发布的时候一个集群接受用户请求,等当前集群全部发布成功后,再把流量全部迁移到新版本集群。可保证新版本特性同一时间对所有用户生效;保证系统高可用,一个集群出问题,可快速切换到备用集群;

缺点:日常使用的机器只有一半,造成浪费;

(2)金丝雀发布

采用金丝雀部署,可以在生产环境的基础设施中小范围的部署新的应用代码。一旦应用新发布,只有少数用户被路由到它。最大限度的降低影响。检测新版本没问题,再逐步扩大发布范围直至全量。

实现灰度发布,需要部署系统设置分批次发布,同时必须有监控、报警等相关的系统的配合。确定没问题后再扩量。

4、监控报警

常用的发布相关的监控报警包括:

  • 新、旧版本的流量及百分比
  • 对外提供的接口的性能指标、下游的性能指标(TP50、TP90、TP99、TP999)等
  • 异常指标及报警

三、总结

保证线上稳定性是一项复杂的工程,需要从各个方面来保证,希望能给大家带来的帮助。


本文作者:木小丰,美团Java高级工程师,专注有价值的原创文章。欢迎关注公共号:Java研发

本文链接:编写可回滚的应用代码