高可用系列三:事务

都成功或者都失败是事务目标,实际中往往会采用最终一致、最大努力一致和不一致时人工介入策略。

评估事务,通常会根据业务特点,考虑对于事务相关业务之间所需的时效性、依赖联系因素,框定事务可用方案,并结合事务实现代价综合评定选择事务方案。

事务特点分析:时效性与依赖联系

分析事务的时效性和依赖联系非常重要,而且往往从业务角度一分析就一目了然。需要及时性的场景就不赘述了,简单说一个准实时的场景,比如下单,下完单后需要通知对应人员处理订单,假设,我们需要存储订单,并且存储订单通知信息到对应的处理人消息列表中。此时,我们只需要保证订单存储成功的同时,消息列表也会存储成功,中间允许存在短暂的延时,这种场景就只要达到最终一致即可。

具体事务方案

在讨论事务具体方案前,再补充一点信息,大多数情况下,其实是可以降低事务的颗粒度,即节省事务时间。锁当然是越小越好,比如在进行事务操作前,尽量将所需的依赖信息、数据封装处理等提前处理完毕,还有事务锁定的范围能到具体某个资源id、用户、时间、业务状态等更小范围就控制锁定在这个小范围,这样执行事务期间,可以减少事务消耗的时间和事务影响的范围,以节省事务的资源消耗,提高系统的吞吐率。

接下里就可以讨论事务具体可用的方案,实际中采用的方案主要有:

本地事务

最简单的就是本地事务,利用存储的事务支持,直接进行。这种方式最简单也最省心,当然如果单事务涉及到的资源特别多,也不一定是最优方案,可能采用后面的一些方案,进行事务拆分、巧用事件机制,虽然总体的资源可能增加,但是单粒度减小了反而可能得到更高的吞吐率,而且有时候系统的职责也会更清晰,扩展能力更强。

分布式事务

这里不再赘述2PC、3PC、XA、TCC模型了,这些网上资料都很全,资源消耗、维护成本、引入第三方中间件等事务成本也有详尽的讨论,本文就重点聊事务消息、消息中间件和本地消息表。

这三种类型都是基于消息中间件,而消息中间件几乎是系统标配,而使用消息中间件也有降低复杂度、解耦的好处,因此也是在业务场景允许的情况下首选,当然优先顺序从维护事务成本来说一般是消息中间件、本地消息表,最后事务消息。

消息中间件:即请求到达后,不处理任何业务,直接发送消息,消息发送成功则直接返回。这种方式最简单,但仅限于纯异步场景,给用户返回时未执行任何操作,此时,只能告诉用户,你的请求已经提交成功了,至于结果,等执行完了才知道。

本地消息表:相当于将消息发送记录和主业务支持放在同一个本地事务中,然后触发消息发送,本地也实现一个线程定期扫描消息发送表中待发送的记录,进行二次触发。保证主业务执行成功,且最终消息一定能发送成功。这样既给用户一个有效的业务执行状态,又将事务简化了,前面提到的存储订单+通知到处理人的场景就非常适合。

事务消息:实质是让消息中间件来最终负责事务状态的确认,业务执行前先发事务消息,执行完成后确认消息发送。当业务未及时或正确确认消息发送时,由消息中间件来跟踪业务执行的结果。这里对于业务执行也有一定的要求,避免长时间业务执行过程中,收到消息中间件确认信息时,给到业务执行失败的假象。

借助消息队列,实际消息消费和者事务消息确认结果,都存在消息监控问题:

  • 消息无法正常消费:消息发送成功后,接收消息执行业务的服务需要注意因为数据、代码错误等原因执行失败的情况,此时就需要监控消息的消费情况。这种情况可以订阅MQ的死信,通过死信来进行报警,人工处理后进行消息回放。
  • 消费延迟:有时消息因为消息产生过快、消费端处理慢、消息队列数或消费者不够导致消息积压,使得有时间限制的业务及时将业务处理完成。此时,可以监控消息队列的消费积压情况,可以采取限流、优化消费者代码处理逻辑、适当增加消息队列中topic队列数、根据队列数增加消费者数量等手段避免消息长期积压。
  • 事务消息确认超时:事务消息的确实也是有时间、次数限制的,比如RocketMQ 在达到上限时,则会简单在日志中打印一条事务消息执行异常的日志,此时就需要监控消息队列日志,及时报警,人工介入处理。

