一、导论
可回滚是软件发布的基本规范,尤其是在互联网分布式应用中,如果上线的新版本有bug又不能回滚止损,带来的后果将是灾难性的。
二、可回滚发布
回滚指的是程序或数据处理错误,将程序或数据恢复到上一次正确状态的行为。在回滚之后,程序依然能够正常处理,称为可回滚。
不可回滚原因大多是旧程序不能处理新数据导致的。
1、向前兼容的手段
(1)数据库兼容
新加字段:需要设置默认值,默认值要保证新旧代码逻辑的语义一致性。
删除字段:新版本全量发布后,最好迭代2-3个版本后,再删除无用字段,同时要做好数据库备份。
新加唯一约束:首先要确保原有的数据值没有重复的,再添加唯一索引。
(2)对外提供RPC服务
入参新加字段:设置为可选的,如果没设置值,要有老业务逻辑兼容代码
返回值字段:设置为可选的,如果是新版本肯定有值字段,需要在字段描述文档里做好备注
如果入参和返回值结果差异较大,建议新建一个RPC方法,逐渐把业务方调用迁移到新方法
(3)对外提供HTTP服务
HTTP接口和RPC接口的不同是没有强制的约束,数据交换大多采用JSON形式,虽然灵活性强,但是约束力低给维护带来很大的成本,采用比如Swagger等工具,比如给指定字段名、类型、是否必填、不填写的默认值等来解决。
2、可回滚测试
设计考虑可回滚性;通常要在测试环境演练可回滚性。同时QA同学要把可回滚作为质量验收的一部分。
3、发布手段
(1)蓝绿发布
线上部署两个集群,每个集群都能抗住所有的流量,发布的时候一个集群接受用户请求,等当前集群全部发布成功后,再把流量全部迁移到新版本集群。可保证新版本特性同一时间对所有用户生效;保证系统高可用,一个集群出问题,可快速切换到备用集群;
缺点:日常使用的机器只有一半,造成浪费;
(2)金丝雀发布
采用金丝雀部署,可以在生产环境的基础设施中小范围的部署新的应用代码。一旦应用新发布,只有少数用户被路由到它。最大限度的降低影响。检测新版本没问题,再逐步扩大发布范围直至全量。
实现灰度发布,需要部署系统设置分批次发布,同时必须有监控、报警等相关的系统的配合。确定没问题后再扩量。
4、监控报警
常用的发布相关的监控报警包括:
新、旧版本的流量及百分比
对外提供的接口的性能指标、下游的性能指标(TP50、TP90、TP99、TP999)等
异常指标及报警
三、总结
保证线上稳定性是一项复杂的工程,需要从各个方面来保证,希望能给大家带来的帮助。
原文链接:
https://lesofn.com/archives/gou-jian-ke-hui-gun-de-ying-yong-ji-shang-xian-checklist-shi-jian
本文作者:木小丰,美团Java高级工程师
推荐阅读:
不是你需要中台,而是一名合格的架构师(附各大厂中台建设PPT)