XA协议和Tcc
基于 XA 协议的两阶段提交 (2PC)。这是一种分布式事务协议,旨在保证在多个参与者(通常是不同的数据库或资源管理器)共同参与的事务中,所有参与者要么都提交事务,要么都回滚事务,从而维护数据的一致性。
你可以把 2PC 想象成一个需要多个部门共同签字才能生效的合同审批流程。每个部门都有同意或拒绝的权利,最终结果取决于所有部门的意见。
核心思想:协调者与参与者
在 2PC 中,有两个关键的角色:
- 协调者 (Coordinator): 负责整个事务的协调和管理。它向所有参与者发出指令,并收集它们的响应,最终决定事务是提交还是回滚。
- 参与者 (Participants): 参与到分布式事务中的各个资源管理器(例如,数据库)。它们接收协调者的指令,执行本地事务,并告知协调者自己的状态。
两阶段提交的过程
2PC 的过程分为两个关键阶段:
第一阶段(准备阶段 - Prepare Phase)
-
协调者询问 (Prepare Request): 协调者向所有参与者发送一个“准备请求”,询问它们是否准备好提交事务。这个请求包含了要执行的事务操作信息。
-
参与者执行本地事务 (Local Transaction Execution): 收到准备请求后,每个参与者执行本地事务操作,并在本地保存相关的 undo/redo 日志等信息,以便在后续需要回滚或提交时使用。注意:这里参与者只是执行操作,但并不真正提交。
-
参与者响应 (Vote): 每个参与者根据本地事务的执行情况,向协调者发送一个“投票”:
- “同意 (Vote-Commit)”: 表示本地事务执行成功,参与者已经准备好提交。
- “拒绝 (Vote-Abort)”: 表示本地事务执行失败,参与者不能提交,希望回滚。
第二阶段(提交/回滚阶段 - Commit/Rollback Phase)
协调者在收集到所有参与者的投票后,会根据投票结果决定下一步的操作:
情况一:所有参与者都投了“同意”票
-
协调者发送提交请求 (Commit Request): 协调者向所有参与者发送“提交请求”。
-
参与者提交本地事务 (Local Transaction Commit): 收到提交请求后,每个参与者正式提交之前在本地执行的事务。
-
参与者发送确认 (Acknowledgement): 参与者完成提交后,向协调者发送“提交确认”。
-
协调者完成事务 (Transaction Completion): 协调者收到所有参与者的提交确认后,认为整个分布式事务成功完成。
情况二:任何一个或多个参与者投了“拒绝”票,或者协调者在规定时间内没有收到所有参与者的投票
-
协调者发送回滚请求 (Rollback Request): 协调者向所有投了“同意”票的参与者(如果存在)以及投了“拒绝”票的参与者发送“回滚请求”。
-
参与者回滚本地事务 (Local Transaction Rollback): 收到回滚请求后,每个参与者利用之前保存的 undo 日志撤销之前执行的本地事务操作。
-
参与者发送确认 (Acknowledgement): 参与者完成回滚后,向协调者发送“回滚确认”。
-
协调者完成事务 (Transaction Completion): 协调者收到所有参与者的回滚确认后,认为整个分布式事务已回滚。
一个简单的转账例子
假设我们有两个不同的银行数据库参与一个跨行转账事务:
- 参与者 A: 存储用户 A 的账户信息(在 Bank A 的数据库中)。
- 参与者 B: 存储用户 B 的账户信息(在 Bank B 的数据库中)。
- 协调者: 一个专门的事务管理器。
事务: 用户 A 向用户 B 转账 100 元。
第一阶段(准备阶段)
-
协调者发送准备请求: “请参与者 A 准备从用户 A 账户扣除 100 元,参与者 B 准备向用户 B 账户增加 100 元。”
-
参与者 A 执行本地事务: Bank A 的数据库执行了扣除操作,但未提交,记录了 undo 日志(如果需要回滚,就加回 100 元)。参与者 A 投票“同意”。
-
参与者 B 执行本地事务: Bank B 的数据库执行了增加操作,但未提交,记录了 redo 日志(如果需要提交,就确认增加 100 元)。参与者 B 投票“同意”。
-
协调者收到所有“同意”票。
第二阶段(提交阶段)
-
协调者发送提交请求: “请参与者 A 和参与者 B 提交事务。”
-
参与者 A 提交本地事务: Bank A 的数据库正式提交了扣除 100 元的操作。参与者 A 发送“提交确认”。
-
参与者 B 提交本地事务: Bank B 的数据库正式提交了增加 100 元的操作。参与者 B 发送“提交确认”。
-
协调者收到所有“提交确认”,事务成功完成。
如果第一阶段有参与者投了“拒绝”票(例如,用户 A 账户余额不足):
第一阶段(准备阶段)
- 参与者 A 执行本地事务,发现余额不足,投票“拒绝”。
- 参与者 B 可能仍然投票“同意”(因为它不知道 A 的情况)。
- 协调者收到至少一个“拒绝”票。
第二阶段(回滚阶段)
-
协调者发送回滚请求: “请参与者 A 和参与者 B 回滚事务。”
-
参与者 A 回滚本地事务: Bank A 的数据库利用 undo 日志撤销了之前的扣除操作(实际上由于余额不足,可能并没有真正扣除)。参与者 A 发送“回滚确认”。
-
参与者 B 回滚本地事务: Bank B 的数据库利用 undo 日志撤销了之前的增加操作(即使已经执行,也会被撤销)。参与者 B 发送“回滚确认”。
-
协调者收到所有“回滚确认”,事务回滚成功,保证了两个银行账户数据的一致性。
2PC 的缺点
虽然 2PC 能够保证数据的一致性,但也存在一些明显的缺点:
- 同步阻塞 (Blocking): 在准备阶段之后,如果协调者或某个参与者发生故障,其他参与者可能会一直处于阻塞状态,等待协调者的指令或故障参与者的恢复,这会降低系统的可用性。
- 单点故障 (Single Point of Failure): 协调者是整个事务的关键,如果协调者发生故障,整个分布式事务将无法继续进行。
- 数据不一致的风险 (Data Inconsistency Window): 在准备阶段和提交/回滚阶段之间,如果协调者在发送提交/回滚指令前崩溃,可能会导致部分参与者提交了事务,而另一部分参与者没有,从而造成数据不一致。
TCC (Try-Confirm-Cancel) 分布式事务协议,并对比它与两阶段提交 (2PC) 的不同。
TCC:一种柔性事务
TCC 是一种基于补偿机制的分布式事务解决方案。它将一个分布式事务的生命周期划分为三个阶段:
-
Try 阶段(尝试执行):
- 尝试执行业务操作,完成所有业务检查(一致性)。
- 预留必要的业务资源(准隔离性)。
- 这个阶段的目标是尽量为后续的 Confirm 阶段准备好执行条件。
-
Confirm 阶段(确认执行):
- 在 Try 阶段所有参与者都成功的情况下,Confirm 阶段会被执行。
- 真正执行业务操作,不进行任何业务检查。
- Confirm 阶段只需要使用 Try 阶段预留的资源,因此成功率要高。
- Confirm 操作需要保证幂等性,因为可能会重试。
-
Cancel 阶段(取消执行):
- 如果在 Try 阶段有任何参与者失败,或者在后续阶段发生异常,Cancel 阶段会被执行。
- 释放 Try 阶段预留的业务资源,撤销之前 Try 阶段所做的操作,进行补偿。
- Cancel 操作同样需要保证幂等性,因为可能会重试。
TCC 的核心思想是“先尝试,成功则确认,失败则补偿”。 它不依赖于资源管理器(如数据库)的 XA 协议,而是将事务的控制权交还给业务层面,通过业务逻辑来实现事务的提交和回滚。
一个跨银行转账的 TCC 例子
我们继续使用跨银行转账的场景:用户 A 从 Bank A 转账 100 元给用户 B 在 Bank B。
- 参与者 A: Bank A 的转出服务。
- 参与者 B: Bank B 的转入服务。
- 协调者: 仍然需要一个协调者来记录事务状态和驱动流程。
Try 阶段:
- 协调者通知参与者 A (Try): “尝试从用户 A 账户冻结 100 元。”
- 参与者 A 执行 (Try): Bank A 的转出服务检查用户 A 的余额是否足够,如果足够则冻结 100 元(例如,在一个中间状态或单独的冻结金额字段中),并记录冻结日志。Try 阶段成功,返回成功。
- 协调者通知参与者 B (Try): “尝试在用户 B 账户预增加 100 元的额度(但尚未真正增加)。”
- 参与者 B 执行 (Try): Bank B 的转入服务在用户 B 的账户上预留 100 元的额度(例如,在一个中间状态或单独的待入账金额字段中),并记录预留日志。Try 阶段成功,返回成功。
Confirm 阶段(如果 Try 阶段都成功):
- 协调者通知参与者 A (Confirm): “确认转出操作,真正扣减用户 A 账户的 100 元。”
- 参与者 A 执行 (Confirm): Bank A 的转出服务从用户 A 账户的实际余额中扣除 100 元,并清除冻结记录。Confirm 成功,返回成功。
- 协调者通知参与者 B (Confirm): “确认转入操作,真正增加用户 B 账户的 100 元。”
- 参与者 B 执行 (Confirm): Bank B 的转入服务将预留的 100 元额度增加到用户 B 的实际余额中,并清除预留记录。Confirm 成功,返回成功。
Cancel 阶段(如果在 Try 阶段有失败,或后续阶段失败):
假设在 Try 阶段,Bank A 发现用户 A 余额不足,Try 失败。
- 协调者通知参与者 A (Cancel): “取消转出操作,释放之前冻结的金额。”
- 参与者 A 执行 (Cancel): Bank A 的转出服务释放之前冻结的 100 元(如果已经冻结),并清除冻结记录。Cancel 成功,返回成功。
- 协调者通知参与者 B (Cancel): “取消转入操作,撤销之前预增加的额度。”
- 参与者 B 执行 (Cancel): Bank B 的转入服务撤销之前预留的 100 元额度,并清除预留记录。Cancel 成功,返回成功。
TCC 与 2PC 的不同
特性 | 两阶段提交 (2PC) | Try-Confirm-Cancel (TCC) |
---|---|---|
协议层面 | 依赖资源管理器(如数据库)的 XA 协议 | 基于业务逻辑实现 |
资源锁定 | 在准备阶段锁定资源,直到提交或回滚 | Try 阶段预留资源,Confirm/Cancel 阶段释放资源 |
一致性 | 强一致性(在理想情况下) | 最终一致性(通过补偿机制保证) |
性能 | 可能存在长时间的资源锁定,性能相对较低 | 资源锁定时间短,性能通常更高 |
可用性 | 协调者或参与者故障可能导致长时间阻塞 | 业务层面实现补偿,可用性相对较高 |
开发复杂度 | 对业务代码侵入性较小,依赖中间件实现 | 对业务代码侵入性较大,需要实现 Try/Confirm/Cancel 逻辑 |
适用场景 | 资源支持 XA 协议的场景,对强一致性要求高的场景 | 跨数据库、跨服务等复杂场景,对性能和可用性要求高的场景 |
导出到 Google 表格
总结
- 2PC 追求强一致性,但在某些故障情况下可能导致长时间的阻塞,影响系统可用性。它依赖于底层数据库等资源管理器对 XA 协议的支持。
- TCC 追求最终一致性,通过业务逻辑实现补偿,减少了资源锁定的时间,提高了系统的并发能力和可用性。但它对业务代码的侵入性较大,需要开发人员实现 Try、Confirm 和 Cancel 三个操作,并且要考虑幂等性、空回滚、悬挂等问题,开发复杂度较高。
XA 和 TCC 的核心区别
1. 资源层面 vs. 业务层面
-
XA (资源层面): 你可以把它想象成是由数据库(资源管理器,RM)自身提供的“官方”分布式事务解决方案。 它依赖于数据库实现了 XA 协议,这个协议定义了协调者(Transaction Manager,TM)和参与者(RM)之间如何进行两阶段提交的通信。
- 类比: 这就像是不同银行之间有统一的国际清算系统(XA 协议),大家都遵循这个标准流程来处理跨行交易,银行内部的事务机制直接参与到这个流程中。
-
TCC (业务层面): 它不依赖于数据库的 XA 协议。 而是将分布式事务的控制权放在了业务代码层面。你需要自己设计每个参与服务的 Try、Confirm 和 Cancel 操作,通过编写业务逻辑来模拟两阶段提交。
- 类比: 这就像是不同公司之间没有统一的清算系统,它们需要自己协商一套跨公司交易的流程。每个公司都需要定义“预申请”、“确认”和“撤销”这些操作的具体步骤。
2. 强一致性 vs. 最终一致性
-
XA (强一致性): 在理想情况下(没有故障),XA 能够保证严格的原子性。要么所有参与者都提交成功,要么都回滚成功,数据在事务结束后必须保持一致。
- 理解: 就像国际清算系统保证,只要交易开始,最终要么双方账户都更新成功,要么都不更新,中间状态对用户来说是不可见的。
-
TCC (最终一致性): TCC 并不能保证在事务执行过程中所有参与者都处于完全一致的状态。如果在 Confirm 或 Cancel 阶段发生故障,可能需要进行重试或人工干预来保证最终的数据一致性。它的目标是经过一段时间后,数据能够达到一致的状态。
- 理解: 就像公司间的协商交易,如果在“确认”阶段出了问题,可能需要重新发起确认或者执行“撤销”操作,最终目标是让双方的账目对得上,但中间可能会有短暂的不一致。
3. 资源锁的处理
-
XA (长时间持有锁): 这是 XA 的一个关键特点,也是其性能瓶颈所在。在准备阶段 (Prepare),参与者(数据库)通常会锁定相关的资源(例如,数据库行、表等)。这些锁会一直保持到提交或回滚阶段结束才会释放。
- 影响: 长时间的资源锁定会降低数据库的并发处理能力,因为其他事务可能需要等待这些锁被释放才能继续执行。
-
TCC (不长时间持有锁): TCC 的设计目标之一就是尽量缩短资源锁定的时间。
- Try 阶段: Try 阶段通常只是预留资源(例如,冻结金额、记录中间状态),而不是直接锁定数据库的业务资源。
- Confirm/Cancel 阶段: 这两个阶段执行真正的业务操作或补偿操作,通常只需要很短的时间,并且依赖于 Try 阶段预留的信息,不再需要长时间锁定核心业务资源。
- 优势: 通过减少锁的持有时间,TCC 可以提高系统的并发性和吞吐量。
更形象的比喻
想象你和你的朋友合伙买一件东西,需要分别从你们的银行账户扣款:
-
XA 就像银行的联名账户: 银行提供了一个“两阶段扣款”的功能。当发起扣款时,银行会先冻结你们账户上的钱(准备阶段,持有锁),确认双方账户都冻结成功后,才会真正扣款(提交阶段,释放锁)。如果任何一方账户有问题,银行会取消冻结(回滚阶段)。这个过程由银行的系统严格控制,保证要么都扣款成功,要么都不扣款。但如果银行系统繁忙,冻结的时间可能会比较长,影响你们其他交易。
-
TCC 就像你们私下协商:
- Try: 你先告诉银行 A:“我要给朋友转 100 元,请先帮我记录一下,这笔钱暂时不能动。”你的朋友也告诉银行 B:“我可能会收到朋友的 100 元,请先预留一个收款的记录。”(业务层面预留资源,不一定锁定核心账户余额)
- Confirm: 如果你们都通知说“可以了,确认转账!”,银行 A 才真正扣除你的钱,银行 B 才真正增加你朋友的钱。
- Cancel: 如果任何一方出了问题(例如,你的余额不足),你们会通知银行 A 取消之前的记录,通知银行 B 也取消之前的预留。
- 关键: 这个过程是你们自己(业务代码)控制的,银行只是根据你们的指令操作。银行不会一直锁定你的钱,但在“确认”或“取消”失败时,可能需要你们重试或手动协调来保证最终账目正确。
总结理解的关键点
- 谁来控制事务: XA 是资源管理器(数据库)控制,TCC 是业务代码控制。
- 如何保证一致性: XA 依赖数据库的原子性能力,TCC 依赖业务逻辑的补偿机制。
- 锁的持有时间: XA 持有锁的时间较长,TCC 尽量缩短锁的持有时间。
- 适用场景: XA 适用于支持 XA 协议的同构数据源,对强一致性要求高的场景;TCC 适用于跨异构系统、需要更高并发和可用性的场景。
xa 相当于人家给我做了这个功能 而tcc则是自己实现功能?
没错
XA 就像是数据库(或资源管理器)自身提供了“现成的”分布式事务功能。 你只需要按照 XA 协议的规范来使用,协调者会和参与者(数据库)进行通信,由数据库内部的机制来保证事务的原子性和一致性,并负责资源的锁定和释放。你更多的是在配置和使用这个“内置”的功能。
TCC 则完全是“自己动手,丰衣足食”。 你需要基于业务逻辑,自己设计和实现 Try、Confirm 和 Cancel 这三个阶段的操作。你需要考虑如何在 Try 阶段预留资源,如何在 Confirm 阶段真正执行业务操作,以及如何在 Cancel 阶段进行补偿,撤销之前的操作。TCC 将分布式事务的控制权从资源管理器转移到了业务代码层面,你需要自己编写代码来模拟两阶段提交的流程。
更进一步理解:
-
XA: 就像使用支持分布式事务的中间件(例如,某些 JMS 实现、一些分布式数据库)提供的事务管理能力。这些中间件已经帮你实现了两阶段提交的协议细节,你只需要配置和调用相应的 API。
-
TCC: 就像你需要自己编写一个复杂的业务流程,这个流程包含“预处理”、“确认执行”和“撤销处理”三个步骤,并且你需要自己保证这些步骤在分布式环境下的正确执行和数据一致性。
所以,你的总结非常精辟:
- XA: “人家(资源管理器)给我做了这个功能,我直接用。”
- TCC: “人家没做,我自己想办法实现这个功能。”
这种“自己实现”的灵活性使得 TCC 可以应用于 XA 无法很好解决的场景,例如跨异构数据源、不直接支持 XA 协议的服务调用等。但同时,这也带来了更高的开发复杂度和维护成本。
相关文章:
XA协议和Tcc
基于 XA 协议的两阶段提交 (2PC)。这是一种分布式事务协议,旨在保证在多个参与者(通常是不同的数据库或资源管理器)共同参与的事务中,所有参与者要么都提交事务,要么都回滚事务,从而维护数据的一致性。 你…...
我们该如何使用DeepSeek帮我们减负?
在当今信息爆炸的时代,如何快速获取、筛选和分析信息已经成为各行各业的重要能力。而DeepSeek作为一种先进的智能搜索和信息挖掘工具,能够帮助用户快速找到所需的信息,并从海量数据中提取出有用的洞见。在这篇博文中,我们将深入探…...
25.5.13
感觉很久没有写算法题了,先来个滑动队列模板题试试水,就是用双端队列来实现会很方便,拿结构体来记录是第几个数和数的值即可,再定义两个双端队列,一个使他的值单调递增一个使他的值单调递减 使队头元素为最大值或者是最…...
软件测试——面试八股文(入门篇)
今天给大家分享软件测试面试题入门篇,看看大家能答对几题 一、 请你说一说测试用例的边界 参考回答: 边界值分析法就是对输入或输出的边界值进行测试的一种黑盒测试方法。通常边界值分析法是作为对等价类划分法的补充,这种情况下ÿ…...
脑机接口技术:开启人类与机器融合的新时代
摘要 脑机接口(BCI)技术作为一项前沿科技,正在逐步打破人类与机器之间的沟通障碍,为医疗、娱乐、教育等多个领域带来前所未有的变革。本文将详细介绍脑机接口技术的基本原理、发展现状、应用场景以及面临的挑战和未来发展趋势&…...
当三维地理信息遇上气象预警:电网安全如何实现“先知先觉”?
极端天气频发的当下,一场台风、一次暴雨就可能让电力系统陷入瘫痪。但你知道吗?如今的电网已能通过三维地理信息与气象数据的深度融合,在灾害来临前精准锁定风险,甚至将停电事故减少七成以上。这背后,正是国网电力空间…...
C++ string数据查找、string数据替换、string子串获取
string查找示例见下,代码见下,以及对应运行结果见下: #include<iostream>using namespace std;int main() {// 1string s1 "hellooooworld";cout << s1.find("oooo") << endl;// 2cout << (in…...
2025.5.13山东大学软件学院计算机图形学期末考试回忆版本
2025.5.13山东大学软件学院计图期末考试回忆版本 学院:软件学院 老师:周元峰、魏广顺 一、简述题(2024原题一) 1.图形绘制流水线的组成和作用 2.双缓冲机制是什么,有什么作用? 3.Delaunay三角化的四条…...
思极地图使用
思极地图api文档:思极地图开放平台 | 思极地图API SDK 思极地图SDK: <script src"https://map.sgcc.com.cn/maps?v3.0.0"></script> <script src"https://map.sgcc.com.cn/products/js-sdk/v3/assets/js/jquery-1.11.1.min.js&quo…...
Fiori学习专题四十一:表单控件
上节课我们学习了一些单一控件的使用,但是我们发现在页面内每个控件都占用了一行,这样子就显得不太好看,这节课我们引入一个表单控件来美化一下这个页面。 1.学习表单控件FORM之前我们先了解下哪些情况会使用到表单控件,最常见的场…...
基于STM32、HAL库的TDA7719TR音频接口芯片驱动程序设计
一、简介: TDA7719TR 是 NXP Semiconductors 推出的高性能音频处理芯片,专为汽车音响系统设计。它集成了 AM/FM 收音机调谐器、音频处理和音量控制功能,支持 I2C 控制接口,非常适合与 STM32 微控制器配合使用。 二、硬件接口: 典型的 STM32L4 与 TDA7719TR 硬件连接如下…...
Baklib智能云平台加速企业数据治理
Baklib数据治理核心优势 Baklib作为新一代企业级知识中台,其数据治理能力建立在全资产统一管理与智能化处理框架的双重基础之上。通过构建知识中台的核心架构,平台实现了图文、音视频等多模态数据的标准化存储与动态标签体系,有效解决传统管…...
面试中被问到谈谈你对threadlocal的理解
ThreadLocal 的核心理解 1. 基本概念 ThreadLocal 是 Java 提供的线程局部变量机制,用于在多线程环境中为每个线程维护独立的变量副本,实现线程隔离。其核心思想是空间换时间,通过避免共享变量带来的同步开销,提升并发性能。 2…...
Spring Boot 应用中实现基本的 SSE 功能
SSE 技术简介 SSE(Server-Sent Events)是一种允许服务器主动向客户端推送数据的技术。它基于 HTTP 长连接,使用简单,特别适合实时数据更新场景,如股票行情、新闻推送等。与 WebSocket 相比,SSE 更轻量级&a…...
【2025最新】Windows系统装VSCode搭建C/C++开发环境(附带所有安装包)
文章目录 为什么选择VSCode作为C/C开发工具?一、VSCode安装过程(超简单!)二、VSCode中文界面设置(再也不用对着英文发愁!)三、安装C/C插件(编程必备神器!)四、…...
【MyBatis-8】MyBatis对象关联查询详解:高效处理复杂关系映射
在实际业务开发中,我们经常需要处理对象之间的关联关系,如一对一、一对多、多对多等。MyBatis作为一款优秀的持久层框架,提供了强大的对象关联查询能力。本文将深入探讨MyBatis中各种关联查询的实现方式、适用场景及最佳实践。 1. MyBatis关…...
Java基础(IO)
所有操作都在内存,不能长时间保存,IO主要在硬盘,可以长时间保存。 一、File类 File类被定义为文件和目录路径名的抽象表示形式,这是因为 File 类既可以表示文件也可以表示目录,他们都通过对应的路径来描述。 提供构…...
Trae IDE:AI深度集成的智能开发环境
(以高效人机协作重塑编程体验) 概述 Trae IDE(发音 /treɪ/)是一款深度集成AI能力的现代化开发工具,结合传统IDE的完备功能与前沿AI技术,提供智能问答、代码自动补全、跨文件编程及AI Agent驱动的自动化开…...
网站开发过程中样式忽然不显示问题
老规矩,先听故事:今天我开发网站时候遇到一个问题,就开发的这个网站在默认127.0.0.1运行样式有bug显示不出来,之前都可以,就完全一样的代码,之前可以正常运行显示,今天忽然就不行了,…...
双种群进化算法:动态约束处理与资源分配解决约束多目标优化问题
双种群进化算法:动态约束处理与资源分配解决约束多目标优化问题 一、引言 约束多目标优化问题(CMOPs)在工程设计、资源分配等领域广泛存在,其核心是在满足多个约束条件的同时优化多个目标函数。传统方法往往难以平衡约束满足与目…...
如何在 CentOS 7 虚拟机上配置静态 IP 地址并保持重启后 SSH 连接
在使用 CentOS 7 的虚拟机时,我们通常需要配置静态 IP 地址,以确保在每次虚拟机重启后能够通过 SSH 连接。本文将介绍如何在 CentOS 7 系统中配置静态 IP 地址,并确保配置在系统重启后依然生效。 步骤 1:检查虚拟机网络接口 首先…...
整数和浮点数转换时的精度损失
文章目录 int和float转换时的精度损失float组成解析(1) 32位浮点数的结构(2)示例:解析一个浮点数(3)偏置值的作用(4) 偏置值为什么是127?(5&#…...
Protobuf工具
#region 知识点一 什么是 Protobuf //Protobuf 全称是 protocol - buffers(协议缓冲区) // 是谷歌提供给开发者的一个开源的协议生成工具 // 它的主要工作原理和我们之前做的自定义协议工具类似 // 只不过它更加的完善&…...
闭包原理与常见陷阱
引言 JavaScript闭包是前端开发中既强大又神秘的概念,它不仅是面试的必考题,更是解决复杂问题的利器。闭包让函数能够记住并访问其创建时的作用域,即使在该函数在其定义环境之外执行。 然而,正如许多强大的工具一样,…...
用 VS Code / PyCharm 编写你的第一个 Python 程序
用ChatGPT做软件测试 编写你的第一个 Python 程序——不只是“Hello, World”,而是构建认知、习惯与未来的起点 “第一行代码,是一个开发者认知世界的方式。” 编程的入门,不只是运行一个字符串输出,更是开始用计算机思维来理解、…...
Linux学习心得问题整理(一)
day01 运维初识 理解云计算运维目的是什么? 搭建云计算更有利于我们在公网环境下方便访问我们服务 节省时间的成本,能随时随地方便调度硬件资源,更容易搭建软件服务 安全可靠,售后期间支持技术支持维护 什么是运维?…...
在scala中sparkSQL连接masql并添加新数据
以下是 Scala 中使用 Spark SQL 连接 MySQL 并添加数据的完整代码示例(纯文本): 1. 准备连接参数(需替换实际信息) scala val jdbcUrl "jdbc:mysql://localhost:3306/test_db?useUnicodetrue&characterEnc…...
STM32F103_LL库+寄存器学习笔记22 - 基础定时器TIM实现1ms周期回调
导言 如上所示,STM32F103有两个基本定时器TIM6与TIM7,所谓「基本定时器」,即功能最简单的定时器。 项目地址: github: LL库: https://github.com/q164129345/MCU_Develop/tree/main/stm32f103_ll_library22_Basic_Timer寄存器方…...
.Net HttpClient 使用Json数据
HttpClient 使用Json数据 现代Web项目中,Json是最常用的数据格式。不论是前后端的交互中,还是纯前端项目中,都是如此。因此,.Net HttpClient 能不能更加方便、快捷的处理Json格式数据,也就至关重要了! 文末…...
AI时代,如何实现人机共舞?
在科技飞速发展的当下,人工智能(AI)已不再是科幻作品中的遥远想象,而是深入渗透到我们生活与工作的方方面面。从智能手机中的语音助手,到金融领域的风险预测模型;从医疗影像的智能诊断,到工业生…...
flea-cache使用之Redis哨兵模式接入
Redis哨兵模式接入 1. 参考2. 依赖3. 基础接入3.1 定义Flea缓存接口3.2 定义抽象Flea缓存类3.3 定义Redis客户端接口类3.4 定义Redis客户端命令行3.5 定义哨兵模式Redis客户端实现类3.6 定义Redis哨兵连接池3.7 定义Redis哨兵配置文件3.8 定义Redis Flea缓存类3.9 定义抽象Flea…...
【Docker】Docker环境下快速部署Ollama与Open-WebUI:详细指南
Docker环境下快速部署Ollama与Open-WebUI:详细指南 在本篇文章中,我们将深入探讨如何在Docker中高效部署 Ollama 和 Open-WebUI,并解决在实际使用中常见的问题,确保你的模型服务稳定高效地运行。 一、Ollama 和 Open-WebUI 快速部…...
FFmpeg在Android开发中的核心价值是什么?
FFmpeg 在 Android 开发中的核心价值主要体现在其强大的多媒体处理能力和灵活性上,尤其在音视频编解码、流媒体处理及跨平台兼容性方面具有不可替代的作用。以下是具体分析: --- 1. 强大的音视频编解码能力 - 支持广泛格式:FFmpeg 支持几乎所…...
Java的进制转换
进制知识 Java 中使用不同的前缀表示数据,常见的进制数据有二进制(0b)、八进制(0)、十进制(无)、十六进制(0x)。 public class Demo1 {public static void main(String…...
SpringBoot中的拦截器
SpringBoot中的拦截器 Filter 典型场景 全局鉴权/接口耗时统计 WebFilter("/*") public class CostFilter implements Filter {Overridepublic void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) {long start System.currentTimeMill…...
使用聊天模型和提示模板构建一个简单的 LLM 应用程序
官方教程 官方案例 在上面的链接注册后,请确保设置您的环境变量以开始记录追踪 export LANGSMITH_TRACING"true" export LANGSMITH_API_KEY"..."或者,如果在笔记本中,您可以使用以下命令设置它们 import getpass imp…...
paimon中批和流查看过去的快照的数据及变动的数据
1、批处理 创建表并插入三条数据 CREATE TABLE ws_t (id INT,ts BIGINT,vc INT,PRIMARY KEY (id) NOT ENFORCED ); INSERT INTO ws_t VALUES(2,2,2),(3,3,3),(4,4,4),(5,5,5); --设置执行模式为批处理 RESET execution.checkpointing.interval; SET execution.runtime-mode …...
Linux513 rsync本地传输 跨设备传输 一
ping节点bPing通 仅主机模式不需要设置网关节点a也可以Ping通节点b 同步成功 下载文件夹成功 今日源码 节点a 节点b...
c语言第一个小游戏:贪吃蛇小游戏08(贪吃蛇完结)
贪吃蛇撞墙和想不开咬死自己 #include <curses.h> #include <stdlib.h> struct snake{ int hang; int lie; struct snake *next; }; struct snake food; struct snake *head; struct snake *tail; int key; int dir; #define UP 1 #define DOWN -1 …...
Android Native 之 自定义进程
在Android五层架构中,native层基本上全是c的世界,这些c进程基本上靠android世界的第一个进程init进程创建,init通过rc配置文件,创建了众多的c子进程,也是这众多的c进程,构建了整个android世界的native层。 …...
深度学习 自然语言处理(RNN) day_02
1. 感知机与神经网络 1.1 感知机 生物神经元: 1.1.1 感知机的概念 感知机(Perceptron),又称神经元(Neuron,对生物神经元进行了模仿)是神 经网络(深度学习)的起源算法&am…...
Kotlin 中的作用域函数
在 Kotlin 中,作用域函数是一组用于在对象上下文中执行代码块的函数。 它们通过简洁的语法实现对对象的操作和逻辑封装。 作用域函数的对比: 1 let 特点: 通过 it 访问对象,需显式使用;返回值是代码块的最后一行结果…...
Linux的SLES系统和其他几大系统之间的区别
✅ SLES 和其他主流 Linux 发行版对比表 特性/发行版SLES (SUSE Linux Enterprise Server)RHEL (Red Hat Enterprise Linux)CentOS / AlmaLinux / RockyUbuntu ServerDebian定位企业级,注重稳定性和支持企业级,行业标准,广泛应用社区版 RHEL…...
上位机学习攻略、步骤和实战路径
目录 🎯 一、什么是上位机? 🧭 二、学习步骤和路径 第一步:了解基础概念 第二步:掌握通信协议 1. 常见协议: 2. 学习目标: 第三步:熟悉主流上位机软件 可选工具及语言&#…...
【爬虫】DrissionPage-1
官网地址:DrissionPage官网 小需求采集,我喜欢,我要学。 1 介绍 这是用python编写的爬虫自动化工具,将Selenium 和 Requests 的功能巧妙地整合在一起,提供了统一又简单的操作接口。开发者可以在浏览器模式࿰…...
API安全
目录 API安全:从威胁到防护的全面解析 引言 一、API安全的定义与重要性 1.1 API安全的核心目标 1.2 API安全的挑战 二、API的常见安全威胁 2.1 身份验证攻击 2.2 中间人攻击(MITM) 2.3 注入攻击 2.4 安全配置错误 2.5 拒绝服务&…...
UDP和TCP协议
目录 1. UDP协议 1.1. UDP的特性 1.2. UDP的包头 1.3. UDP的三大使用场景和实际例子 1.4. TCP和UDP的区别 2. TCP协议 2.1. TCP包头格式 2.2. TCP包头和UDP包头对比 2.3. TCP协议的特点 2.4. TCP的三次握手(连接维护问题) 2.5. TCP的四次挥手…...
关于Go语言的开发环境的搭建
1.Go开发环境的搭建 其实对于GO语言的这个开发环境的搭建的过程,类似于java的开发环境搭建,我们都是需要去安装这个开发工具包的,也就是俗称的这个SDK,他是对于我们的程序进行编译的,不然我们写的这个代码也是跑不起来…...
【Bootstrap V4系列】学习入门教程之 组件-导航(Navs)
【Bootstrap V4系列】学习入门教程之 组件-导航(Navs) 导航(Navs)一、Base nav二、Available styles 可用样式2.1 Horizontal alignment 水平对齐2.2 Vertical 垂直的2.3 Tabs 表格样式2.4 Pills 胶囊样式2.5 Fill and justify 填…...
基于单片机的视力保护仪设计与实现
标题:基于单片机的视力保护仪设计与实现 内容:1.摘要 随着电子设备的普及,人们的视力健康面临着严峻挑战。为了有效预防近视等视力问题,本文旨在设计并实现一款基于单片机的视力保护仪。通过采用红外传感器、光敏传感器等元件,实时监测使用者…...