还有一个是消息重新投递的时间和次数限制,前面探讨中已提到消息次数限制可以通过死信来二次处理,重新投递时间的问题,则需要通过综合手段来解决,比如根据业务情况调整异常投递的时间间隔,消费者端对于消息处理失败一定时间的特殊报警逻辑。还有一种情况是,比如使用有限资源来进行处理,该资源紧张,但又需要在释放后及时重新响应,则可以考虑确认上条消息,再次重新发送一条一样的消息重新进入消息队列的方法,即忙碌时重新末尾排队。

总结

实际过程中事务的解决需要根据业务的特定来进行方案选择,而且也可能是一个长事务采用多种方案结合的方案,利用消息中间件是一种有效的降低复杂度和提升可维护性的方案,单采取该方案实现有明显的副作用,一是延迟,二是消息监控问题。

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

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

相关文章

【论文阅读笔记】Frequency Perception Network for Camouflaged Object Detection

1.论文介绍 Frequency Perception Network for Camouflaged Object Detection 基于频率感知网络的视频目标检测 2023年 ACM MM Paper Code 2.摘要 隐蔽目标检测(COD)的目的是准确地检测隐藏在周围环境中的目标。然而,现有的COD方法主要定位…

信息系统项目管理师0083:项目管理的重要性(6项目管理概论—6.2项目基本要素—6.2.2项目管理的重要性)

点击查看专栏目录 文章目录 6.2.2项目管理的重要性 6.2.2项目管理的重要性 项目管理就是将知识、技能、工具与技术应用于项目活动,以满足项目的要求。通过合理地应用并整合特定的项目管理过程,项目管理使组织能够有效并高效地开展项目。 有效的项目管理能…

Rust个人学习之Rust操作Mysql数据库

Rust 使用 mysql 的 crate 进行 mysql 的连接操作,特进行记录。 写在前面 如果想使用 mysql 需要在 CargoToml 文件中增加 mysql 的引用 [dependencies] chrono "0.4" mysql "*"连接数据库 数据库信息如下: 字段数据数据库地…

可靠的智能组网系统有哪些?

天联是一种可靠的智能组网解决方案,在现今复杂网络环境下具备明显的优势。本文将介绍天联组网以及其所带来的诸多优势。 天联组网的优势 天联组网具有以下优势,使其成为一种可靠的智能组网方案: 无网络限制:天联组网能够解决复杂…

Tire 字典树、前缀树

字典树(又称单词查找树或Trie树)是一种树形结构,它是哈希树的变种,通常用于统计、排序和保存大量的字符串(但不仅限于字符串)。字典树在搜索引擎系统中常用于文本词频统计。它的主要优点在于能够利用字符串…

每日一题(力扣213):打家劫舍2--dp+分治

与打家劫舍1不同的是它最后一个和第一个会相邻,事实上,从结果思考,最后只会有三种:1 第一家不被抢 最后一家被抢 2 第一家被抢 最后一家不被抢 3 第一和最后一家都不被抢 。那么,根据打家劫舍1中的算法 我们能算出在i…

excel办公系列-图表元素及其作用

