Apache Seata新特性支持 -- undo_log压缩
本文来自 Apache Seata官方文档,欢迎访问官网,查看更多深度文章。
本文来自 Apache Seata官方文档,欢迎访问官网,查看更多深度文章。
Apache Seata新特性支持 – undo_log压缩
Seata新特性支持 – undo_log压缩
现状 & 痛点
对于Seata而言,是通过记录DML操作的前后的数据用于进行后续可能的回滚操作的,并且把这些数据保存到数据库的一个blob的字段里面。对于批量插入,更新,删除等操作,其影响的行数可能会比较多,拼接成一个大的字段插入到数据库,可能会带来以下问题:
- 超出数据库单次操作的最大写入限制(比如MySQL的max_allowed_package参数);
- 较大的数据量带来的网络IO和数据库磁盘IO开销比较大。
头脑风暴
对于第1点的问题,可以根据业务的实际情况,调大max_allowed_package参数的限制,从而避免出现query is too large的问题;对于第2点,可以通过提高带宽和选用高性能的SSD作为数据库的存储介质。
以上都是通过外部方案或者加钱方案去解决的。那么有没有框架层面解决方案以解决上面的痛点?
此时结合到以上的痛点出现的根源,在于生成的数据字段过大。为此,如果可以把对应的数据进行业务方压缩之后,再进行数据传输以及落库,理论上也可以解决上面的问题。
可行性分析
结合以上头脑风暴的内容,考虑在实际开发中,当需要进行大批量操作的时候,大多会选在较少用户操作,并发相对较低的时间点执行,此时CPU,内存等资源可以相对占用多一点以快速完成对应的操作。因此,可以通过消耗CPU资源和内存资源,来对对应的回滚的数据进行压缩,从而缩小数据传输和存储的大小。
此时,还需要证明以下两件事:
- 经过压缩之后,可以减少网络IO和数据库磁盘IO的压力,这里可以采用数据压缩+落库完成的总时间作为侧面参考指标。
- 经过压缩之后,数据大小跟原来比较的压缩效率有多高,这里使用压缩前后的数据大小来作为指标。
压缩网络用时指标测试:

压缩比测试:

通过以上的测试结果,可以明显的看出,使用gzip或zip进行压缩的情况下,可以较大程度的减少数据库的压力和网络传输的压力,同时也可以较大幅度的减少保存的数据的大小。
实现
实现思路

