4

编写可回滚的代码

 2 years ago
source link: https://lesofn.com/archives/bian-xie-ke-hui-gun-de-dai-ma
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

编写可回滚的代码

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

可回滚是软件发布的基本规范,尤其是在互联网分布式应用中,如果上线的新版本有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研发

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK