【分布式理论11】分布式协同之分布式事务(一个应用操作多个资源):从刚性事务到柔性事务的演进
文章目录
- 一. 什么是分布式事务?
- 二. 分布式事务的挑战
- 三. 事务的ACID特性
- 四. CAP理论与BASE理论
- 1. CAP理论
- 1.1. 三大特性
- 1.2. 三者不能兼得
- 2. BASE理论
- 五. 分布式事务解决方案
- 1. 两阶段提交(2PC)
- 2. TCC(Try-Confirm-Cancel)
- 六. 小结
之前我们了解分布式系统中的互斥问题及其解决方案(分布式锁)。互斥问题讨论的是多个进程对同一个临界资源进行操作的问题,而本文将要讨论的是同一个进程对多个临界资源进行操作的问题。
一. 什么是分布式事务?
简单来说,分布式事务就是跨多个独立的资源(比如数据库)进行的事务。
举个例子,假设一个银行系统需要处理一次转账操作:从A账户转出100元分别到B账户30元、C账户70元。这种操作不仅仅涉及到一个数据库,而是涉及多个资源(A账户、B账户、C账户)。这个转账操作要么完全成功,所有的账户变动都要完成;要么完全失败,没有任何账户被修改。类似这样的跨多个资源的事务,我们称之为分布式事务。
二. 分布式事务的挑战
在分布式系统中,跨多个服务和数据库执行的事务面临以下几个挑战:
- 一致性问题:如何保证数据在多个系统中保持一致?
- 网络故障:网络不稳定可能导致事务执行失败,如何保证事务不会中途丢失或被错误提交?
- 并发冲突:多个服务之间并发执行的事务如何互不干扰?
为了处理这些挑战,分布式事务采用了不同的理论和技术框架来确保数据一致性、可用性和事务的正确性。
三. 事务的ACID特性
分布式事务的核心目标是保证事务的一致性和完整性,这与单体应用中的ACID特性密切相关。ACID是事务管理的基本要求,包含以下四个特性:
- 原子性(Atomicity):事务中的所有操作要么全部成功,要么全部失败,不能部分成功。
- 一致性(Consistency):事务执行前后的数据一致,系统从一个一致性状态转变到另一个一致性状态。比如:从 A 账户转出 100元,B 账户中到账 30 元,C 账户中到账 70 元。完成这个事务操作以后,A 账户减少的钱数与 B、C 账户增加的钱数总和应该是一样的,都是 100 元。
- 隔离性(Isolation):并发执行的事务互不干扰,每个事务对外界是隔离的。
- 持久性(Durability):一旦事务提交,数据更改就会永久保存,即使系统崩溃也不丢失。
在单体架构中,ACID特性易于实现,但在分布式系统中,由于网络延迟、节点故障等问题,保证强一致性变得困难。此时,我们需要更灵活的解决方案。
四. CAP理论与BASE理论
1. CAP理论
1.1. 三大特性
在分布式系统中,由于网络和硬件的限制,无法同时保证一致性、可用性和分区容错性,这就是著名的CAP理论的核心思想。CAP理论提出,在一个分布式系统中,最多只能保证以下两个特性:
-
一致性(Consistency):所有节点的视图是相同的,保证每个节点的数据在同一时刻一致。
-
可用性(Availability):可用性是指在分布式系统中,即使一部分节点出现故障,系统仍然可以响应用户的请求。
- 分区容错性(Partition tolerance):假设两个数据库节点(每个节点数据一致)分布在两个区,而这两个区的通信发生了问题,因此无法达成数据一致,这就是分区问题,此时需要从一致性和可用性之间做出选择。是选择一致性(C),等待两个区的数据同步了再去获取数据,还是选择可用性(A),只获取其中一个区的数据?
1.2. 三者不能兼得
CAP理论表明,当网络分区发生时,分布式系统必须在一致性和可用性之间做出选择。如下例子:
业务代码对两个节点的通信失败,往数据库 01 写入记录 A 时,需要锁住数据库02 中的记录 A,不让其他业务代码修改此纪录,直到数据库 01 修改完成。一致性和可用性在此刻是矛盾的,不能兼得。
保证特性 | 放弃特性 | 适用场景 | 说明 |
---|---|---|---|
一致性、可用性 | 分区容错性 | 不适用(无法实现) | 如果放弃分区容错性,就等于放弃使用分布式系统,即单体。 |
一致性、分区容错性 | 可用性 | 金融领域(如银行、支付系统等) | 需要保证数据一致性,甚至在网络分区时也要牺牲系统可用性,保证交易数据的正确性和一致性。 |
可用性、分区容错性 | 一致性 | ToC端应用(如电商网站、社交平台等) | 强调用户体验,牺牲部分一致性以换取系统高可用性,允许数据暂时不一致。适合大流量和高并发的应用场景。 |
2. BASE理论
由于 CAP 理论导致一个应用同时至多只能支持两个特性,无法三全其美,且高并发系统追求的往往是可用性,因此对 CAP 理论进行进一步扩充,产生了 BASE 理论。
特性 | 说明 | 举例 |
---|---|---|
基本可用性 | 系统能够在流量激增或节点故障时,通过限流或降级保证用户请求可用。 | 电商系统在流量激增时,优先保证核心业务(如订单处理),将非核心业务降级处理。 |
软状态 | 数据副本之间允许存在短时间的数据不一致,容忍数据同步延迟。 | 数据库01中记录A写入后,数据库02中的记录B会在一定延迟后同步,而不是立即同步。 |
最终一致性 | 数据在短时间内可能不一致,但过了一段时间后,数据会最终达到一致。 | 在分布式系统中,数据副本可能会在网络延迟时出现不一致,但经过一段时间,数据会同步一致。 |
BASE理论强调的是最终一致性,而不是传统数据库中的强一致性。它适用于那些需要高可用性和容忍短期不一致的系统,例如电商平台和社交网络。
五. 分布式事务解决方案
为了在分布式系统中保证事务的正确性,业界提出了多种分布式事务解决方案,常见的有两阶段提交(2PC) 和 TCC(Try、Confirm、Cancel)。
1. 两阶段提交(2PC)
**两阶段提交协议(2PC)的基本思想是通过协调者(Transaction Manager)和参与者(Resource Manager)来控制事务的提交或回滚。2PC的工作过程分为两个阶段:
准备阶段:
事务协调者(事务管理器)询问每个参与者是否准备好,马上要执行事务了。事务参与者会根据自身业务和资源情况进行检查,然后给出反馈。
检查过程根据业务内容的不同而不同,例如订票业务需要检查是否有剩余票、扣款业务需要检查余额是否足够。只有检查通过,才能返回就绪(ready)信息。否则,事务将终止,并且等待下次询问。由于检查过程需要完成一些操作,因此需要写 redo 日志和 undo 日志,以便事务失败重试,或者失败回滚时使用。
提交阶段:
如下图:如果事务协调者接收到事务参与者检查失败或者超时的消息,会给其发送回滚(rollback)消息,否则发送提交(commit)消息。
以下是整理后的两种情况的处理过程:
情况 | 步骤 |
---|---|
情况 1:事务回滚 | 条件:只要有一个事务参与者反馈未就绪(no ready),事务协调者会回滚事务。 |
1. 事务协调者向所有事务参与者发出回滚请求。 | |
2. 事务参与者使用第一阶段的 undo 日志信息执行回滚操作,并释放事务期间占用的资源。 | |
3. 各事务参与者向事务协调者反馈应答(ack)消息,表示完成回滚操作。 | |
4. 事务协调者接收到所有事务参与者的应答消息,即完成事务回滚。 | |
情况 2:事务提交 | 条件:当所有事务参与者均反馈就绪(ready)消息时,事务协调者会提交事务。 |
1. 事务协调者向所有事务参与者发出正式提交事务的请求。 | |
2. 事务参与者执行提交(commit)操作,并释放事务期间占用的资源。 | |
3. 各事务参与者向事务协调者反馈应答(ack)消息,表示完成提交操作。 | |
4. 事务协调者接收到所有事务参与者的应答(ack)消息,即完成事务提交。 |
尽管2PC简单易理解,但它存在问题,比如在网络分区或故障情况下,可能会导致事务挂起,无法继续提交或回滚,造成数据不一致。
2. TCC(Try-Confirm-Cancel)
TCC(Try-Confirm-Cancel)的核心思想是对于每个资源的原子操作,应用程序都需要注册一个与此操作对应的确认操作和补偿(撤销)操作。其中确认操作负责在原子操作执行成功时进行事务提交,补偿操作负责在原子操作执行失败时对事务进行回滚。
TCC协议分为三个阶段:
- Try阶段:进行资源的预检查和预留,确保资源可用。
- Confirm阶段:负责对业务系统做确认提交。如果 Try 阶段执行成功,表明针对资源的操作已经准备就绪,此时执行 Confirm 便会提交对资源的操作。也就是说当资源准备好时,只用提交该操作执行就好了。
- Cancel阶段:负责在业务执行错误,需要回滚时执行业务取消操作,此时就需要释放 Try 阶段预留的资源了。换句话说,是在资源操作执行失败的情况下,根据之前预留的资源情况进行回滚。
TCC协议通过提供灵活的补偿机制,能够在事务失败时进行回滚,保证系统的一致性。
例子:
假设有一个转账服务,需要把 A 银行中 A 账户的 100 元分别转到 B 银行的 B 账户和 C 银行的 C 账户,这三个银行的转账服务各不相同,因此这次转账服务就形成了一次分布式事务。
阶段 | 操作描述 | 具体步骤 |
---|---|---|
Try 阶段 | 检测资源是否可用,验证所有参与者的资源可用性,并记录相关信息。 | 1. 检查 A 账户余额是否大于 100 元。 2.记录 A 账户的总金额、转出金额。 3. 记录 B、C 账户的总金额、转入金额。 4. 在数据库中保存相关字段(如余额、转出金额)。 5. 如果资源可用,进入 Confirm 阶段;如果不可用,回滚。 |
Confirm 阶段 | 执行具体的转账逻辑,进行资源更新,并设置事务的成功状态。 | 1. 从 A 账户扣除 100 元,更新余额为 220 - 100 = 120 。2. 更新 B 账户余额为 50 + 30 = 80 ,C 账户余额为 60 + 70 = 130 。3. 更新交易状态为转账成功。 4. 向所有参与者发出确认提交请求,确认各方操作。 |
Cancel 阶段 | 回滚操作,恢复资源到原始状态。 | 1. 如果 Try 阶段失败或资源无法提供,回滚所有操作。 2. A 账户恢复扣除的 100 元,余额为 120 + 100 = 220 。 3. B 账户和 C 账户分别恢复相应的金额,B 账户恢复为 80 - 30 = 50 ,C 账户恢复为 130 - 70 = 60 。 4. 事务回滚并释放占用的资源。 |
六. 小结
分布式事务的出现带来了很多挑战,但也推动了事务管理理论和实践的不断发展。从ACID特性到CAP理论、BASE理论,再到DTP、2PC和TCC等分布式事务协议,每一种理论和方案都在不同的应用场景中发挥着重要作用。
在实际开发中,选择哪种分布式事务方案应根据业务需求、系统架构、性能要求等因素来决定。对于高一致性要求的金融类系统,2PC可能更合适;而对于电商类高并发系统,TCC和BASE理论的结合则能提供更高的可用性和灵活性。
相关文章:
【分布式理论11】分布式协同之分布式事务(一个应用操作多个资源):从刚性事务到柔性事务的演进
文章目录 一. 什么是分布式事务?二. 分布式事务的挑战三. 事务的ACID特性四. CAP理论与BASE理论1. CAP理论1.1. 三大特性1.2. 三者不能兼得 2. BASE理论 五. 分布式事务解决方案1. 两阶段提交(2PC)2. TCC(Try-Confirm-Cancel&…...
Linux: 已占用接口
Linux: 已占用接口 1. netstat(适用于旧系统)1.1 书中对该命令的介绍 2. ss(适用于新系统,替代 netstat)3. lsof(查看详细进程信息)4. fuser(快速查找占用端口的进程)5. …...
HWUI 和 Skia
📌 HWUI 和 Skia 的关系 Skia 是 Android 的底层 2D 图形库,提供 CPU 和 GPU 渲染能力,支持 OpenGL、Vulkan、Metal 等后端。HWUI 是 Android UI 组件的 GPU 渲染引擎,主要用于 加速 View、动画、阴影等 UI 元素的绘制。HWUI 依赖…...
Pytorch使用手册--将 PyTorch 模型导出为 ONNX(专题二十六)
注意 截至 PyTorch 2.1,ONNX 导出器有两个版本。 torch.onnx.dynamo_export 是最新的(仍处于测试阶段)导出器,基于 PyTorch 2.0 发布的 TorchDynamo 技术。 torch.onnx.export 基于 TorchScript 后端,自 PyTorch 1.2.0 起可用。 一、torch.onnx.dynamo_export使用 在 60 …...
GitHub SSH连接问题解决指南
🔍 GitHub SSH连接问题解决指南 问题描述 遇到错误:ssh: connect to host github.com port 22: Connection refused 说明您的网络环境无法访问GitHub的SSH端口22,常见原因: 防火墙/网络运营商限制(国内常见…...
【Linux】vim 设置
【Linux】vim 设置 零、起因 刚学Linux,有时候会重装Linux系统,然后默认的vi不太好用,需要进行一些设置,本文简述如何配置一个好用的vim。 壹、软件安装 sudo apt-get install vim贰、配置路径 对所有用户生效: …...
2025届开发岗秋招经验教训总结
实习 实习的作用: 学习知识,充实简历了解特定部门的氛围转正比秋招提前占坑提前展现工作能力,争取更高起薪 其中,除非有梦中情组,我认为占坑是最不重要的一个,因为现在的校招就业形势并未严峻到转正占满…...
Java 之集成 DataX 数据同步工具
1、官网下载 DataX https://github.com/alibaba/DataX 2、将依赖添加到本地(DataX没有maven坐标,需要自己安装) mvn install:install-file -Dfile"datax-common-0.0.1.jar" "-DgroupIdcom.datax" "-DartifactIdda…...
JMH 详细使用
JMH 基本使用 官方地址 JMH 是一个用于 Java 代码微基准测试的工具,允许开发者对特定部分进行精确的性能测试; 安装 JMH 环境: Maven 项目;JDK 8; Maven 方式安装 引入如下依赖: <dependencies>…...
2025 PHP授权系统网站源码
2025 PHP授权系统网站源码 安装教程: PHP7.0以上 先上传源码到服务器,然后再配置伪静态, 访问域名根据操作完成安装, 然后配置伪静态规则。 Ngix伪静态规则: location / { if (!-e $request_filename) { rewrite …...
【对话推荐系统】Towards Topic-Guided Conversational Recommender System 论文阅读
Towards Topic-Guided Conversational Recommender System 论文阅读 Abstract1 Introduction2 Related Work2.1 Conversation System2.2 Conversational Recommender System2.3 Dataset for Conversational Recommendation 3 Dataset Construction3.1 Collecting Movies for Re…...
git 使用常见错误整理
1. git am 应用补丁时遇到错误 fatal: previous rebase directory .git/rebase-apply still exists but mbox given fatal:之前的变基目录 .git/rebase-apply仍然存在,但却提供了mbox 答:这通常是因为之前的 git am 或 git rebase 操作失败后…...
数据存储:一文掌握存储数据到mysql的详细使用
文章目录 一、环境准备1.1 安装MySQL数据库1.2 安装Python MySQL驱动 二、连接到MySQL数据库三、执行基本的CRUD操作3.1 创建(Create):插入数据3.2 读取(Read):查询数据3.3 更新(Update…...
React 源码揭秘 | 更新队列
前面几篇遇到updateQueue的时候,我们把它先简单的当成了一个队列处理,这篇我们来详细讨论一下这个更新队列。 有关updateQueue中的部分,可以见源码 UpdateQueue实现 Update对象 我们先来看一下UpdateQueue中的内容,Update对象&…...
Vue3 + Vite + TS,使用 配置项目别名属性:resolve
使用 resolve 配置全局项目路径别名 1.优化了开发中单页面引用其他模块的路径复杂性 2.妥妥解决了,组件复用当中提高开发效率 // 不使用配置 import { useStore } from ../../../stores // 使用配置 可根据开发者需求任意定义,较多 import { useStore…...
使用 C# 以api的形式调用 DeepSeek
一:创建 API 密钥 首先,您需要来自 DeepSeek 的 API 密钥。访问 DeepSeek,创建一个帐户,并生成一个新的 API 密钥。 二:安装所需的 NuGet 包 使用 NuGet 包管理器安装包,或在包管理器控制台中运行以下命…...
手机放兜里,支付宝“碰一下”被盗刷?
大家好,我是小悟。 近期,网络上关于“支付宝‘碰一下’支付易被盗刷”的传言甚嚣尘上,不少用户对此心生疑虑。 首先,要明确一点:“碰一下”支付并不会像某些传言中所描述的那样容易被隔空盗刷。这一观点已经得到了支付…...
0x01 html和css
css 对于三种css使用方式: 第一种:行内样式 <span style"color: grey;">2024年05月15日 20:07</span>第二种:内部样式 <!DOCTYPE html> <html lang"en"> <head>...<style>span{…...
模型和数据集的平台之在Hugging Face上进行模型下载、上传以及创建专属Space
模型下载 步骤: 注册Hugging Face平台 https://huggingface.co/ 新建一个hf_download_josn.py 文件 touch hf_download_josn.py 编写hf_download_josn.py文件 import os from huggingface_hub import hf_hub_download# 指定模型标识符 repo_id "inter…...
轮式机器人在复杂地形中如何选择合适的全局路径规划算法?
已思考完成 收起 嗯,用户问的是轮式机器人在复杂地形中如何选择合适的全局路径规划算法。首先,我需要理解复杂地形可能带来的挑战,比如崎岖的路面、动态障碍物、非结构化环境等等。轮式机器人在这里的运动控制需要考虑地形通过性、稳定性&…...
免费使用 DeepSeek API 教程及资源汇总
免费使用 DeepSeek API 教程及资源汇总 一、DeepSeek API 资源汇总1.1 火山引擎1.2 百度千帆1.3 阿里百炼1.4 腾讯云 二、其他平台2.1 华为云2.2 硅基流动 三、总结 DeepSeek-R1 作为 2025 年初发布的推理大模型,凭借其卓越的逻辑推理能力和成本优势,迅速…...
文献汇总|AI生成图像检测相关数据集汇总
前言:本博客汇总当前AI生成图像检测领域用到的数据集及相关链接。 ⚠️:除标注「未公开」数据集,其余数据集均已开源。 目录 2020202220232024 2020 CNNSpot https://github.com/peterwang512/CNNDetection Testset: The zip file contains …...
C# 弃元的使用
总目录 前言 在C# 7.0及更高版本中,弃元(Discard)是一个新的语言特性,允许开发者在特定情况下忽略某些值。弃元用下划线 _ 作为占位符,明确表示忽略某个值,提升代码可读性 一、弃元是什么? 1.…...
蓝桥杯备考:贪心算法之矩阵消除游戏
这道题是牛客上的一道题,它呢和我们之前的排座位游戏非常之相似,但是,排座位问题选择行和列是不会改变元素的值的,这道题呢每每选一行都会把这行或者这列清零,所以我们的策略就是先用二进制把选择所有行的情况全部枚举…...
React面试(一)
文章目录 1.vue和react有什么异同2.useEffect中为什么不能使用异步3.useEffect和useLayoutEffect的区别4.react的生命周期5.state和prop的区别6.受控组件和非受控组件7.为什么react16之后不把事件挂载到document上了8.讲一下react的hoc,它可以用来做什么?…...
《解锁AI密码,机器人精准感知环境不再是梦!》
在科技飞速发展的当下,人工智能与机器人技术的融合正深刻改变着世界。其中,人工智能助力机器人实现更精准的环境感知,已成为该领域的核心课题,吸引着全球科研人员与科技企业的目光。这不仅关乎机器人能否在复杂环境中高效执行任务…...
C/C++语言知识点二
1. 编程算法之“哨兵”思想 哨兵思想是一种编程技巧,通过在数据结构的边界或特定位置放置一个特殊值(称为“哨兵”),来简化逻辑判断和提高代码效率。哨兵通常是一个标记值,用于指示某种条件或边界,从而避免…...
【SpringBoot】——分组校验、自定义注解、登入验证(集成redis)、属性配置方式、多环境开发系统学习知识
🎼个人主页:【Y小夜】 😎作者简介:一位双非学校的大三学生,编程爱好者, 专注于基础和实战分享,欢迎私信咨询! 🎆入门专栏:🎇【MySQL࿰…...
【EB-03】 AUTOSAR builder与EB RTE集成
AUTOSAR builder与EB RTE集成 1. Import Arxml files to Tresos2. Run MultiTask Script3. Add Components3.1 Run EcuExtractCreator Script4. Mapping Component to Partitions5. Event Mapping/Runnables Mapping to Tasks6. Port Connect7. Run SvcAs_Trigger Script8. Ver…...
布署elfk-准备工作
建议申请5台机器部署elfk: filebeat(每台app)--> logstash(2台keepalived)--> elasticsearch(3台)--> kibana(部署es上)采集输出 处理转发 分布式存储 展示 ELK中文社区: 搜索客,搜索人自己的社区 官方…...
JVM垃圾回收器深度底层原理分析与知识体系构建
一、垃圾回收的基本步骤 标记(Marking) 从GC Roots(如虚拟机栈、方法区静态变量、本地方法栈等)出发,遍历对象引用链,标记所有可达对象为存活对象,未被标记的则视为垃圾。此阶段需暂停用户线程&…...
Flutter系列教程之(5)——常用控件Widget的使用示例
目录 1.页面跳转 2.某个控件设置点击事件 3.AlertDialog对话框的使用 4.文本输入框 5.按钮 圆角扁平按钮: 圆角悬浮按钮: 6.补充 圆点 7.布局使用 Row控件左右对齐 调整边距 1.页面跳转 首先,先介绍一下页面跳转功能吧 Flutter使用 Navigator 进行页面…...
快手前端通用静态托管服务KFX演进历程:从崎岖土路到平坦高速
快手静态部署托管服务(KFX)历经四年发展,经历了三个阶段,一步步从勉强能行车的“崎岖土路”到现在多车道并行的“平坦高速”,这一转变极大地提升了资源利用率和效率,满足业务的实际需要。本文将带你了解其背…...
hackmyvm-buster
题目地址 信息收集 主机发现 ┌──(root㉿kali)-[/home/kali] └─# arp-scan -I eth1 192.168.56.0/24 Interface: eth1, type: EN10MB, MAC: 00:0c:29:34:da:f5, IPv4: 192.168.56.103 WARNING: Cannot open MAC/Vendor file ieee-oui.txt: Permission denied WARNING: C…...
React加TypeScript最新部署完整版
React TypeScript 全流程部署指南 一、环境准备与项目初始化 关于node.js及npm的安装请参见我的文章。 1.1 创建项目(React TypeScript) # 使用官方推荐脚手架(Vite 5.x) npx create-vitelatest my-app --template react-ts …...
DeepSeek-R1-Zero:基于基础模型的强化学习
注:此文章内容均节选自充电了么创始人,CEO兼CTO陈敬雷老师的新书《自然语言处理原理与实战》(人工智能科学与技术丛书)【陈敬雷编著】【清华大学出版社】 文章目录 DeepSeek大模型技术系列四DeepSeek大模型技术系列四》DeepSeek-…...
python的列表和元组别再傻傻分不清啦
目录 什么是下标: 正数索引:正数索引从左到右,从 0 开始。 负数索引:负数索引从右到左,从 -1 开始。 切片(slice):除了单个元素,Python还支持通过切片访问序列的子集。…...
Fiddler在Windows下抓包Https
文章目录 1.Fiddler Classic 配置2.配置浏览器代理自动代理手动配置浏览器代理 3.抓取移动端 HTTPS 流量(可选)解决抓取 HTTPS 失败问题1.Fiddler证书过期了 默认情况下,Fiddler 无法直接解密 HTTPS 流量。需要开启 HTTPS 解密: 1…...
【超详细】神经网络的可视化解释
《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…...
LVS+Keepalived 高可用集群搭建
一、高可用集群: 1.什么是高可用集群: 高可用集群(High Availability Cluster)是以减少服务中断时间为目地的服务器集群技术它通过保护用户的业务程序对外不间断提供的服务,把因软件、硬件、人为造成的故障对业务的影响…...
使用git管理uniapp项目
1.本地管理 1. 在项目根目录中新建 .gitignore 忽略文件,并配置如下: # 忽略 node_modules 目录 /node_modules /unpackage/dist 2. 打开终端,切换到项目根目录中,运行如下的命令,初始化本地 Git 仓库࿱…...
回调函数的用法
回调函数的基本用法 回调函数是一种被作为参数传递给另一个函数的函数,接收回调函数作为参数的函数在合适的时候会调用这个回调函数。回调函数为代码提供了更高的灵活性和可扩展性,下面为你详细介绍回调函数的基本用法。 基本概念 回调函数的核心在于函…...
样式垂直居中,谁才是王者
样式垂直居中,谁才是王者 面试官 常问如何让元素垂直居中,这其实是个经典的前端问题。 实现垂直居中的方法多种多样,从传统的表格布局到现代的Flexbox、Grid布局,再到绝对定位配合transform,甚至是line-height技巧&am…...
五、Three.js顶点UV坐标、纹理贴图
一部分来自1. 创建纹理贴图 | Three.js中文网 ,一部分是自己的总结。 一、创建纹理贴图 注意:把一张图片贴在模型上就是纹理贴图 1、纹理加载器TextureLoader 注意:将图片加载到加载器中 通过纹理贴图加载器TextureLoader的load()方法加…...
Linux Kernel Connection Tracking Table
在 Linux 内核中,连接跟踪表(Connection Tracking Table,简称 conntrack)是一个用于跟踪网络连接状态的核心组件。它主要由 Netfilter 框架管理,广泛应用于防火墙、NAT(网络地址转换)和负载均衡…...
NavVis VLX三维扫描:高层建筑数字化的革新力量【沪敖3D】
在三维激光扫描领域,楼梯结构因其复杂的空间形态和连续垂直移动的实际需求,一直是技术难点之一。利用NavVis VLX穿戴式移动扫描系统成功完成一栋34层建筑的高效扫描,其中楼梯部分的数据一遍成形且无任何分层或形变。本文将深入分析该项目的技…...
JVM生产环境问题定位与解决实战(二):JConsole、VisualVM到MAT的高级应用
生产问题定位指南:几款必备的可视化工具 引言 在上一篇文章中,详细的介绍了JDK自带的一系列命令行工具,,如jps、jmap、jstat、jstack以及jcmd等,这些工具为排查和诊断Java虚拟机(JVM)问题提供…...
【深入理解JWT】从认证授权到网关安全
最近的项目学习中,在进行登陆模块的用户信息验证这一部分又用到了JWT的一些概念和相关知识,特在此写了这篇文章、方便各位笔者理解JWT相关概念 目录 先来理解JWT是什么? 区分有状态认证和无状态认证 有状态认证 VS 无状态认证 JWT令牌的…...
esp工程报错:something went wrong when trying to build the project esp-idf 一种解决办法
最近上手了正点原子esp32s3板子,环境采用的是vscodeesp-idf插件。导入了正点原子的demo测试,每次都报这个错误无法建造。也不是网上说的ninja error,不是中文路径的问题。 在终端中查看,发现是缺少了git。(我这里没有…...
基于MATLAB红外弱小目标检测MPCM算法复现
摘要:本文详细介绍了一种基于人类视觉系统特性的红外弱小目标检测算法——Multiscale patch-based contrast measure (MPCM)。该算法通过增强目标与背景的对比度,有效检测红外图像中的弱小目标,并在MATLAB环境中进行了复现与实验验证。 关键…...