Excel图表元素及其作用 Excel图表由各种元素组成,每个元素都有其特定的作用,可以帮助我们更清晰地传达数据信息。下面将介绍Excel图表中常见的一些元素及其作用,并附上相关截图。 原始数据 月份 网站访问量 (万次) 销售额 (万…

FIFO Generate IP核使用——Data Counts页详解

在Vivado IDE中,当看到一个用于设置数据计数选项的选项卡时,需要注意的是,尽管某些选项值可能因为当前的配置而显示为灰色(即不可选或已禁用),但IDE中显示的有效范围值实际上是你可以选择的真实值。即使某些…

opencv t函数

在OpenCV中&#xff0c;t函数通常用于转置矩阵&#xff08;Transpose&#xff09;。这意味着矩阵的行和列互换位置。 在C中&#xff0c;使用OpenCV库进行矩阵转置的代码如下所示&#xff1a; #include <opencv2/opencv.hpp> #include <iostream>int main() {// 创…

《十二》Qt各种对话框之FileDialog文件对话框及QMessageBox 消息对话框

QFileDialog 对话框 选择打开一个文件 若要打开一个文件&#xff0c;可调用静态函数 QFileDialog::getOpenFileName()&#xff0c;“打开一个文件”按钮的响应代码如下&#xff1a; void Dialog::on_btnOpen_clicked() { //选择单个文件QString curPathQDir::currentPath()…

基于React实现B站评论区

今天继续来学习一下React&#xff0c;使用React实现B站评论区&#xff0c;如下图&#xff1a; 在使用React开发类似B站评论区的功能时&#xff0c;我们需要考虑以下几个关键点来构建一个基本的评论系统&#xff1a; 1. 设计组件结构 首先&#xff0c;设计组件结构是关键。至少…

Unity Animation--动画剪辑

Unity Animation--动画剪辑 动画剪辑 动画剪辑是Unity动画系统的核心元素之一。Unity支持从外部来源导入动画&#xff0c;并提供创建动画剪辑的能力使用“动画”窗口在编辑器中从头开始。 外部来源的动画 从外部来源导入的动画剪辑可能包括&#xff1a; 人形动画 运动捕捉…

Python中关于子类约束的开发规范

Python中关于子类约束的开发规范 我们知道&#xff0c;在java和C#中有一种接口的类型&#xff0c;用来约束实现该接口的类&#xff0c;必须要定义接口中指定的方法 而在python中&#xff0c;我们可以基于父类子类异常来仿照着实现这个功能 class Base:def func():raise NotI…

css---浮动知识点精炼汇总

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 浮动简单理解与介绍 这是我们普通的页面标签效果。 每个标签从上到下依次排列。 浮动顾名思义就是让这个标签飞翔起来。 他飞起来后&#xff0c;后面的标签来到他的位置上。 而浮动的标签就会显示在标签的上面。…

设计模式之MVC模式

在编程江湖闯荡多年&#xff0c;我手中打磨过的设计模式多如繁星&#xff0c;但论及经典与实用&#xff0c; MVC&#xff08;Model-View-Controller&#xff09;模式 绝对是个中翘楚&#xff01;它不仅是Web应用的骨架&#xff0c;更是软件架构的智慧结晶。今天&#xff0c;咱们…

头歌:Spark案例剖析 - 谷歌网页排名引擎PageRank实战

第1关:海量数据导入:SparkSQL大数据导入处理 任务描述 工欲善其事必先利其器,大数据分析中最重要的是熟练掌握数据导入工具的使用方法。Spark SQL是Spark自带的数据库,本关你将应用Spark SQL的数据导入工具实现文本数据的导入。其中,graphx-wiki-vertices.txt文件中含有网…

010_redhat安装zookeeper

目录 1.环境准备2.下载上传zookeeper安装包1)[官网下载zookeeper-3.6.4安装包](https://archive.apache.org/dist/zookeeper/zookeeper-3.6.4/apache-zookeeper-3.6.4-bin.tar.gz)2)创建soft文件夹 3.解压4.配置启动1、配置zoo.cfg2、启动zookeeper 小结 1.环境准备 准备一台l…

如何创建一个 Django 应用并连接到数据库

简介 Django 是一个用 Python 编写的免费开源的 Web 框架。这个工具支持可扩展性、可重用性和快速开发。 在本教程中&#xff0c;您将学习如何为一个博客网站建立与 MySQL 数据库的初始基础。这将涉及使用 django-admin 创建博客 Web 应用程序的骨架结构&#xff0c;创建 MyS…

LeetCode-网络延迟时间(Dijkstra算法)

每日一题 今天刷到一道有关的图的题&#xff0c;需要求单源最短路径&#xff0c;因此使用Dijkstra算法。 题目要求 有 n 个网络节点&#xff0c;标记为 1 到 n。 给你一个列表 times&#xff0c;表示信号经过 有向 边的传递时间。 times[i] (ui, vi, wi)&#xff0c;其中 …

wordpress外贸独立站建站10要10不要

创建一个成功的WordPress外贸独立站需要注意很多因素。以下是zhanyes根据多年建站经验总结的wordpress外贸独立站建站的10个建议和10个避免的事项&#xff0c;以帮助您建立一个高质量的外贸网站&#xff1a; 10个要&#xff1a; 1. 要选择合适的域名&#xff1a;确保您的域名…