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

分布式事务解决方案全解析:从经典模式到现代实践

前言

在分布式系统中,数据一致性是一个核心问题。随着微服务架构的普及,跨服务、跨数据库的操作变得越来越普遍,如何保证这些操作的原子性、一致性、隔离性和持久性(ACID)成为了一个极具挑战性的任务。本文将全面介绍 2PC、TCC、最大努力通知、本地消息表、Saga、XA 协议、可靠消息传输、Seata AT 模式 等主流分布式事务解决方案,并通过 Java 示例代码和 流程图帮助您更直观地理解每种方案。


一、2PC(两阶段提交)

简介

两阶段提交(2PC)是一种经典的分布式事务协议,分为准备阶段和提交阶段两个步骤。它通过协调者(Coordinator)来控制多个参与者的事务执行。

工作原理

  1. 准备阶段:协调者询问所有参与者是否可以提交事务。
  2. 提交阶段:如果所有参与者都同意,则协调者发送提交命令;否则回滚事务。

UML图

协调者 参与者A 参与者B 准备请求 准备请求 准备就绪 准备就绪 所有参与者准备就绪 提交请求 提交请求 已提交 已提交 回滚请求 回滚请求 已回滚 已回滚 alt [提交] [中止] 协调者 参与者A 参与者B

Java 示例代码

interface Participant {boolean prepare();void commit();void rollback();
}class ParticipantA implements Participant {@Overridepublic boolean prepare() {System.out.println("参与者A:准备完成");return true;}@Overridepublic void commit() {System.out.println("参与者A:提交完成");}@Overridepublic void rollback() {System.out.println("参与者A:回滚完成");}
}class TwoPhaseCommitCoordinator {private List<Participant> participants;public TwoPhaseCommitCoordinator(List<Participant> participants) {this.participants = participants;}public void executeTransaction() {boolean allPrepared = true;for (Participant participant : participants) {if (!participant.prepare()) {allPrepared = false;break;}}if (allPrepared) {for (Participant participant : participants) {participant.commit();}} else {for (Participant participant : participants) {participant.rollback();}}}
}

二、TCC(Try-Confirm-Cancel)

简介

TCC 是一种补偿型的分布式事务解决方案,将业务逻辑分为三个阶段:

  1. 尝试(Try):预留资源。
  2. 确认(Confirm):真正执行业务操作。
  3. 取消(Cancel):撤销预留资源。

UML图

服务A 服务B 尝试操作 尝试结果 判断是否继续 确认操作 确认结果 取消操作 取消结果 alt [成功] [失败] 服务A 服务B

Java 示例代码

interface TccTransaction {boolean tryOperation();void confirm();void cancel();
}class ServiceA implements TccTransaction {@Overridepublic boolean tryOperation() {System.out.println("服务A:尝试操作");return true;}@Overridepublic void confirm() {System.out.println("服务A:确认操作");}@Overridepublic void cancel() {System.out.println("服务A:取消操作");}
}class TccTransactionManager {private List<TccTransaction> services;public TccTransactionManager(List<TccTransaction> services) {this.services = services;}public void executeTransaction() {boolean allTrySuccess = true;for (TccTransaction service : services) {if (!service.tryOperation()) {allTrySuccess = false;break;}}if (allTrySuccess) {for (TccTransaction service : services) {service.confirm();}} else {for (TccTransaction service : services) {service.cancel();}}}
}

三、最大努力通知

简介

最大努力通知是一种基于最终一致性的分布式事务解决方案,适用于对实时性要求不高但可靠性要求较高的场景。

工作原理

  1. 发送通知:支付服务向订单服务发送支付成功的通知。
  2. 重试机制:如果通知失败,则记录失败日志并通过定时任务重试,直到成功或达到最大重试次数。

UML图

支付服务 订单服务 定时任务 发送支付成功通知 返回成功 记录失败日志 定时重试通知 重复重试,直到成功或达到最大次数 alt [通知成功] [通知失败] 支付服务 订单服务 定时任务