部分代码
properties配置:
# 是否开启undo_log压缩,默认为true
seata.client.undo.compress.enable=true
# 压缩器类型,默认为zip,一般建议都是zip
seata.client.undo.compress.type=zip
# 启动压缩的阈值,默认为64k
seata.client.undo.compress.threshold=64k
判断是否开启了undo_log压缩功能以及是否达到压缩的阈值:
protected boolean needCompress(byte[] undoLogContent) {// 1. 判断是否开启了undo_log压缩功能(1.4.2默认开启)// 2. 判断是否达到了压缩的阈值(默认64k)// 如果都满足返回需要对对应的undoLogContent进行压缩return ROLLBACK_INFO_COMPRESS_ENABLE && undoLogContent.length > ROLLBACK_INFO_COMPRESS_THRESHOLD;
}
确定需要压缩后,对undo_log进行压缩:
// 如果需要压缩,对undo_log进行压缩
if (needCompress(undoLogContent)) {// 获取压缩类型,默认zipcompressorType = ROLLBACK_INFO_COMPRESS_TYPE;// 获取对应的压缩器,并且进行压缩undoLogContent = CompressorFactory.getCompressor(compressorType.getCode()).compress(undoLogContent);
}
// else 不需要压缩就不需要做任何操作
将压缩类型同步保存到数据库,供回滚时使用:
protected String buildContext(String serializer, CompressorType compressorType) {Map<String, String> map = new HashMap<>();map.put(UndoLogConstants.SERIALIZER_KEY, serializer);// 保存压缩类型到数据库map.put(UndoLogConstants.COMPRESSOR_TYPE_KEY, compressorType.name());return CollectionUtils.encodeMap(map);
}
回滚时解压缩对应的信息:
protected byte[] getRollbackInfo(ResultSet rs) throws SQLException {// 获取保存到数据库的回滚信息的字节数组byte[] rollbackInfo = rs.getBytes(ClientTableColumnsName.UNDO_LOG_ROLLBACK_INFO);// 获取压缩类型// getOrDefault使用默认值CompressorType.NONE来兼容1.4.2之前的版本直接升级1.4.2+String rollbackInfoContext = rs.getString(ClientTableColumnsName.UNDO_LOG_CONTEXT);Map<String, String> context = CollectionUtils.decodeMap(rollbackInfoContext);CompressorType compressorType = CompressorType.getByName(context.getOrDefault(UndoLogConstants.COMPRESSOR_TYPE_KEY,CompressorType.NONE.name()));// 获取对应的压缩器,并且解压缩return CompressorFactory.getCompressor(compressorType.getCode()).decompress(rollbackInfo);
}
结语
通过对undo_log的压缩,在框架层面,进一步提高Seata在处理数据量较大的时候的性能。同时,也提供了对应的开关和相对合理的默认值,既方便用户进行开箱即用,也方便用户根据实际需求进行一定的调整,使得对应的功能更适合实际使用场景。
相关文章:
Apache Seata新特性支持 -- undo_log压缩
本文来自 Apache Seata官方文档,欢迎访问官网,查看更多深度文章。 本文来自 Apache Seata官方文档,欢迎访问官网,查看更多深度文章。 Apache Seata新特性支持 – undo_log压缩 Seata新特性支持 – undo_log压缩 现状 & 痛点…...
Java中的软件架构重构与升级策略
Java中的软件架构重构与升级策略 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 重构与升级的背景和意义 软件架构在应用开发中起着至关重要的作用。随着技术…...
设置Docker中时区不生效的问题
项目中使用docker-compose,并通过以下方式设置了时区 environment:- SET_CONTAINER_TIMEZONEtrue- CONTAINER_TIMEZONEAsia/Shanghai 但是并没有正确生效,网上有很多博客都在推荐这个做法,另外一种是使用标准环境标量 -TZAsia/Shangehai …...
LeetCode436:寻找右区间
题目链接:436. 寻找右区间 - 力扣(LeetCode) class Solution { public:vector<int> findRightInterval(vector<vector<int>>& intervals) {vector<pair<int, int>> startIntervals;int n intervals.size…...
前端JS特效第22集:html5音乐旋律自定义交互特效
html5音乐旋律自定义交互特效,先来看看效果: 部分核心的代码如下(全部代码在文章末尾): <!DOCTYPE html> <html lang"en" > <head> <meta charset"UTF-8"> <title>ChimeTime™</title…...
pyrender 离线渲染包安装教程
pyrender 离线渲染包安装教程 安装 安装 官方安装教程:https://pyrender.readthedocs.io/en/latest/install/index.html#installmesa 首先 pip install pyrenderclang6.0安装 下载地址:https://releases.llvm.org/download.html#6.0.0 注意下好是叫:clangllvm-6…...
XSS平台的搭建
第一步:安装MySQL 数据库 因为xss平台涉及到使用mysql 数据库,在安装之前,先使用docker 安装mysql 数据库。 docker run --name mysqlserver -e MYSQL_ROOT_PASSWORD123 -d -i -p 3309:3306 mysql:5.6 第二步:安装xssplatform…...
【持续集成_03课_Jenkins生成Allure报告及Sonar静态扫描】
1、 一、构建之后的配置 1、安装allure插件 安装好之后,可以在这里搜到已经安装的 2、配置allure的allure-commandline 正常配置,是要么在工具里配置,要么在系统里配置 allure-commandline是在工具里进行配置 两种方式进行配置 1ÿ…...
PageHelper分页查询遇到的小问题
如果我们是这样子直接查询 pagehelper会拼接导我们的sql语句之后 这样子我们搜索出来的list,就是里面参杂了PageHelper的东西 所以我们可以直接转成我们的Page类型 但是如果我们搜索出来的是List<Blog>,我有些信息不想返回给前端,所以…...
【Python】组合数据类型:序列,列表,元组,字典,集合
个人主页:【😊个人主页】 系列专栏:【❤️Python】 文章目录 前言组合数据类型序列类型序列常见的操作符列表列表操作len()append()insert()remove()index()sort()reverse()count() 元组三种序列类型的区别 集合类型四种操作符集合setfrozens…...
algorithm算法库学习之——不修改序列的操作
algorithm此头文件是算法库的一部分。本篇介绍不修改序列的操作函数。 不修改序列的操作 all_ofany_ofnone_of (C11)(C11)(C11) 检查谓词是否对范围中所有、任一或无元素为 true (函数模板) for_each 应用函数到范围中的元素 (函数模板) for_each_n (C17) 应用一个函数对象到序…...
idea创建的maven项目pom文件引入的坐标报红原因
如下所示 我们在引入某些依赖坐标的时候,即使点击了右上角的mavne刷新之后还是报红。 其实这是正常现象,实际上是我们的本地仓库当中没有这些依赖坐标,而idea就会通过报红来标记这些依赖来说明在我们的本地仓库是不存在的。 那有的同学就会…...
Python面试题:Python 中的生成器(generator)是什么?有什么优点?
在Python中,生成器(generator)是一种特殊的迭代器,使用yield关键字生成值,可以逐个生成序列中的值,而不需要一次性将所有值加载到内存中。生成器函数在定义时使用def关键字,并包含一个或多个yie…...
Go语言--复合类型之map、结构体
map Go 语言中的 map(映射、字典)是一种内置的数据结构,它是一个无序的 key-value 对的集合,比如以身份证号作为唯一键来标识一个人的信息。 格式 map [keyType]valueType 在一个 map 里所有的键都是唯一的,而且必须是支持和!操作符的类型…...
Stable Diffusion图像的脸部细节控制——采样器全解析
文章目录 艺术地掌控人物形象好易智算原因分析为什么在使用Stable Diffusion生成全身图像时,脸部细节往往不够精细? 解决策略 局部重绘采样器总结 艺术地掌控人物形象 在运用Stable Diffusion这一功能强大的AI绘图工具时,我们往往会发现自己…...
CurrentHashMap巧妙利用位运算获取数组指定下标元素
先来了解一下数组对象在堆中的存储形式【数组长度,数组元素类型信息等】 【存放元素对象的空间】 Ma 基础信息实例数据内存填充Mark Word,ClassPointer,数组长度第一个元素第二个元素固定的填充内容 所以我们想要获取某个下标的元素首先要获取这个元素的起始位置…...
实现antd designable平台的组件拖拽功能
平台:designable设计器 github:designable 目录 1 背景2 技术栈3 组件拖拽和放置3.1 类型定义3.2 拖拽3.3 放置 1 背景 由于业务需求,我们需要实现designable平台的一个简易版的组件拖拽功能。 #mermaid-svg-QrxSDGe9YyGG3LbQ {font-family:…...
计算机网络-IP组播基础
一、概述 在前面的学习交换机和路由协议,二层通信是数据链路层间通信,在同一个广播域间通过源MAC地址和目的MAC地址进行通信,当两台主机第一次通信由于不清楚目的MAC地址需要进行广播泛洪,目的主机回复自身MAC地址,然后…...
Git删除了文件拉取时失败
本地删除了一些文件,远端的另一个提交修改了被删除的文件,vs里拉取时提示未处理的提交,无法继续操作,git gui里显示很多unstaged change的项 解决办法: 1、用git bash的git rm --cached filename或 git rm -r --cached…...
【面向就业的Linux基础】从入门到熟练,探索Linux的秘密(十二)-管道、环境变量、常用命令
大致介绍了一下管道、环境变量、一些常用的基本命令,可以当作学习笔记收藏学习一下!!! 文章目录 前言 一、管道 二、环境变量 1.概念 2.查看 3.修改 4.常用环境变量 三、系统状况 总结 前言 大致介绍了一下管道、环境变量、一些常…...
科哥镜像实测:CAM++说话人识别系统快速部署与核心功能体验
科哥镜像实测:CAM说话人识别系统快速部署与核心功能体验 1. 引言:当声音成为身份密码 想象一下,你手头有一段重要的电话录音,需要确认通话双方是否是同一个人。或者,你管理着一个庞大的音频资料库,需要自…...
MusePublic圣光艺苑入门必看:‘凝光成影’技术白皮书——光照建模原理简析
MusePublic圣光艺苑入门必看:‘凝光成影’技术白皮书——光照建模原理简析 “见微知著,凝光成影。在星空的旋律中,重塑大理石的尊严。” 1. 从画室到算法:光照建模的艺术与科学 当你站在一幅梵高的《星空》前,是否曾好…...
实战演练:如何利用SQLMap快速检测银行储物柜管理系统的CVE-2023-0562漏洞
实战指南:SQLMap在银行储物柜管理系统漏洞检测中的高效应用 银行储物柜管理系统作为金融机构关键基础设施,其安全性直接关系到客户资产安全。近年来曝光的CVE-2023-0562漏洞再次提醒我们,即使是基础防护措施也可能存在致命缺陷。本文将手把手…...
保姆级教程:在PHPStudy环境下复现CTFHub MySQL注入题(附WAF绕过Payload分析)
从零构建MySQL注入实验环境:PHPStudy靶场搭建与Quine攻击实战 第一次接触SQL注入时,我盯着屏幕上那个看似简单的登录框,完全无法理解黑客是如何通过几个特殊字符就能突破系统防线的。直到亲手搭建环境、逐行调试代码后,才真正明白…...
Linux文件传输利器SCP命令使用详解与实战技巧
在Linux系统管理和运维中,文件传输是日常高频操作之一。无论是本地与远程服务器之间的数据同步,还是跨服务器直接传输文件,scp(Secure Copy Protocol)都是最常用的工具之一。它基于SSH协议,提供加密传输能力…...
24小时无人值守:OpenClaw+Phi-3-vision-128k-instruct自动化监控系统
24小时无人值守:OpenClawPhi-3-vision-128k-instruct自动化监控系统 1. 为什么需要自动化监控系统 去年我负责一个内部数据看板项目时,经常遇到凌晨突发故障却无人值守的情况。直到第二天上班才发现问题,损失了宝贵的响应时间。传统监控工具…...
Windows系统安装OpenClaw详解:千问3.5-9B模型联调避坑指南
Windows系统安装OpenClaw详解:千问3.5-9B模型联调避坑指南 1. 为什么选择OpenClaw千问3.5-9B组合 去年我在尝试自动化办公流程时,发现市面上的RPA工具要么功能臃肿,要么需要将敏感数据上传到云端。直到遇到OpenClaw这个开源框架,…...
【AI实战项目】项目二:语言模型构建与应用实战
分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请轻击人工智能教程https://www.captainai.net/troubleshooter 项目背景: 在当今AI蓬勃发展的时代,语⾔模…...
vLLM-v0.17.1效果展示:多LoRA热切换,支持10+垂类模型动态加载
vLLM-v0.17.1效果展示:多LoRA热切换,支持10垂类模型动态加载 1. vLLM框架核心能力 vLLM是一个专为大型语言模型(LLM)设计的高性能推理和服务库,最初由加州大学伯克利分校的天空计算实验室开发,现已发展成为社区驱动的开源项目。…...
罕见模式检测新突破:docta的rare_score算法原理与实现
罕见模式检测新突破:docta的rare_score算法原理与实现 【免费下载链接】docta A Doctor for your data 项目地址: https://gitcode.com/gh_mirrors/do/docta 在数据科学领域,识别和处理罕见模式一直是一项极具挑战性的任务。docta作为一款专注于数…...
