当前位置: 首页 > news >正文

Seata源码—1.Seata分布式事务的模式简介

大纲

1.Seata分布式事务框架简介

2.Seata AT模式实现分布式事务的机制

3.Seata AT模式下的写隔离机制

4.Seata AT模式下的读隔离机制

5.官网示例说明Seata AT模式的工作机制

6.Seata TCC模式的介绍以及与AT模式区别

7.Seata Saga模式的介绍

8.单服务多个库的分布式事务支持

9.Seata的AT、TCC、Saga三种模式对比

10.基于RocketMQ的可靠消息最终一致性事务

11.Seata官方分布式事务例子

1.Seata分布式事务框架简介

(1)Seata的特色功能

(2)Seata的术语

Seata是一款分布式事务解决方案,为用户提供了AT、TCC、SAGA和XA事务模式,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。

(1)Seata的特色功能

一.微服务框架集成支持

已支持Dubbo、Spring Cloud、Sofa-RPC、Motan和gRPC等RPC框架。

二.AT模式

提供无侵入自动补偿的事务模式,目前已支持MySQL、Oracle、PostgreSQL、TiDB和MariaDB。

三.TCC模式

支持TCC模式并可与AT混用,灵活度更高。

四.SAGA模式

为长事务提供的解决方案,提供编排式与注解式。

五.XA模式

支持已实现XA接口的数据库的XA模式,目前已支持MySQL、Oracle、TiDB和MariaDB。

六.高可用

支持计算分离集群模式,水平扩展能力强的数据库和Redis存储模式。

(2)Seata的术语

一.TC(Transaction Coordinator)—事务协调者

用来维护全局和分支事务的状态,驱动全局事务提交或回滚。

二.TM(Transaction Manager)—事务管理器

用来定义全局事务的范围:开始全局事务、提交或回滚全局事务。

三.RM(Resource Manager)—资源管理器

用来管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。

2.Seata AT模式实现分布式事务的机制

(1)前提

(2)整体机制

(1)前提

一.基于支持本地ACID事务的关系型数据库

二.Java应用 + 通过JDBC访问数据库

(2)整体机制

两阶段提交协议的演变:

一阶段:首先业务数据和回滚日志记录在同一个本地事务中提交,然后释放本地锁和连接资源。

二阶段:提交异步化,非常快速地完成,回滚通过一阶段的回滚日志进行反向补偿。

3.Seata AT模式下的写隔离机制

(1)Seata在AT模式下的写隔离机制

(2)Seata在AT模式下的写隔离例子

(3)Seata AT模式写隔离下的补偿执行

(4)为什么Seata AT模式要设计写隔离机制

(1)Seata在AT模式下的写隔离机制

一阶段本地事务提交前,需要确保先拿到全局锁。如果拿不到全局锁,就不能提交本地事务。拿全局锁的尝试被限制在一定时间范围内,超出时间范围将被放弃,并回滚本地事务,释放本地锁。

(2)Seata在AT模式下的写隔离例子

以一个示例来说明:两个全局事务tx1和tx2,分别对m字段进行更新操作,m的初始值是1000。

tx1先开始,开启本地事务,拿到本地锁,更新操作m=1000-100=900。本地事务提交前,先拿到该记录的全局锁 ,本地事务提交后释放本地锁。

tx2后开始,开启本地事务,拿到本地锁,更新操作m=900-100=800。本地事务提交前,尝试拿该记录的全局锁。

tx1全局提交前,该记录的全局锁被tx1持有,tx2需要重试等待获取全局锁。tx1二阶段全局提交,释放全局锁。tx2拿到全局锁后,提交其本地事务。

(3)Seata AT模式写隔离下的补偿执行

如果tx1的二阶段全局回滚,则tx1需要重新获取该数据的本地锁,进行反向补偿的更新操作,实现分支的回滚。

此时如果tx2仍在等待该数据的全局锁,同时持有本地锁,则tx1的分支回滚会失败,tx1的分支回滚会一直重试,直到tx2的全局锁等锁超时,需要放弃全局锁 + 回滚本地事务 + 释放本地锁,此时tx1的分支回滚才能最终成功。

(4)为什么Seata AT模式要设计写隔离机制

