7-高可用-回滚机制

news2024/11/22 11:28:36

事务回滚

在执行数据库SQL时,如果我们检测到事务提交冲突,那么事务中所有已执行的SQL要进行回滚,目的是防止数据库出现数据不一致。对于单库事务回滚直接使用相关SQL即可。

如果涉及分布式数据库,则要考虑使用分布式事务,最常见的如两阶段提交、三阶段提交协议,这种方式实现事务回滚难度较低,但是对性能影响比较大,因为我们在大多数场景中需要的是最终一致性,而不是强一致性。

因此,可以考虑如事务表、消息队列、补偿机制(执行/回滚)、TCC模式(预占/确认/取消)、Sagas模式(拆分事务+补偿机制)等实现最终一致性。

比如,电商中的单场景,会进行扣减优惠券、预占库存等操作,这涉及非常多的子系统,因此,很难使用分布式事务保证强一致性,我们只要能保证最终一致性即可,下面来看看结算下单序列图。
在这里插入图片描述
一种情况是当订单出错后,要把之前扣减的优惠券和库存回滚。

但是,当保存订单出错时,JVM实例挂掉了,那么之前扣减的优惠券和库存就没有回滚,这种情况可以考虑在本地记录事务日志,当JVM实例重启后,分析事务日志重新回滚,当然也可以记录事务日志表,或者通过补偿机制,定期扫描优惠券和库存使用表,回滚没有关联订单的或者已取消订单的记录。

还有一种情况是下单后一直没有支付,比如6小时,没有支付的订单要取消,此时就要定期扫描订单表,然后取消订单并回滚优惠券和库存。不管用什么方式,只要保证最终一致性即可。

代码库回滚

在开发项目时,一定要将代码维护到代码仓库,从而进行版本管理。常见的有SVN、Git等,SVN是一款集中版本控制系统,而Git是一款分布式版本控制系统。

有了版本控制系统后就可以记录代码的历史版本,在出问题后可以方便回滚。

当某个代码文件部署出现问题时,可以通过历史版本查看是谁修改的、修改了什么,从而快速定位出BUG。

另外,在实际开发过程中,可能存在多个版本并行开发,此时版本控制系统的分支功能就发挥大作用了,大家在各自分支上开发测试,相互不影响,开发完成后合并分支到主干即可。

部署版本回滚

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

部署版本化

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

小版本增量发布

比如修复BUG,添加一些简单的业务逻辑,这些我们叫作小版本。

增量发布的意思是比如我们有100台服务器,先发布1台验证,如果没问题,则接着发布10台,最后全量发布。

大版本灰度发布

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

https://cd.jd.com/yanbao/v3?skuId=8540736cat=652,654,8326brandId=8983&area=1_2810_51081_06callback=yanbao_jsonp_callback

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

架构升级并发发布

架构升级后,我们不太清楚新版本是否功能正常,因此,新老版本部署集群会同时存在一段时间。然后,等所有流量迁移到新版本集群后,老版本集群就可以下线了。
在这里插入图片描述
一般前端应用我们会采用Nginx作为接入层,通过A/B方式慢慢地将流量引入到新版本集群,比如1%→10%→50%→100%。如果新版本集群处理出现问题,那么要自动降级到老版本集群继续服务。若新版本出现大面积故障,则要将所有流量引入到老版本集群。因此,接入层要能灵活控制流量方向。

数据版本回滚

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

在这里插入图片描述
设计版本化数据结构时,有两种思路:全量和增量。

全量版本化是指即使只变更了其中一个字段也将整体记录进行历史版本化,保存的数据量比较多,但是回滚方便。

而增量版本化是指只保存变化的字段,保存的数据量较少,但是回滚起来很麻烦,需要回溯。因此,为了简单化处理一般采用全量版本化机制。

另外,在设计消息队列时,重要业务会对消息进行副本处理,以便万一业务逻辑出现问题能进行历史数据回滚,从而修复问题。

静态资源版本回滚

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

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

- 发布新的静态资源到源服务器。

- 清理CDN缓存,从而可以回源服务器获取最新的静态资源。


- 在新的URL上添加随机数并清理浏览器缓存。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1326795.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Jenkins的文档翻译

官网Jenkins.io Jenkins用户文档 欢迎来到Jenkins用户文档-为那些想要使用Jenkins的现有功能和插件特性的人。如果你想通过开发自己的Jenkins插件来扩展Jenkins的功能,请参考extend Jenkins(开发者文档)。 詹金斯是什么? Jenkins是一个独立的、开源的自动化服务…

STM32-ADC模数转换器

目录 一、ADC简介 二、逐次逼近型ADC内部结构 三、STM32内部ADC转换结构 四、ADC基本结构 五、输入通道 六、转换模式 6.1单次转换,非扫描模式 6.2连续转换,非扫描模式 6.3单次转换,扫描模式 6.4连续转换,扫描模式 七、…

网线的制作集线器交换机路由器的配置--含思维导图

🎬 艳艳耶✌️:个人主页 🔥 个人专栏 :《产品经理如何画泳道图&流程图》 ⛺️ 越努力 ,越幸运 一、网线的制作 1、网线的材料有哪些? 网线 网线是一种用于传输数据信号的电缆,广泛应…

【Linux系统编程】进程的认识

介绍: 进程是程序执行的实体,可将其理解为程序。比如:当我们使用文本编辑器Notepad应用程序来编写一篇文章时,此时,Notepad应用程序就被加载到了内存中,并且它占用的资源(如内存、CPU等&#xf…

伦敦金交易内地与香港有何区别

伦敦金交易是国际银行间市场层面的现货黄黄金交易,亚洲市场的交易中心在中国香港,现在不管是香港本地还是内地的投资者,都可以在网上开户,通过香港的平台参与伦敦金交易,所得到的服务是同等的、公平的、与国际市场接轨…

在Windows上使用 Python

本文档旨在概述在 Microsoft Windows 上使用 Python 时应了解的特定于 Windows 的行为。 与大多数UNIX系统和服务不同,Windows系统没有预安装Python。多年来CPython 团队已经编译了每一个 发行版 的Windows安装程序(MSI 包),已便…

Linux 音视频SDK开发实践

一、兼容性适配处理 为什么需要兼容处理? 1、c兼容处理 主要有ABI兼容性问题,不同ubuntu系统依赖的ABI版本如下: ubuntu 18.04ubuntu 16.04ubuntu 14.04g7.55.44.8stdc版本libstdc.so.6.0.25libstdc.so.6.0.21libstdc.so.6.0.19GLIBCXXG…

【SpringBoot快速入门】(4)SpringBoot项目案例代码示例

目录 1 创建工程3 配置文件4 静态资源 之前我们已经学习的Spring、SpringMVC、Mabatis、Maven,详细讲解了Spring、SpringMVC、Mabatis整合SSM的方案和案例,上一节我们学习了SpringBoot的开发步骤、工程构建方法以及工程的快速启动,从这一节开…

JavaCV音视频开发宝典:UDP局域网组播推流,多播推流,局域网多网段推流,使用UDP方式推送TS组播流,实现UDP一对多组播

《JavaCV音视频开发宝典》专栏目录导航 《JavaCV音视频开发宝典》专栏介绍和目录 ​ 前言 在之前文章中我们已经实现rtp点到点传输JavaCV音视频开发宝典:rtp点到点音视频传输(一对一音视频直播)和rtp广播JavaCV音视频开发宝典:rtp广播方式发送TS流音视频传输(一对多音视…

私域用户标签体系|超全指南

将用户进行精准画像,搭建用户标签体系,将自己的客户分层,逐个突破。

IEEE TASLP | 联合语音识别与口音识别的解耦交互多任务学习网络

尽管联合语音识别(ASR)和口音识别(AR)训练已被证明对处理多口音场景有效,但当前的多任务ASR-AR方法忽视了任务之间的粒度差异。细粒度单元(如音素、声韵母)可用于捕获与发音相关的口音特征&…

利用阿里通义千问和Semantic Kernel,10分钟搭建大模型知识助手!

前言 **通义千问:**是阿里推出的一个超大规模的语言模型,其中参数模型Qwen-72B已经宣布开源,同时还开源了18亿参数模型Qwen-1.8B和音频大模型Qwen-Audio,至此已经开源了18亿、70亿、140亿、720亿参数的4款大语言模型,…

【QT】QGraphicsView和QGraphicsItem坐标转换

坐标转换 QGraphicsItem和QGraphicsView之间的坐标转换需要通过QGraphicsScene进行转换 QGraphicsView::mapToScene() - 视图 -> 场景QGraphicsView::mapFromScene() - 场景 -> 视图QGraphicsItem::mapToScene() - 图元 -> 场景QGraphicsItem::mapFromScene() - 场景 …

【leetcode234】回文链表Java代码讲解

12.21 234. 回文链表 给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。 示例 1: 输入:head [1,2,2,1] 输出:true示例 2: 输入&a…

【Java代码审计】URL跳转漏洞篇

【Java代码审计】URL跳转漏洞篇 1.URL跳转漏洞概述2.Java中的URL重定向3.URL跳转漏洞修复 1.URL跳转漏洞概述 通俗地说,目前很多的Web应用因为业务需要,需与内部的其他服务或者第三方的服务进行交互,这样就需要重定向的功能,由当…

上市十年 这家互联网服务平台窥见汽车市场“沧海桑田”

十年,对于一家上市公司而言意味着什么?以中概股为例,十年里的高低起伏,折射出不同公司和行业的各异命运。 新浪在2021年私有化退市,曾经名声在外的聚美优品在2020年遭遇同样命运。再往前数,还有离开美股回…

浅谈ASO优化如何应对市场竞争的挑战

随着应用市场的竞争越来越激烈,ASO优化也要为了应对各种来临的风险与机遇做出改变,提高自己的适应能力,下面小柚整理了一些思路供大家参考。 1. 深入了解目标用户需求:首先,需要深入了解目标用户的需求和痛点&#xf…

【LeetCode刷题笔记(11-1)】【Python】【和为 K 的子数组】【前缀和】【中等】

文章目录 引言和为 K 的子数组题目描述提示 解决方案1:【暴力枚举】解决方案2:【前缀和】结束语 和为 K 的子数组 引言 编写通过所有测试案例的代码并不简单,通常需要深思熟虑和理性分析。虽然这些代码能够通过所有的测试案例,但…

985等高校急速开设“鸿蒙班”,引领IT就业新时代

​根据澎湃新闻记者了解到,华为以及鸿蒙系软件厂商都在积极培养鸿蒙开发人才。其中产学联动、产教融合来培养鸿蒙生态人才是重要的一条路径,目前已有 23 家 985 高校、46 家 211 高校已开设或即将开设HarmonyOS 相关课程。 其中南京大学已经将 HarmonyOS…

一套rk3588 rtsp服务器推流的 github 方案及记录 -03(完结)

opencv 解码记录 解码库使用的时候发现瑞芯微以前做过解码库对ffmpeg和gstreamer的支持 然后最近实在不想再调试Rtsp浪费时间了,就从这中间找了一个比较快的方案 ffmpeg 带硬解码库编译 编译流程参考文献 https://blog.csdn.net/T__zxt/article/details/12342435…