Java 示例代码

public class PaymentService {private OrderService orderService;public PaymentService(OrderService orderService) {this.orderService = orderService;}public void notifyPaymentSuccess(String orderId) {try {boolean success = orderService.notifyPayment(orderId);if (!success) {saveToRetryTable(orderId);}} catch (Exception e) {saveToRetryTable(orderId);}}private void saveToRetryTable(String orderId) {System.out.println("保存到重试表:orderId=" + orderId);}
}public class RetryTask {private PaymentService paymentService;public RetryTask(PaymentService paymentService) {this.paymentService = paymentService;}public void executeRetryTask() {List<String> retryOrders = fetchFromRetryTable();for (String orderId : retryOrders) {paymentService.notifyPaymentSuccess(orderId);}}private List<String> fetchFromRetryTable() {return List.of("order1", "order2");}
}

四、本地消息表

简介

本地消息表通过在每个服务中维护一个消息表来记录需要发送的消息,并通过异步方式将消息发送出去。

工作原理

  1. 写入本地消息表:业务操作完成后,将消息插入消息表。
  2. 异步发送消息:通过后台任务发送消息。

UML图

业务服务 消息表 消息队列 写入消息 异步发送消息 业务服务 消息表 消息队列

Java 示例代码

public class LocalMessageService {public void sendMessage(String message) {// 执行业务操作businessOperation();// 插入本地消息表insertIntoLocalMessageTable(message);// 异步发送消息asyncSendMessage();}private void businessOperation() {System.out.println("执行业务操作");}private void insertIntoLocalMessageTable(String message) {System.out.println("插入本地消息表:" + message);}private void asyncSendMessage() {System.out.println("异步发送消息");}
}

五、Saga

简介

Saga 是一种基于事件驱动的长事务管理方法,使用正向操作和补偿操作来实现最终一致性。

工作原理