由于整个过程全局锁在tx1结束前一直是被tx1持有的,所以写隔离机制可以保证不会发生脏写的问题。

4.Seata AT模式下的读隔离机制

(1)Seata AT模式的读隔离机制介绍

(2)Seata AT模式的读隔离机制实现

(1)Seata AT模式的读隔离机制介绍

在数据库本地事务隔离级别读已提交(Read Committed)或以上的基础上,Seata AT模式的默认全局隔离级别是读未提交(Read Uncommitted)。

如果应用在特定场景下,必需要求全局的读已提交,目前Seata的方式是通过SELECT FOR UPDATE语句的代理来实现。

(2)Seata AT模式的读隔离机制实现

SELECT FOR UPDATE语句的执行会申请全局锁。如果全局锁被其他事务持有,则释放本地锁(回滚SELECT FOR UPDATE语句的本地执行)并重试。

在这个过程中,查询是被阻塞住的。直到拿到全局锁,即读取的相关数据是已提交的,才返回。

出于总体性能上的考虑,Seata目前的方案并没有对所有SELECT语句都进行代理,仅针对FOR UPDATE的SELECT语句。

5.官网示例说明Seata AT模式的工作机制

(1)一阶段的工作过程

(2)二阶段——回滚的工作过程

(3)二阶段——提交的工作过程

(4)使用Seata AT模式需要创建回滚日志表

以一个示例来说明整个AT分支的工作过程:

业务表:product

+-------+--------------+-------+
| Field | Type         | Key   |
+-------+--------------+-------+
| id    | bigint(20)   | PRI   |
+-------+--------------+-------+
| name  | varchar(100) |       |
+-------+--------------+-------+
| since | varchar(100) |       |
+-------+--------------+-------+

AT分支事务的业务逻辑:

update product set name = 'GTS' where name = 'TXC';

(1)一阶段的工作过程

步骤一:解析SQL得到SQL的类型、表、条件等相关的信息。比如类型是UPDATE、表是product、条件是where name = 'TXC'。

步骤二:查询前镜像。也就是根据解析得到的条件信息,生成查询语句,定位数据。

select id, name, since from product where name = 'TXC';//得到前镜像如下:
+-------+-------+-------+
| id    | name  | since |
+-------+-------+-------+
| 1     | TXC   |  2014 |
+-------+-------+-------+

步骤三:执行业务SQL。更新这条记录的name为'GTS'。

步骤四:查询后镜像。根据前镜像的结果,通过主键定位数据。

select id, name, since from product where id = 1;//得到后镜像如下:
+-------+-------+-------+
| id    | name  | since |
+-------+-------+-------+
| 1     | GTS   |  2014 |
+-------+-------+-------+

步骤五:插入回滚日志。把前后镜像数据以及业务SQL相关的信息组成一条回滚日志记录,插入到UNDO_LOG表中。

{"branchId": 641789253,"undoItems": [{"afterImage": {"rows": [{"fields": [{"name": "id","type": 4,"value": 1}, {"name": "name","type": 12,"value": "GTS"}, {"name": "since","type": 12,"value": "2014"}]}],"tableName": "product"},"beforeImage": {"rows": [{"fields": [{"name": "id","type": 4,"value": 1}, {"name": "name","type": 12,"value": "TXC"}, {"name": "since","type": 12,"value": "2014"}]}],"tableName": "product"},"sqlType": "UPDATE"}],"xid": "xid:xxx"
}

步骤六:提交前向TC注册分支。也就是申请product表中,主键值等于1的记录的全局锁。

步骤七:本地事务提交。业务数据的更新和前面步骤中生成的UNDO LOG一并提交。

步骤八:将本地事务提交的结果上报给TC

(2)二阶段——回滚的工作过程

步骤一:收到TC的分支回滚请求,开启一个本地事务执行如下操作。

步骤二:通过XID和Branch ID查找到相应的UNDO LOG记录。

步骤三:拿UNDO LOG中的后镜像与当前数据进行数据校验。如果有不同,说明数据被当前全局事务之外的动作做了修改。这种情况,需要根据配置策略来做处理。

步骤四:根据UNDO LOG中的前镜像和业务SQL信息生成并执行回滚语句。

