回滚机制有多少种?它们的实现原理是什么?你确定都知道?

简介: 回滚是指当程序或数据出错时,将程序或数据恢复到最近的一个正确版本的行为。最常见的如事务回滚、代码库回滚、部署版本回滚、数据版本回滚、静态资源版本回滚等。通过回滚机制可保证系统在某些场景下的高可用。

回滚是指当程序或数据出错时,将程序或数据恢复到最近的一个正确版本的行为。最常见的如事务回滚、代码库回滚、部署版本回滚、数据版本回滚、静态资源版本回滚等。通过回滚机制可保证系统在某些场景下的高可用。

7.1 事务回滚

在执行数据库SQL时,如果我们检测到事务提交冲突,那么事务中所有已执行的SQL要进行回滚,目的是防止数据库出现数据不一致。 对于单库事务回滚直接使用相关SQL即可。如果涉及分布式数据库,则要考虑使用分布式事务,最常见的如两阶段提交、三阶段提交协议,这种方式实现事务回滚难度较低,但是对性能影响比较大,因为我们在大多数场景中需要的是最终-致性, 而不是强一一致性。 因此,可以考虑如事务表、消息队列、补偿机制(执行/回滚)、TCC模式(预占/确认/取消)、Sagas 模式(拆分事务+补偿机制)等实现最终一致性。 比如,电商中的单场景,会进行扣减优惠券、预占库存等操作,这涉及非常多的子系统,因此,很难使用分布式事务保证强一致性, 我们只要能保证最终一致性即可, 下面来看看结算下单序列图。

一种情况是当订单出错后,要把之前扣减的优惠券和库存回滚。但是,当保存订单出错时,JVM实例挂掉了,那么之前扣减的优惠券和库存就没有回滚,这种情况可以考虑在本地记录事务日志,当JVM实例重启后,分析事务日志重新回滚,当然也可以记录事务日志表,或者通过补偿机制,定期扫描优惠券和库存使用表,回滚没有关联订单的或者已取消订单的记录。还有-种情况是下单后一直没有支付, 比如6小时,没有支付的订单要取消,此时就要定期扫描订单表,然后取消订单并回滚优惠券和库存。不管用什么方式,只要保证最终一致性即可。

7.2 代码库回滚

在开发项目时,一定要将代码维护到代码仓库,从而进行版本管理。常见的有SVN.Git等,SVN是一款集中版本控制系统,而Git是- -款分布式版本控制系统。有了版本控制系统后就可以记录代码的历史版本,在出问题后可以方便回滚。当某个代码文件部署出现问题时,可以通过历史版本查看是谁修改的、修改了什么,从而快速定位出BUG.另外,在实际开发过程中,可能存在多个版本并行开发,此时版本控制系统的分支功能就发挥大作用了,大家在各自分支上开发测试,相互不影响,开发完成后合并分支到主干即可。

7.3 部署版本回滚

代码测试完成后,接下来就要进行系统的部署,在部署系统时,要考虑当代码逻辑出现错误后如何快速恢复,总结为部署版本化、小版本增量发布、大版本灰度发布、架构升级并发发布。

1.部署版本化

每次部署时,应该将上一版本的包记录到部署系统中,在发布时应该采用全量发布,避免增量发布(只发布修改过的类或文件)。如有需要,全量版本可直接回滚,不会受到约束或限制。

2.小版本增量发布

比如修复BUG,添加一些简单的业务逻辑,这些我们叫作小版本。增量发布的意思是比如我们有100台服务器,先发布1台验证,如果没问题,则接着发布10台,最后全量发布。

3.大版本灰度发布

在页面改版、添加新的功能时需要进行灰度发布,--般情况下是两个版本并行跑一段时间,一些用户访问老版本,一些用户访问新版本,功能验证成功后或者新版本效果不错时,再全量发布。比如,我们可以通过类似如下带有版本号的URL来区分新版本和老版本。

不同版本其实就是不同的服务,在一套集群部署即可,出问题时要能非常快速地切换回老版本。

4.架构升级并发发布

架构升级后,我们不太清楚新版本是否功能正常,因此,新老版本部署集群会同时存在一段时间。然后,等所有流量迁移到新版本集群后,老版本集群就可以下线了。

一般前端应用我们会采用Nginx作为接入层,通过A/B方式慢慢地将流量引入到新版本集群,比如1%→10%→50%-→100%。如果新版本集群处理出现问题,那么要自动降级到老版本集群继续服务。若新版本出现大面积故障,则要将所有流量引入到老版本集群。因此,接入层要能灵活控制流量方向。示意图如下图所示。

失败降级我们可以借助Nginx的error-page。

失败降级是很重要的特性,关键时候不至于让用户不能访问或者看到白屏,如果有CDN,则切换版本时一定要记得去掉CDN。

7.4 数据版本回滚

有些特定行业业务数据中的商品/价格数据需要进行版本化处理,一方面为了审计需要,另一方面为了出现问题时能及时回滚。版本化设计可以基于下图的架构。

设计版本化数据结构时,有两种思路:全量和增量。全量版本化是指即使只变更了其中一个字段也将整体记录进行历史版本化,保存的数据量比较多,但是回滚方便。而增量版本化是指只保存变化的字段,保存的数据量较少,但是回滚起来很麻烦,需要回溯。因此,为了简单化处理--般采用全量版本化机制。另外,在设计消息队列时,重要业务会对消息进行副本处理,以便万一业务逻辑出现问题能进行历史数据回滚,从而修复问题。