  1. 正向操作:依次执行事务中的每个步骤。
  2. 补偿操作:如果某个步骤失败,则依次回滚前面的步骤。

UML图

服务A 服务B 正向操作 正向结果 判断是否继续 下一步操作 补偿操作 alt [成功] [失败] 服务A 服务B

Java 示例代码

interface SagaStep {void execute();void compensate();
}class StepA implements SagaStep {@Overridepublic void execute() {System.out.println("执行步骤A");}@Overridepublic void compensate() {System.out.println("补偿步骤A");}
}class StepB implements SagaStep {@Overridepublic void execute() {System.out.println("执行步骤B");}@Overridepublic void compensate() {System.out.println("补偿步骤B");}
}class SagaManager {private List<SagaStep> steps;public SagaManager(List<SagaStep> steps) {this.steps = steps;}public void executeSaga() {int stepIndex = 0;try {for (SagaStep step : steps) {step.execute();stepIndex++;}} catch (Exception e) {for (int i = stepIndex - 1; i >= 0; i--) {steps.get(i).compensate();}}}
}

六、XA 协议

简介

XA 协议是 X/Open 组织提出的分布式事务处理标准,定义了事务管理器(TM)和资源管理器(RM)之间的接口。XA 协议的核心思想是通过两阶段提交来实现分布式事务。

UML图

事务管理器 资源管理器1 资源管理器2 开始事务 开始事务 准备完成 准备完成 提交事务 提交事务 回滚事务 回滚事务 alt [提交] [回滚] 事务管理器 资源管理器1 资源管理器2

Java 示例代码

import javax.transaction.xa.XAResource;
import javax.transaction.xa.Xid;public class XADemo {public static void main(String[] args) throws Exception {XAResource resource1 = new MyXAResource();XAResource resource2 = new MyXAResource();Xid xid = new MyXid(1, new byte[]{0x01}, new byte[]{0x02});// 开始事务resource1.start(xid, XAResource.TMNOFLAGS);resource2.start(xid, XAResource.TMNOFLAGS);// 执行操作resource1.end(xid, XAResource.TMSUCCESS);resource2.end(xid, XAResource.TMSUCCESS);// 准备提交int result1 = resource1.prepare(xid);int result2 = resource2.prepare(xid);if (result1 == XAResource.XA_OK && result2 == XAResource.XA_OK) {resource1.commit(xid, false);resource2.commit(xid, false);} else {resource1.rollback(xid);resource2.rollback(xid);}}
}

七、可靠消息传输

简介

可靠消息传输依赖于消息队列(如 Kafka、RabbitMQ)来保证消息的可靠传递。通常结合本地事务和消息队列来实现最终一致性。

UML图

生产者 消息队列 消费者 发送消息 推送消息 确认消费 生产者 消息队列 消费者

Java 示例代码

public class ReliableMessageProducer {public void sendMessage(String message) {// 执行业务操作businessOperation();// 发送消息到消息队列sendToMessageQueue(message);}private void businessOperation() {System.out.println("执行业务操作");}private void sendToMessageQueue(String message) {System.out.println("发送消息到消息队列:" + message);}
}public class ReliableMessageConsumer {public void consumeMessage(String message) {// 消费消息并执行业务逻辑processMessage(message);// 确认消费acknowledgeMessage();}private void processMessage(String message) {System.out.println("处理消息:" + message);}private void acknowledgeMessage() {System.out.println("确认消费");}
}

八、Seata AT 模式

简介

Seata 是一种开源的分布式事务解决方案,支持多种模式来解决分布式事务问题,其中 AT(Auto Transaction)模式是一种无侵入式的解决方案,适用于微服务架构下的分布式事务管理。

Seata AT 模式的工作流程
  1. 一阶段提交:业务数据和回滚日志记录在同一个本地事务中提交到数据库。
  2. 二阶段提交:如果所有分支事务都成功,则全局事务提交;如果有任何一个分支失败,则根据回滚日志进行补偿操作。

UML图

应用程序 资源管理器 事务协调器 开始本地事务 返回资源ID 注册分支事务 返回分支ID 提交本地事务 上报事务状态 全局提交 根据回滚日志补偿 alt [所有分支成功] [存在失败分支] 应用程序 资源管理器 事务协调器

Java 示例代码

import io.seata.rm.datasource.DataSourceProxy;
import javax.sql.DataSource;public class SeataATDemo {private DataSource dataSource;public SeataATDemo(DataSource originalDataSource) {// 使用 Seata 的 DataSourceProxy 包装原始的数据源this.dataSource = new DataSourceProxy(originalDataSource);}public void executeBusinessLogic() throws Exception {// 假设这里执行一些涉及多个服务或数据库的操作String sql = "UPDATE account SET balance = balance - 100 WHERE user_id = 'user1';";try (java.sql.Connection connection = dataSource.getConnection();java.sql.PreparedStatement statement = connection.prepareStatement(sql)) {statement.executeUpdate();}}
}

总结

分布式事务的解决方案多种多样,每种方法都有其适用场景:

  • 2PC 和 XA 适合强一致性场景,但性能开销较大。
  • TCC 和 Saga 提供了更高的灵活性,但需要手动设计补偿逻辑。
  • 最大努力通知 和 本地消息表 更适合最终一致性场景,实现简单且高效。
  • 可靠消息传输 依赖消息队列实现高可靠性和最终一致性。
  • Seata AT 模式 提供了一种无侵入式的解决方案,特别适用于微服务架构,简化了分布式事务的处理。

希望本文能为您提供全面的理解,并帮助您在实际项目中选择合适的分布式事务解决方案!

相关文章:

分布式事务解决方案全解析:从经典模式到现代实践

前言 在分布式系统中&#xff0c;数据一致性是一个核心问题。随着微服务架构的普及&#xff0c;跨服务、跨数据库的操作变得越来越普遍&#xff0c;如何保证这些操作的原子性、一致性、隔离性和持久性&#xff08;ACID&#xff09;成为了一个极具挑战性的任务。本文将全面介绍…...

迈向未来:数字化工厂管理如何重塑生产力

迈向未来:数字化工厂管理如何重塑生产力 随着工业4.0的浪潮席卷全球,“数字化工厂管理”成为制造业转型的关键一步。从传统生产模式到数据驱动的智能制造,企业在追求生产效率、质量与灵活性方面实现了飞跃式发展。然而,实施数字化管理不仅仅是技术问题,更关乎流程优化、数…...

LeetCode 1863.找出所有子集的异或总和再求和

题解 根据上述图可以根据二进制运算获取所有的子集&#xff0c;但是可以使用二进制获取所有子集需要有题目的这一句话才能够使用注意&#xff1a;在本题中&#xff0c;元素相同的不同子集应多次计数。 也就是对于{2,2,3,4,5}的子集不会简化成{2,3,4,5} public static int sub…...

蓝桥云客---蓝桥速算

3.蓝桥速算【算法赛】 - 蓝桥云课 问题描述 蓝桥杯大赛最近新增了一项娱乐比赛——口算大赛&#xff0c;目的是测试选手的口算能力。 比赛规则如下&#xff1a; 初始给定一个长度为 N 的数组 A&#xff0c;其中第 i 个数字为 Ai​。随后数组会被隐藏&#xff0c;并进行 Q 次…...

Kafka 概念

&#x1f300; Kafka 是什么&#xff1f; Kafka 是一个分布式流处理平台&#xff0c;可以用来&#xff1a; &#x1f69a; 高效地收集、传输、存储、处理 实时数据流。 它最初由 LinkedIn 开发&#xff0c;用于解决海量日志处理的问题&#xff0c;后来开源给 Apache&#xff0…...

双向链表增删改查的模拟实现

本章目标 0.双向链表的基本结构 1.双向链表的初始化 2.头插尾插 3.头删尾删 4.查找与打印 5.在指定位置之前插入数据/在指定位置之后插入数据 6.在指定位置之前删除数据/在指定位置之后删除数据 7.销毁链表 0.双向链表的基本结构 本章所实现的双向链表是双向循环带头链表,是…...

配置ASP.NET Core+NLog配置日志示例

以下是一个精简且实用的 NLog 配置文件示例,适用于 ASP.NET Core 项目,包含文件日志、控制台日志和自动归档功能: NLog.config 示例‌ (保存到项目根目录) xml Copy Code <?xml version="1.0" encoding="utf-8" ?> <nlog xmlns="http:…...

Roo Code使用MCP服务(大模型上下文协议)

MCP概念火爆&#xff0c;但是理解起来有点难度&#xff0c;使用起来也有点难度。 启用MCP RooCode直接支持使用MCP服务&#xff0c;甚至可以帮助写MCP&#xff0c;为我们提供了很大的方便。单击 Roo Code 窗格顶部导航栏中的类似三个插座的图标&#xff0c;显示如下MCP的配置…...

【项目管理】第一部分 信息技术 1/2

相关文档&#xff0c;希望互相学习&#xff0c;共同进步 风123456789&#xff5e;-CSDN博客 概要 知识点&#xff1a; 现代化基础设施、数字经济、工业互联网、车联网、智能制造、智慧城市、数字政府、5G、常用数据库类型、数据仓库、信息安全、网络安全态势感知、物联网、大数…...

《UNIX网络编程卷1:套接字联网API》第6章 IO复用:select和poll函数

《UNIX网络编程卷1&#xff1a;套接字联网API》第6章 I/O复用&#xff1a;select和poll函数 6.1 I/O复用的核心价值与适用场景 I/O复用是高并发网络编程的基石&#xff0c;允许单个进程/线程同时监控多个文件描述符&#xff08;套接字&#xff09;的状态变化&#xff0c;从而高…...

Three.js 系列专题 1:入门与基础

什么是 Three.js? Three.js 是一个基于 WebGL 的 JavaScript 库,它简化了 3D 图形编程,让开发者无需深入了解底层 WebGL API 就能创建复杂的 3D 场景。它广泛应用于网页游戏、可视化、虚拟现实等领域。 学习目标 理解 Three.js 的核心组件:场景(Scene)、相机(Camera)…...

Qt框架深度解析:核心技术、应用场景与实战指南

Qt&#xff08;发音同“cute”&#xff09;是一个跨平台的C应用程序开发框架&#xff0c;广泛用于开发图形用户界面&#xff08;GUI&#xff09;程序&#xff0c;但也支持非GUI的后台服务、命令行工具等。它由挪威的Trolltech公司于1995年推出&#xff0c;后由诺基亚、Digia等公…...

低代码开发平台:飞帆中的控件中转区

低代码开发平台&#xff1a;飞帆中的控件中转区的作用 当控件因为尺寸太大难以拖到 div 框中时&#xff0c;可以先拖到控件中转区中&#xff0c;此时控件会变成一个标签&#xff0c;然后将这个标签拖到 div 框中即可。 飞帆 fvi.cn...

基于STM32的智能门禁系统设计与实现

一、项目背景与功能概述 在物联网技术快速发展的今天&#xff0c;传统门锁正在向智能化方向演进。本系统基于STM32F103C8T6微控制器&#xff0c;整合多种外设模块&#xff0c;实现了一个具备以下核心功能的智能门禁系统&#xff1a; 密码输入与验证&#xff08;4x3矩阵键盘&a…...

maven项目打包jar给其他项目pom外部引用

maven项目打包jar给其他项目pom外部引用 在现实开发过程中&#xff0c;很多代码需要被重复利用的&#xff0c;但是代码量又是很多&#xff0c;这样的代码可以提出出来作为公共代码或者叫做工具使用&#xff0c;通常这样的工具会以jar包的形式被其他项目pom引入使用。第一步 创…...

Linux线程

一、线程的使用 线程创建 函数原型及头文件 #include <pthread.h> int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void *), void *restrict arg); 参数&#xff1a; tidp&#xff1a;当pthread_create成功…...

Keepalive+LVS+Nginx+NFS高可用项目

项目架构 分析 主机规划 主机系统安装应用网络IPclientredhat 9.5无NAT172.25.250.115/24lvs-masterrocky 9.5ipvsadm&#xff0c;keepalivedNAT172.25.250.116/24 VIP 172.25.250.100/32lvs-backuprocky 9.5ipvsadm&#xff0c;keepalivedNAT172.25.250.117/24 VIP 172.25.2…...

在线编辑数学公式

参考工具&#xff1a; https://www.processon.com/mathtype https://www.latexlive.com/ 一、简单好用的数学公式编辑工具推荐 1. MathType / AxMath • 特点&#xff1a;专业公式编辑软件&#xff0c;支持与Word、WPS等办公软件无缝集成&#xff0c;提供丰富的数学符号和模…...

【spring Cloud Netflix】OpenFeign组件

1.概述 Feign旨在使编写Java Http客户端变得更容易。前面在使用RibbonRestTemplate进行服务的远程调用 时&#xff0c;利用RestTemplate对Http请求的封装处理&#xff0c;形成了一套模板化的调用方法。但是在实际开发中&#xff0c;由 于对服务的依赖调用可不止一处&#xff0…...

基于Flask的Windows命令大全Web应用技术解析与架构设计

基于Flask的Windows命令大全Web应用技术解析与架构设计 引言 Windows命令行工具是系统管理和开发调试的核心技能之一。然而&#xff0c;许多用户对常用命令的用法和场景并不熟悉。本文通过一个基于Flask框架开发的Web应用&#xff0c;系统性地整理了50个Windows命令的用法&…...

Qt中左侧项目菜单中构建设置功能中的构建步骤是怎么回事

在 Qt Creator 中&#xff0c;**构建设置&#xff08;Build Settings&#xff09;下的构建步骤&#xff08;Build Steps&#xff09;**是控制项目如何编译、链接和生成最终产物的核心配置区域。它允许你自定义编译过程中的各个阶段&#xff08;如 qmake、make、cmake 等命令的具…...

(一)从零开始:用 LangChain 和 ZhipuAI 搭建简单对话

最近一直在研究如何用 LangChain 和 ZhipuAI 搭建一个智能对话系统&#xff0c;发现这个组合真的非常强大&#xff0c;而且实现起来并不复杂。今天就来分享一下我的学习过程和一些心得体会&#xff0c;希望能帮到同样在探索这个领域的小伙伴们。 一、 环境搭建&#xff1a;从零…...

Java大厂面试题 -- JVM 优化进阶之路:从原理到实战的深度剖析(2)

最近佳作推荐&#xff1a; Java大厂面试题 – 深度揭秘 JVM 优化&#xff1a;六道面试题与行业巨头实战解析&#xff08;1&#xff09;&#xff08;New&#xff09; 开源架构与人工智能的融合&#xff1a;开启技术新纪元&#xff08;New&#xff09; 开源架构的自动化测试策略优…...

C++ 标准库参考手册深度解析

C 标准库参考手册是每个 C 开发者的必备工具。本文将系统性解析其架构设计、核心功能及实战应用技巧&#xff0c;帮助开发者构建高效的知识检索与代码开发工作流&#xff0c;涵盖从语法查询到编译器适配的全流程技术细节。 一、网站架构与技术细节 1. 信息组织体系 1.1 层级化…...

单片机学习笔记8.定时器

IAP15W4K58S4定时/计数器结构工作原理 定时器工作方式控制寄存器TMOD 不能进行位寻址&#xff0c;只能对整个寄存器进行赋值 寄存器地址D7D6D5D4D3D2D1D0复位值TMOD89HGATEC/(T低电平有效)M1M0GATEC/(T低电平有效)M1M000000000B D0-D3为T0控制&#xff0c;D4-D7为T1控制 GAT…...

神经网络入门:生动解读机器学习的“神经元”

神经网络作为机器学习中的核心算法之一&#xff0c;其灵感来源于生物神经系统。在本文中&#xff0c;我们将带领大家手把手学习神经网络的基本原理、结构和训练过程&#xff0c;并通过详细的 Python 代码实例让理论与实践紧密结合。无论你是编程新手还是机器学习爱好者&#xf…...

2025-04-05 吴恩达机器学习5——逻辑回归(2):过拟合与正则化

文章目录 1 过拟合1.1 过拟合问题1.2 解决过拟合 2 正则化2.1 正则化代价函数2.2 线性回归的正则化2.3 逻辑回归的正则化 1 过拟合 1.1 过拟合问题 欠拟合&#xff08;Underfitting&#xff09; 模型过于简单&#xff0c;无法捕捉数据中的模式&#xff0c;导致训练误差和测试误…...

美团滑块 分析

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 逆向过程 距离识别不准简单学习一下&…...

C++ atomic 原子操作

一、原子操作简介 在多线程编程中&#xff0c;通常我们需要多个线程共享数据。但如果不加以控制&#xff0c;多个线程同时访问同一数据&#xff0c;可能会导致数据不一致或竞争条件&#xff08;race conditions&#xff09;。为了解决这个问题&#xff0c;我们引入了 原子操作…...

Leetcode - 双周赛153

目录 一、3498. 字符串的反转度二、3499. 操作后最大活跃区段数 I三、3500. 将数组分割为子数组的最小代价四、3501. 操作后最大活跃区段数 II 一、3498. 字符串的反转度 题目连接 本题直接模拟&#xff0c;代码如下&#xff1a; class Solution {public int reverseDegree(…...

25.4 GLM-4+RAG智能标注实战:标注成本暴降60%,检索准确率飙升40%!

使用 GLM-4 优化 RAG 程序:智能标注提升检索质量 关键词:GLM-4 数据标注, RAG 优化, 检索增强生成, 向量数据库, 语义关联度分析 1. RAG 数据标注的核心挑战 在检索增强生成(Retrieval-Augmented Generation)系统中,检索数据的标注质量直接影响最终生成效果。传统标注方…...

基于sklearn实现文本摘要思考

和各位小伙伴分享一下使用sklearn进行文本摘要的思考。 第一版本 原理 提取式文本摘要的基本原理是&#xff1a; 将文本分割成句子 计算每个句子的重要性(权重) 选择权重最高的几个句子组成摘要 常用的句子权重计算方法&#xff1a; TF-IDF&#xff1a;基于词频-逆文档频…...

Cortex-M3 NVIC可以控制异常向量表的哪些部分

Cortex-M3 的 NVIC(嵌套向量中断控制器)不直接控制整个异常向量表,但可以管理向量表中与中断相关的部分行为。以下是 NVIC 对异常向量表的具体控制范围和相关机制: 1. NVIC 直接控制的部分 NVIC 主要管理 外部中断(IRQ) 和部分 系统异常 的行为,但对向量表本身的存储位…...

AI朝代应避免AI幻觉:分析与应对策略

随着人工智能&#xff08;AI&#xff09;技术的不断发展&#xff0c;AI的应用领域已经涵盖了文本生成、图像与视频创作以及程序编写等多个方面。然而&#xff0c;AI的生成能力并非没有缺陷&#xff0c;其中最为显著的之一就是所谓的“AI幻觉”&#xff08;AI hallucination&…...

网络传输H.264方法对比

一、引言 网络传输H.264有多种方法&#xff0c;包括但不限于&#xff1a;1.通过RTP直接传输H.264&#xff1b;2.通过UDP传输TS流&#xff1b;3.通过RTP传输TS流&#xff1b;4.通过RTP传输PS流。本文对这些方法进行对比。 二、通过RTP直接传输H.264 这种方案就是RTP包&#xf…...

第九章:可靠通信_《凤凰架构:构建可靠的大型分布式系统》

第九章 可靠通信 一、零信任网络模型 核心难点&#xff1a;理解安全模型从传统边界防护到动态信任验证的转变 零信任的核心原则 不再区分"内部可信网络"与"外部不可信网络"&#xff08;传统防火墙模型失效&#xff09;每次请求都需要进行身份验证和授权…...

HeidiSQL:多数据库管理工具

HeidiSQL 是一款广受欢迎的免费开源数据库管理工具&#xff0c;专为数据库管理员及开发者设计。无论您是刚接触数据库领域的新手&#xff0c;还是需要同时处理多种数据库系统的专业开发者&#xff0c;该工具都能凭借其直观的界面和强大的功能&#xff0c;助您轻松完成数据管理任…...

文件系统-inode/软硬件连接(未完结)

首先我们了解一下文件简洁理解来说就是&#xff1a;文件内容文件属性 ---> 磁盘上存储的文件存文件的内容存文件的属性&#xff1b;而文件的内容----存放在每个数据块 &#xff1b;文件属性存放在iNode里面。 要明白&#xff1a;linux系统中的文件是存储在磁盘中的&#xf…...

数据库并发控制问题

并发控制问题是数据库管理系统&#xff08;DBMS&#xff09;中处理多个事务并发执行时&#xff0c;确保数据一致性、可靠性和完整性的一系列技术和挑战。并发控制问题通常与事务的隔离性和事务之间的相互影响有关。以下是并发控制中主要的几种问题及其解决方式的详细解释&#…...

(五)智能体与工具协同——打造智能对话的超级助手

上一篇&#xff1a;&#xff08;四&#xff09;数据检索与增强生成——让对话系统更智能、更高效 在前四个阶段&#xff0c;我们已经搭建了一个功能强大的智能对话&#xff0c;并深入探讨了输入输出处理、链式工作流构建和数据检索与增强生成的细节。现在&#xff0c;我们将进…...

第十三届蓝桥杯 2022 省 B 刷题统计

题目描述 小明决定从下周一开始努力刷题准备蓝桥杯竞赛。他计划周一至周五每天做 a a a 道题目,周六和周日每天做 b b b 道题目。请你帮小明计算,按照计划他将在第几天实现做题数大于等于 n n n 题? 输入格式 输入一行包含三个整数 a , b a, b a,b 和 n n n. 输出格…...

NLP/大模型八股专栏结构解析

1.transformer 结构相关 &#xff08;1&#xff09;transformer的基本结构有哪些&#xff0c;分别的作用是什么&#xff0c;代码实现。 NLP高频面试题&#xff08;一&#xff09;——Transformer的基本结构、作用和代码实现 &#xff08;2&#xff09;LSTM、GRU和Transformer结…...

不在 qtdesigner中提升,进行主题程序设计

以下是无需在Qt Designer中提升控件的完整主题化方案&#xff0c;保持现有代码结构的同时实现动态阴影效果管理&#xff1a; 一、增强主题管理器&#xff08;支持动态控件发现&#xff09; // thememanager.h #pragma once #include <QObject> #include <QSet> #…...

TDengine 3.3.6.0 版本中非常实用的 Cols 函数

简介 在刚刚发布的 TDengine 3.3.6.0 版本 中&#xff0c;新增了一个非常实用的 函数COLS &#xff0c;此函数用于获取选择函数所在行列信息&#xff0c;主要应用在生成报表数据&#xff0c;每行需要出现多个选择函数结果&#xff0c;如统计每天最大及最小电压&#xff0c;并报…...

MessageQueue --- RabbitMQ WorkQueue and Prefetch

MessageQueue --- RabbitMQ WorkQueue and Prefetch 什么是WorkQueue分发机制 --- RoundRobin分发机制 --- PrefetchSpring example use prefetch --- Fair Dispatch 什么是WorkQueue Work queues&#xff0c;任务模型。简单来说就是让多个消费者绑定到一个队列&#xff0c;共同…...

第四章:透明多级分流系统_《凤凰架构:构建可靠的大型分布式系统》

第四章&#xff1a;透明多级分流系统 一、客户端缓存 核心目标&#xff1a;减少重复请求&#xff0c;降低服务端压力。 1. 强制缓存 定义&#xff1a;客户端直接根据缓存规则决定是否使用本地缓存&#xff0c;无需与服务端交互。关键HTTP头&#xff1a; Cache-Control&#…...

题解:AT_abc241_f [ABC241F] Skate

一道经典的 bfs 题。 提醒&#xff1a;本题解是为小白专做的&#xff0c;不想看的大佬请离开。 这道题首先一看就知道是 bfs&#xff0c;但是数据点不让我们过&#xff1a; 1 ≤ H , W ≤ 1 0 9 1\le H,W\le10^9 1≤H,W≤109。 那么我们就需要优化了&#xff0c;从哪儿下手…...

热题100-字母异位词分组

方法用Arrays.sort对每个String 进行排序&#xff0c;毕竟排序以后都一样了&#xff0c;然后放入Map中的key跟value&#xff0c;可以一对多&#xff0c;然后返回的时候只要返回Map中所有的values就可以了 class Solution {public List<List<String>> groupAnagram…...

WiFi加密协议

目录 1. 认证(Authentication)‌ ‌1.1 开放系统认证(Open System Authentication)‌ 1.2 共享密钥认证(Shared Key Authentication)‌ ‌1.3 802.1X/EAP认证(企业级认证)‌ ‌2. 关联(Association)‌ ‌3. 加密协议(Security Handshake)‌ ‌整体流程总结‌…...

【AI提示词】书籍推荐专家

提示说明 帮助您找到适合您的好书。 提示词 ## Role: 书籍推荐专家## Profile: - author: xxx - version: 1.0.0 - language: 中文 - description: 我是一位书籍推荐专家&#xff0c;我可以帮助您找到适合您的好书。## Goals: - 吸引读者的注意力&#xff0c;引导他们阅读更…...