步骤五:提交本地事务并把执行结果(即分支事务回滚的结果)上报给TC。

(3)二阶段——提交的工作过程

步骤一:收到TC的分支提交请求,把请求放入一个异步任务的队列中,然后马上返回提交成功的结果给TC。

步骤二:异步任务阶段执行分支提交请求,将异步和批量地删除相应UNDO LOG记录。

(4)使用Seata AT模式需要创建回滚日志表

CREATE TABLE `undo_log` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`branch_id` bigint(20) NOT NULL,`xid` varchar(100) NOT NULL,`context` varchar(128) NOT NULL,`rollback_info` longblob NOT NULL,`log_status` int(11) NOT NULL,`log_created` datetime NOT NULL,`log_modified` datetime NOT NULL,PRIMARY KEY (`id`),UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

6.Seata TCC模式的介绍以及与AT模式区别

(1)Seata TCC模式的介绍

(2)TCC模式与AT模式的区别

(1)Seata TCC模式的介绍

TCC = Try + Commit + Cancel。一个分布式的全局事务,整体是两阶段提交的模型。全局事务是由若干分支事务组成,分支事务要满足两阶段提交的模型要求。

即需要每个分支事务都具备自己的:一阶段Prepare行为(Try行为),二阶段Commit或Rollback行为(Commit + Cancel行为)。

(2)TCC模式与AT模式的区别

所谓TCC模式,是指支持把自定义的分支事务纳入到全局事务的管理中。其实一开始,Seata只有TCC模式,后来才加入AT模式。但TCC模式太麻烦了,每个功能都需要实现三套SQL逻辑,AT模式其实是对TCC模式的简化。

AT模式基于支持本地ACID事务的关系型数据库:

一阶段Prepare行为:在本地事务中,一起提交业务数据更新和相应回滚日志记录。

二阶段Commit行为:马上成功结束,自动 + 异步 + 批量清理回滚日志。

二阶段Rollback行为:通过回滚日志,自动生成补偿操作,完成数据回滚。

TCC模式则不依赖于底层数据资源的事务支持:

一阶段Prepare行为:调用自定义Prepare逻辑。

二阶段Commit行为:调用自定义Commit逻辑。

二阶段Rollback行为:调用自定义Rollback逻辑。

7.Seata Saga模式的介绍

Saga模式是Seata提供的长事务解决方案。在Saga模式中,业务流程中每个参与者都提交本地事务,当出现某一个参与者失败则补偿前面已经成功的参与者。一阶段正向服务和二阶段补偿服务都由业务开发实现。

Saga模式的正向服务可以理解成是TCC模式的Try阶段 + Commit阶段,逆向补偿服务可以理解成是TCC模式的Cancel阶段。

一.适用场景

场景一:业务流程长、业务流程多

场景二:无法提供TCC模式要求的三个接口

比如参与者包含其它公司,或者遗留的老系统服务。

二.优势

一阶段提交本地事务,无锁 + 高性能。

事件驱动架构,参与者可异步执行,高吞吐。

补偿服务易于实现。

三.缺点

不保证隔离性,写不隔离。

8.单服务多个库的分布式事务支持

单个服务对接了多个库。比如该服务处理一个请求时,需要更新多个数据库。分支事务是分布在多个数据库上的,并不是分布在多个服务上的。Seata也天然支持这种情况下的分布式事务。

每个数据库上的事务也都会到Seata上注册一个分支事务。注册之后,各个分支事务也和Seata的AT模式一样:申请本地锁 + 生成undo log + 申请全局锁 + 在其对应数据库上提交增删改。

9.Seata的AT、TCC、Saga三种模式对比

AT模式适用于底层存储都相同的情况,比如都是MySQL等。一般选用AT模式即可,简单方便。

TCC模式适用于底层存储是异构的情况,比如MySQL + Redis + ES等。TCC模式一般在try阶段写入一条数据并标记未生效状态,然后在commit阶段才正式标记为正常生效状态。

TCC模式最大的优点就是很灵活。即使事务失败了,try阶段写入的数据基本也不会影响线上业务。TCC模式特别适用于异构存储要支持事务的情况。