7.5 静态资源版本回滚

在前端开发中,静态资源版本也是会经常变更的,如Js/CSS,而每次内容变更时我们都会生成一个全量新版本放到项目的deploy 目录中,从而保证版本可追溯,出现问题时能及时回滚。目录结构如下图所示。

因为静态资源一般放在CDN上,所以缓存时间设置得比较长,比如1个月。这样若发布的版本有问题,则需要清理CDN缓存,也需要清理浏览器缓存,而且因为存在版本覆盖的问题,所以即使覆盖了也不一定保证操作正确。

  • 发布新的静态资源到源服务器
  • 清理CDN缓存,从而可以回源服务器获取最新的静态资源
  • 在新的URL上添加随机数并清理浏览器缓存,代码如下

而全量版本机制是最可靠的方式,我们先部署全量版本,然后通过如下方式引用。

在当前发布版本出现问题时,只需要将版本号更改为上一个版本号即可,不需要清理CDN、不需要清理浏览器缓存。当然,这里要设置合理的服务器端页面缓存时间,比如2分钟,用户看到错误的发布版本最多2分钟时间。为了方便测试,可以在请求参数中加入版本号,如htt:tmijd.comc/1431.htm1?version=1.0.15.5方便验证老版本或者测试新版本,使得测试或验证多个版本时,不需要来回修改服务器端代码。

本文就是愿天堂没有BUG给大家分享的内容,大家有收获的话可以分享下,想学习更多的话可以到微信公众号里找我,我等你哦。

相关文章
|
SQL 监控 关系型数据库
MySQL怎么全局把一张表的数据回滚
MySQL怎么全局把一张表的数据回滚
1322 2
|
Kubernetes 负载均衡 网络协议
Kubernetes 跨集群流量调度实战
Kubernetes 问世于 2015 年,从一开始秉持着松耦合和可扩展的设计理念,也因此带来了 Kubernetes 生态的蓬勃发展。但这些大部分先限制在单一集群内,然后由于种种原因和目的企业内部创建的集群越来越多,比如单集群故障、监管要求、异地多机房可用区容灾、出于敏捷、降本考虑的混合云、多云部署、单一集群的承载能力受限、多版本 Kubernetes 集群共存等。多集群之后除了提升管理的难度外,首当其冲的就是多集群间的流量调度,这也是多集群部署的基础。没有跨集群的通信,多集群的收益也会大打折扣。
947 1
Kubernetes 跨集群流量调度实战
|
Cloud Native Go 项目管理
敏捷项目管理解锁:2023年使用YouTrack的全面指南
敏捷项目管理解锁:2023年使用YouTrack的全面指南
3412 0
|
Rust 算法 网络安全
【密码学】一文读懂CMAC
介于上一篇文章比较水,然后这个和上一篇也比较相似,CMAC是为了解决DAA当中安全性不足的问题而出现的,这个算法一共有三个密钥,K, K1, K2, 其中K1和K2可以由K导出,接下来就来一起看一下CMAC的具体过程吧,这一篇文章其实也不长。
5105 0
【密码学】一文读懂CMAC
|
存储 消息中间件 NoSQL
redis入门到精通系列(一):入门redis看这一篇就够了
如果你是计算机专业学生 ,那么一定使用过关系型数据库mysql。在请求量小的情况下,使用mysql不会有任何问题,但是一旦同时有成千上万个请求同时来访问系统时,就会出现卡顿甚至系统崩溃的情况。最典型的例子就是早期的12306购票网站,一旦到了购票高峰期,12306肯定崩溃。造成这个原因的罪魁祸首就是关系型数据库。
7583 0
redis入门到精通系列(一):入门redis看这一篇就够了
|
存储 弹性计算 运维
阿里云无影云电脑是什么?无影云桌面和传统电脑有什么区别?
阿里云无影云电脑是什么?无影云桌面和传统电脑有什么区别?
1340 3
阿里云无影云电脑是什么?无影云桌面和传统电脑有什么区别?
|
4月前
|
SQL 数据采集 数据处理
终于有人把数据架构讲清楚了!
本文深入浅出地解析了数据架构的核心逻辑,涵盖其定义、作用、设计方法及常见误区,助力读者构建贴合业务的数据架构。
|
人工智能 Java API
Spring AI 抢先体验,5 分钟玩转 Java AI 应用开发
Spring Cloud Alibaba AI 以 Spring AI 为基础,并在此基础上提供阿里云通义系列大模型全面适配,让用户在 5 分钟内开发基于通义大模型的 Java AI 应用。
227504 107
|
10月前
|
算法 数据可视化 数据安全/隐私保护
一级倒立摆平衡控制系统MATLAB仿真,可显示倒立摆平衡动画,对比极点配置,线性二次型,PID,PI及PD五种算法
本课题基于MATLAB对一级倒立摆控制系统进行升级仿真,增加了PI、PD控制器,并对比了极点配置、线性二次型、PID、PI及PD五种算法的控制效果。通过GUI界面显示倒立摆动画和控制输出曲线,展示了不同控制器在偏转角和小车位移变化上的性能差异。理论部分介绍了倒立摆系统的力学模型,包括小车和杆的动力学方程。核心程序实现了不同控制算法的选择与仿真结果的可视化。
663 15