Saga模式适用于异构系统、长流程、改造成TCC特别复杂繁琐的情况。

10.基于RocketMQ的可靠消息最终一致性事务

同步事务:在Seata的AT、TCC、Saga中选一种。

异步事务:使用RocketMQ的事务机制或者自己实现一套最终一致性事务框架。

11.Seata官方分布式事务例子

https://seata.io/zh-cn/docs/user/quickstart.html

相关文章:

Seata源码—1.Seata分布式事务的模式简介

大纲 1.Seata分布式事务框架简介 2.Seata AT模式实现分布式事务的机制 3.Seata AT模式下的写隔离机制 4.Seata AT模式下的读隔离机制 5.官网示例说明Seata AT模式的工作机制 6.Seata TCC模式的介绍以及与AT模式区别 7.Seata Saga模式的介绍 8.单服务多个库的分布式事务…...

牛客——签到题

分析 我拿到题就去看了示例,可以发现,并非是让难度最小,或者难度系数出现次数最多的成为签到题的难度。那我就有点懵了。。。。。。 但仔细观察题目本身的特定条件和目标,即在满足选择 m 道题的前提下,尽可能多地选择…...

【idea】调试篇 idea调试技巧合集

前言:之前博主写过一篇idea技巧合集的文章,由于技巧过于多了,文章很庞大,所以特地将调试相关的技巧单独成章, 调试和我们日常开发是息息相关的,用好调试可以事半功倍 文章目录 1. idea调试异步线程2. idea调试stream流…...

k8s监控方案实践补充(一):部署Metrics Server实现kubectl top和HPA支持

k8s监控方案实践补充(一):部署Metrics Server实现kubectl top和HPA支持 文章目录 k8s监控方案实践补充(一):部署Metrics Server实现kubectl top和HPA支持一、Metrics Server简介二、Metrics Server实战部署…...

直流电机风速仪

在处理直流电机风速仪的 ADC 读取问题时,下面为你详细介绍实现方法。 硬件连接 风速仪的输出通常是模拟信号,所以需要把它连接到微控制器的 ADC 输入引脚。比如,在 Arduino 上可以连接到 A0 - A5 这类模拟输入引脚。 ADC 读取原理 风速仪…...

dify 连接不上ollama An error occurred during credentials validation:

三大报错 An error occurred during credentials validation: HTTPConnectionPool(hosthost.docker.internal, port11434): Max retries exceeded with url: /api/chat (Caused by NameResolutionError("<urllib3.connection.HTTPConnection object at 0x7f26fc3c00b0&…...

19、云端工业物联网生态组件 - 工厂能效与预测维护 - /数据与物联网组件/cloud-iiot-factory-analysis

76个工业组件库示例汇总 云端工业物联网生态组件 - 工厂能效与预测维护 (模拟) 概述 这是一个交互式的 Web 组件&#xff0c;旨在模拟一个云端工业物联网 (IIoT) 平台的核心界面&#xff0c;专注于工厂层面的能效分析和基于传感器数据的预测性维护概念。用户可以监控模拟的设…...

python打卡day25

python的异常处理机制 知识点回顾&#xff1a; 异常处理机制debug过程中的各类报错try-except机制try-except-else-finally机制 在即将进入深度学习专题学习前&#xff0c;我们最后差缺补漏&#xff0c;把一些常见且重要的知识点给他们补上&#xff0c;加深对代码和流程的理解。…...

Jmeter变量传递介绍

文章目录 一、Jmeter变量类型及作用域二、变量传递方式1. 用户定义变量&#xff08;User Defined Variables&#xff09;2. CSV 数据文件&#xff08;CSV Data Set Config&#xff09;3.正则表达式提取器4.后置处理器&#xff08;Post Processor)4.1BeanShell/JSR223 后置处理器…...

机器学习 Day16 聚类算法 ,数据降维

聚类算法 1.简介 1.1 聚类概念 无监督学习&#xff1a;聚类是一种无监督学习算法&#xff0c;不需要预先标记的训练数据 相似性分组&#xff1a;根据样本之间的相似性自动将样本归到不同类别 相似度度量&#xff1a;常用欧式距离作为相似度计算方法 1.2 聚类vs分类 聚类&…...

白日梦:一个方便快捷的将故事制作成视频的工具

我有故事&#xff0c;但我想把它制作成视频&#xff0c;有没有什么好用的工具可以使用呢&#xff1f;如果你也被类似的问题困扰&#xff0c;那么今天分享的这个工具将会解决这个问题。从需求来看&#xff0c;我们希望的是纯文本的故事输入&#xff0c;完整的故事视频输出&#…...

ultralytics中tasks.py---parse_model函数解析

一、根据scale获取对应的深度、宽度和最大通道数 具体例如yaml文件内容如下: depth=0.33,那么重复的模块例如C2f原本重复次数是3,6,6,3,那么T对应的模型重复次数就是三分之一即1,1,2,1次。这个在后面定义的: width=0.25,max_channels=1024 原本c2=64,但经过make_div…...

Codeforces Round 1003 (Div. 4)

A. Skibidus and Amog’u 题目大意 给你一个字符串&#xff0c;把末尾的us换成i 解题思路 删掉最后两个加上“i”即可 代码实现 #include <bits/stdc.h>using i64 long long;int main() {std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);int …...

基于RFSOC ZU28DR+DSP 6U VPX处理板

板卡概述 基于RFSOC ZU28DRDSP 6U VPX处理板&#xff0c;是一款基于6U VPX总线架构的高速信号处理平台&#xff0c;数模混合信号处理卡&#xff0c;采用 Xilinx ZYNQ UltraScale RFSoC ZU28DR和TI DSP TMS320C6678组合设计&#xff0c;两者之间通过4x 5G SRIO互联。本板卡可实…...

C# 通过脚本实现接口

以前C#脚本用的委托注入模式&#xff0c;今天在AI提示下&#xff0c;尝试用脚本直接实现接口&#xff0c;然后C#可以动态或指定新类型创建接口实现对象。从代码角度看&#xff0c;稍显复杂&#xff0c;但脚本方面显得更简洁和有条理。 引用包需要Microsoft.CodeAnalysis、Micro…...

代码随想录算法训练营Day58

力扣695.岛屿的最大面积【medium】 力扣827.最大人工岛【hard】 一、力扣695.岛屿的最大面积【medium】 题目链接&#xff1a;力扣695.岛屿的最大面积 视频链接&#xff1a;代码随想录 1、思路 和岛屿数量那道题很像&#xff0c;只是递归这边要多一个怎么计算面积&#xff0c…...

若依框架页面

1.页面地址 若依管理系统 2.账号和密码 管理员 账号admin 密码admin123 运维 账号yuwei 密码123456 自己搭建的地址方便大家学习&#xff0c;不要攻击哦&#xff0c;谢谢啊...

redis 缓存穿透,缓存击穿,缓存雪崩

一&#xff1a;什么是缓存 &#xff08;1&#xff09;计算机&#xff1a;cpu、内存、磁盘&#xff0c;cpu任何需要的数据都要从内容中读入数据放入cpu,从cup内部添加一个缓存 &#xff08;2&#xff09;web开发的每个阶段都可以添加缓存 &#xff08;3&#xff09;缓存优缺点&a…...

ORACLE查看归档是否打开

一、使用V$DATABASE视图 SELECT log_mode FROM v$database; 结果说明&#xff1a; ARCHIVELOG - 数据库处于归档模式 NOARCHIVELOG - 数据库处于非归档模式 二、 使用v$instance视图 SELECT archiver FROM v$instance; 结果说明&#xff1a; STARTED - 归档进程已启动(归档模…...

Python环境管理工具深度指南:pip、Poetry、uv、Conda

Python环境管理工具深度指南&#xff1a;pip、Poetry、uv、Conda Python开发中&#xff0c;环境管理和依赖管理是不可避开的重要话题。合理地管理项目的Python环境&#xff08;尤其是虚拟环境&#xff09;有助于隔离不同项目的依赖&#xff0c;避免版本冲突&#xff0c;并确保…...

高等数学第七章---微分方程(§7.4-§7.5可降阶的高阶微分方程、二阶线性微分方程)

7.4 可降阶的高阶微分方程 某些类型的高阶微分方程可以通过适当的变量代换&#xff0c;将其阶数降低&#xff0c;从而化为阶数较低的方程进行求解。 一、 y ( n ) f ( x ) y^{(n)}f(x) y(n)f(x) 型方程 特征&#xff1a;方程的左端是 y y y 的 n n n 阶导数&#xff0c;右…...

Jmeter对服务端进行压测快速上手

安装 下载 安装jmeter的之前必须先装有JDK 官网下载地址&#xff1a;https://archive.apache.org/dist/jmeter/binaries/ jmeter3.0的对应jdk1.7&#xff0c;jmeter4.0对应jdk1.8以上&#xff0c;否者启用jmeter也会报错 配置 配置环境变量 在系统变量PATH上加上: %JMET…...

【嵌入模型与向量数据库】

目录 一、什么是向量&#xff1f; 二、为什么需要向量数据库&#xff1f; 三、向量数据库的特点 四、常见的向量数据库产品 FAISS 支持的索引类型 vs 相似度 五、常见向量相似度方法对比 六、应该用哪种 七、向量数据库的核心逻辑 &#x1f50d; 示例任务&#xff1a;…...

鸿蒙OSUniApp 开发实时聊天页面的最佳实践与实现#三方框架 #Uniapp

使用 UniApp 开发实时聊天页面的最佳实践与实现 在移动应用开发领域&#xff0c;实时聊天功能已经成为许多应用不可或缺的组成部分。本文将深入探讨如何使用 UniApp 框架开发一个功能完善的实时聊天页面&#xff0c;从布局设计到核心逻辑实现&#xff0c;带领大家一步步打造专…...

React构建组件

React构建组件 React 组件构建方式详解 React 组件的构建方式随着版本迭代不断演进&#xff0c;目前主要有 函数组件 和 类组件 两种核心模式&#xff0c;并衍生出多种高级组件设计模式。以下是完整的构建方式指南&#xff1a; 文章目录 React构建组件React 组件构建方式详解…...

auto.js面试题及答案

以下是常见的 Auto.js 面试题及参考答案&#xff0c;涵盖基础知识、脚本编写、运行机制、权限、安全等方面&#xff0c;适合开发岗位的技术面试准备&#xff1a; 一、基础类问题 什么是 Auto.js&#xff1f;它的主要用途是什么&#xff1f; 答案&#xff1a; Auto.js 是一个…...

OPC UA + ABP vNext 企业级实战:高可用数据采集框架指南

&#x1f680;&#x1f4ca; OPC UA ABP vNext 企业级实战&#xff1a;高可用数据采集框架指南 &#x1f680; &#x1f4d1; 目录 &#x1f680;&#x1f4ca; OPC UA ABP vNext 企业级实战&#xff1a;高可用数据采集框架指南 &#x1f680;一、前言 &#x1f3af;二、系统…...

【springcloud学习(dalston.sr1)】Ribbon负载均衡(七)

该系列项目整体介绍及源代码请参照前面写的一篇文章【springcloud学习(dalston.sr1)】项目整体介绍&#xff08;含源代码&#xff09;&#xff08;一&#xff09; &#xff08;一&#xff09;Ribbon 负载均衡的理解 ribbon是一种客户端的负载均衡。类似于比如我们在火车站窗口…...

编程题 03-树1 树的同构【PAT】

文章目录 题目输入格式输出格式输入样例1&#xff08;对应图一&#xff09;输出样例1输入样例2&#xff08;对应图二&#xff09;输出样例2 题解解题思路完整代码 编程练习题目集目录 题目 给定两棵树 T 1 T_1 T1​ 和 T 2 T_2 T2​ 。如果 T 1 T_1 T1​ 可以通过若干次左右…...

团结引擎开源车模 Sample 发布:光照渲染优化 动态交互全面体验升级

光照、材质与交互效果的精细控制&#xff0c;通常意味着复杂的技术挑战&#xff0c;但借助 Shader Graph 14.1.0(已内置在团结引擎官方 1.5.0 版本中)&#xff0c;这一切都变得简单易用。通过最新团结引擎官方车模 Sample&#xff0c;开发者能切身感受到全新光照优化与编辑功能…...

Chrome安装最新vue-devtool插件

本vue-devtool版本是官方的 v7.6.8版本&#xff0c;兼容性好、功能齐全且稳定。 操作步骤&#xff1a; 方法一&#xff1a; 打开谷歌浏览器 --> 右上角三个点 --> 扩展程序 --> 管理扩展程序 --> 加载已解压的扩展程序&#xff0c; 然后选择解压后的文件夹即可。…...

鸿蒙OSUniApp打造多功能图表展示组件 #三方框架 #Uniapp

使用UniApp打造多功能图表展示组件 在当前移动应用开发领域&#xff0c;数据可视化已成为不可或缺的一部分。无论是展示销售数据、用户增长趋势还是其他业务指标&#xff0c;一个优秀的图表组件都能有效提升用户体验。UniApp作为一款跨平台开发框架&#xff0c;如何在其中实现…...

海量数据Top k 与查重问题

海量数据求top k 问题&#xff1a; - 求最大的前k个元素、求最小的前k个元素 - 求最大的第k个元素、求最小的第k个元素 解法&#xff1a; - 大根堆、小跟堆 -》 优先级队列&#xff08;priority_queue&#xff09; - 快速分割函数 priority_queue<int,vector<int>…...

Beats

Beats是一个开放源代码的数据发送器。我们可以把Beats作为一种代理安装在我 们的服务器上&#xff0c;这样就可以比较方便地将数据发送到Elasticsearch或者Logstash 中。Elastic Stack提供了多种类型的Beats组件。 Beats可以直接将数据发送到Elasticsearch或者发送到Logstash&a…...

微型PCB打样厂家选型指南

智能手机、可穿戴设备、医疗电子等高精尖领域&#xff0c;微型PCB&#xff08;印制电路板&#xff09;如同设备的“神经中枢”&#xff0c;承载着信号传输、电源分配、元件互联等核心功能。其设计精度与制造质量直接决定了产品的性能上限与可靠性。而打样环节&#xff0c;则是从…...

ISP有感自发

一、黑电平 由于传感器&#xff0c;即便在无光的情况下&#xff0c;依然会产生微小的暗电流&#xff0c;这些暗电流可能是噪点会影响后期的调试。因此&#xff0c;我们便将这些电流处理为0&#xff0c;成为纯黑的颜色。可以在源头消除这些误差。 如何矫正黑电平&#xff1a; …...

编程技能:字符串函数04,直接使用 strcpy,解决报错

专栏导航 本节文章分别属于《Win32 学习笔记》和《MFC 学习笔记》两个专栏&#xff0c;故划分为两个专栏导航。读者可以自行选择前往哪个专栏。 &#xff08;一&#xff09;WIn32 专栏导航 上一篇&#xff1a;编程技能&#xff1a;字符串函数03&#xff0c;strncpy 回到目录…...

网络编程超时检测,unix域套接字,粘包

刷题&#xff1a; # 超时检测核心要点## 1. 基本类型### 阻塞模式- 永久等待数据&#xff0c;无超时机制- 典型函数&#xff1a;recv()阻塞调用### 非阻塞模式- 立即返回结果&#xff08;成功/错误&#xff09;- 设置方式&#xff1a;fcntl(fd, F_SETFL, O_NONBLOCK)### 超时检…...

springboot AOP 接口限流(基于IP的接口限流和黑白名单)

使用 Spring Boot 自定义注解和AOP实现基于IP的接口限流和黑白名单 在我们日常开发的项目中为了保证系统的稳定性&#xff0c;很多时候我们需要对系统做限流处理&#xff0c;它可以有效防止恶意请求对系统造成过载。常见的限流方案主要有&#xff1a; 网关限流&#xff1a; NG…...

Python uv包管理器使用指南:从入门到精通

Python uv包管理器使用指南&#xff1a;从入门到精通 作为一名Python开发者&#xff0c;你是否曾经为虚拟环境管理和依赖包安装而头疼&#xff1f;今天我要向大家介绍一个强大的工具——uv包管理器&#xff0c;它将彻底改变你的Python开发体验。 什么是uv包管理器&#xff1f…...

【计算机网络】TLS中的对称加密和非对称加密的应用,应对第三方抓包的双向https认证

TLS工作流程简化版 证书验证流程 客户端通过CA的公钥验证服务器数字证书的签名&#xff0c;确保服务器身份可信&#xff0c;防止中间人攻击。 预主密钥加密传输 客户端生成预主密钥&#xff0c;用服务器证书中的公钥加密后发送给服务器&#xff0c;只有服务器&#xff08;持有…...

Stable Diffusion WebUI 插件大全:功能详解与下载地址

Stable Diffusion WebUI 的强大之处在于其丰富的插件生态&#xff0c;这些插件可以大幅提升 AI 绘画的效率和质量。本文将详细介绍 21 个常用插件&#xff0c;包括它们的功能、效果说明以及下载地址&#xff0c;帮助你更好地使用 Stable Diffusion WebUI。 插件的安装方式 直…...

【行为型之策略模式】游戏开发实战——Unity灵活算法架构的核心实现策略

文章目录 &#x1f3ae; 策略模式&#xff08;Strategy Pattern&#xff09;深度解析一、模式本质与核心价值二、经典UML结构三、Unity实战代码&#xff08;动态伤害计算系统&#xff09;1. 定义策略接口与上下文2. 实现具体策略3. 客户端使用 四、模式进阶技巧1. 策略组合2. 策…...

第二十九节:直方图处理-直方图均衡化

在数字图像处理中,直方图均衡化(Histogram Equalization)是一种经典的对比度增强技术。它通过重新分配图像像素的亮度值,使图像的灰度级分布更加均匀,从而显著提升图像的视觉效果。 一、直方图基础 1.1 什么是直方图? 直方图(Histogram)是图像处理中用于描述图像像素…...

性能比拼: Nginx vs. Envoy

本内容是对知名性能评测博主 Anton Putra Nginx vs. Envoy performance benchmark 内容的翻译与整理, 有适当删减, 相关指标和结论以原作为准 Envoy 被设计为服务网格中的高性能代理。 你可以将它部署在虚拟机&#xff08;VM&#xff09;中&#xff0c;或作为 sidecar 方式部…...

在 C 语言中,U、UL、ULL、L、LL 等符号使用说明

在 C 语言中&#xff0c;U、UL、ULL、L、LL 等符号是用于明确指定整数字面量类型的后缀&#xff0c;其核心作用是避免数据类型隐式转换导致的溢出或未定义行为。以下是具体分类和使用场景&#xff1a; 一、整数字面量后缀分类 后缀全称适用场景示例说明Uunsigned100U无符号整数…...

一般枚举题目合集

一般枚举题目合集 枚举NOIP 2011 提高组 铺地毯P2327 [SCOI2005] 扫雷蓝桥真题 跑步蓝桥真题 猜年龄 二进制枚举常用的技巧整理子集 - 力扣P10449 费解的开关UVA11464 Even Parity通过Virtual Judge提交代码正解 日期枚举蓝桥真题 跑步NOIP 2016 普及组 回文日期日期统计 写这段…...

MCP(Model Context Protocol,模型上下文协议)

1. 起因&#xff0c; 目的: MCP, 貌似最近很火&#xff0c;简单了解一下&#xff0c; 跟上时代节奏。看似是一个工具&#xff0c;一个新概念&#xff0c;其实是个鸡肋&#xff08;仅仅代表个人观点&#xff09;。 2. 先看效果 这里插入图片 3. 过程: 问题1, 什么是 MCP h…...

MQTT 在Spring Boot 中的使用

在 Spring Boot 中使用 MQTT 通常会借助 Spring Integration 项目提供的 MQTT 支持。这使得 MQTT 的集成可以很好地融入 Spring 的消息驱动和企业集成模式。 以下是如何在 Spring Boot 中集成和使用 MQTT 的详细步骤&#xff1a; 前提条件&#xff1a; MQTT Broker&#xff…...

uniapp使用全局组件,

在 Uniapp 中&#xff0c;如果你的组件是应用层组件&#xff08;例如全局悬浮按钮、全局通知栏等&#xff09;&#xff0c;并且希望它自动出现在所有页面而无需在每个页面模板中手动添加组件标签&#xff0c;可以通过以下两种方案实现&#xff1a; 方案一&#xff1a;通过 app.…...