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

深入理解与实践Seata:分布式事务解决方案

✅作者简介:热爱Java后端开发的一名学习者,大家可以跟我一起讨论各种问题喔。
🍎个人主页:Hhzzy99
🍊个人信条:坚持就是胜利!
💞当前专栏:微服务
🥭本文内容:微服务的学习


文章目录

  • 深入理解与实践Seata:分布式事务解决方案
    • 引言
    • 1. Seata 简介
      • 1.1 Seata 的历史和背景
      • 1.2 Seata 的主要功能和特性
      • 1.3 Seata 的核心组件:TC、TM和RM
    • 2. 深入理解Seata的工作原理
      • 2.1 全局事务和分支事务
      • 2.2 Seata 的全局事务处理流程
      • 2.3 Seata 的分支事务处理流程
      • 2.4 Seata 的事务隔离级别和并发控制
    • 3. 在Spring Boot中使用Seata
      • 3.1 配置Seata
      • 3.2 在Spring Boot中使用Seata进行全局事务管理
      • 3.3 在Spring Boot中使用Seata进行分支事务管理
      • 3.4 在Spring Boot中处理Seata的异常和故障
    • 4. Seata的高级特性
      • 4.1 Seata的全局锁
      • 4.2 Seata的并发控制
      • 4.3 Seata的故障恢复
      • 4.4 Seata的性能优化和调优
    • 5. Seata的实际应用和案例分析
      • 5.1 在电商系统中使用Seata进行分布式事务管理
      • 5.2 在金融系统中使用Seata进行分布式事务管理
      • 5.3 在物流系统中使用Seata进行分布式事务管理
    • 6. Seata与其他分布式事务解决方案的对比
      • 6.1 Seata vs Saga
      • 6.2 Seata vs TCC
      • 6.3 Seata vs XA
    • 总结


深入理解与实践Seata:分布式事务解决方案

引言

在当前的互联网行业中,微服务架构已经成为了主流的系统架构模式。它将大型单体应用拆分为多个独立运行、松耦合的小型服务,每个服务都有自己的数据库和业务逻辑,它们通过网络接口进行通信和协作。微服务架构具有高度的模块化,可以大大提高系统的灵活性和可扩展性。

然而,微服务架构也带来了一些新的挑战,其中最大的一个就是分布式事务管理。在单体应用中,我们可以通过传统的ACID事务来确保数据的一致性。但在微服务架构中,由于每个服务都有自己的数据库,ACID事务无法跨越服务边界。为了解决这个问题,我们需要一种新的事务模型,能够在分布式环境中保证数据的一致性。这就是我们今天要介绍的主题——Seata。

Seata是一种开源的分布式事务解决方案,提供了强大的事务管理能力,可以帮助我们在微服务架构中实现数据的一致性。在本文中,我们将深入解析Seata的工作原理和核心机制,包括全局事务、分支事务、事务协调等。我们还将介绍如何在Spring Boot中使用Seata进行事务管理,以及Seata的高级特性和实践案例。

无论你是刚开始接触微服务架构,还是已经在使用微服务架构,我都相信你能从这篇文章中获得有价值的知识和启示。那么,让我们开始吧!

1. Seata 简介

1.1 Seata 的历史和背景

Seata,全名Simple Extensible Autonomous Transaction Architecture,是由阿里巴巴集团开发的开源分布式事务解决方案。Seata 旨在解决微服务架构中的分布式事务问题,确保全局事务的一致性。

早在 2014 年,阿里巴巴在内部就开始使用 Seata。2019 年初,Seata 项目正式开源,得到了广大开发者的积极响应和热烈支持。现在,Seata 已经成为了分布式事务解决方案的主流选择之一,被广泛应用在电商、金融、物流等多个领域。

1.2 Seata 的主要功能和特性

Seata 提供了一种基于 AT 模式的分布式事务解决方案。AT 模式,全名 Auto-commit Transaction,即自动提交事务,是 Seata 的默认事务模式。

Seata 的主要特性和功能包括:

  1. 全局事务管理:Seata 提供了全局事务管理器(Global Transaction Manager,简称 TM),用于协调分布式事务的提交和回滚。

  2. 分支事务管理:Seata 提供了分支事务管理器(Branch Transaction Manager,简称 RM),用于控制资源(如数据库)的本地事务。

  3. 故障恢复:Seata 提供了故障恢复机制,用于处理系统崩溃或网络故障等异常情况。

  4. 并发控制:Seata 提供了并发控制机制,用于处理并发事务的冲突。

  5. 高可用和可扩展:Seata 采用了高可用和可扩展的架构,可以轻松应对大规模的微服务场景。

1.3 Seata 的核心组件:TC、TM和RM

Seata 的架构主要由三个核心组件组成:事务协调器(Transaction Coordinator,简称 TC)、全局事务管理器(Global Transaction Manager,简称 TM)和分支事务管理器(Resource Manager,简称 RM)。

  1. TC(Transaction Coordinator):TC 是 Seata 的核心,负责协调全局事务的提交或回滚。TC 负责存储全局事务和分支事务的状态,处理全局事务的生命周期,并协调分支事务的提交和回滚。

  2. TM(Transaction Manager):TM 是全局事务的发起者和终结者。TM 定义了全局事务的边界,负责开启全局事务、提交或回滚全局事

务。

  1. RM(Resource Manager):RM 是分支事务的参与者。RM 负责管理资源(如数据库),控制分支事务的生命周期,并根据 TC 的指令提交或回滚分支事务。

以上就是关于 Seata 的简介,接下来我们将深入解析 Seata 的工作原理和使用方式。

2. 深入理解Seata的工作原理

2.1 全局事务和分支事务

在Seata中,一个分布式事务被称为全局事务,它由多个分支事务组成。全局事务由全局事务管理器(TM)发起和驱动,分支事务由资源管理器(RM)处理。

全局事务是对整个分布式事务的抽象,它的生命周期包括Begin、Commit和Rollback三个阶段。分支事务是全局事务中的一部分,它对应于单个服务中的本地事务。

2.2 Seata 的全局事务处理流程

当TM开始一个全局事务时,它会向TC发送Begin请求,TC会创建一个全局事务,并返回一个全局事务ID(XID)给TM。TM然后会在每个参与者(RM)上开启分支事务,并将XID传递给它们。

当TM决定提交或回滚全局事务时,它会向TC发送Commit或Rollback请求。TC会根据全局事务的状态和分支事务的状态,决定是否提交或回滚各个分支事务。

2.3 Seata 的分支事务处理流程

当RM收到TM的请求,开始一个分支事务时,它会向TC注册这个分支事务。注册信息包括XID、资源ID(例如数据库的URL)、分支事务的SQL语句等。

在分支事务处理期间,RM会记录数据的前镜像和后镜像。前镜像在分支事务开始时记录,后镜像在分支事务结束时记录。

当TC决定提交或回滚分支事务时,RM会根据TC的指令和前后镜像,执行相应的操作。如果提交,RM会将后镜像的状态应用到资源上;如果回滚,RM会将前镜像的状态应用到资源上。

2.4 Seata 的事务隔离级别和并发控制

Seata提供了可串行化的事务隔离级别。在分支事务开始时,Seata会记录前镜像;在分支事务结束时,Seata会校验前后镜像,并发控制通过全局行锁来实现,保证了数据在全局事务内的隔离性。

以下是一个使用Seata管理分布式事务的示例代码:

// 开启全局事务
GlobalTransaction tx = GlobalTransactionContext.getCurrentOrCreate();
tx.begin(timeout, name);try {// 执行业务逻辑,可以包含多个服务的调用,每个服务的事务都是一个分支事务businessService.executeBusiness();// 提交全局事务tx.commit();
} catch (Throwable ex) {// 发生异常,回滚全局事务tx.rollback();
}

3. 在Spring Boot中使用Seata

接下来,我们将介绍如何在Spring Boot项目中使用Seata进行分布式事务管理。

3.1 配置Seata

首先,需要在Seata Server上做一些基础的配置。在Seata的配置文件(例如conf/file.conf)中,可以配置事务日志存储方式、事务日志存储路径、事务日志存储DB等。

store {## transaction log storemode = "db"## store session and global sessions in file# file {#   dir = "sessionStore"# }## store session and global sessions in databasedb {datasource = "dbcp"dbType = "mysql"driverClassName = "com.mysql.jdbc.Driver"url = "jdbc:mysql://127.0.0.1:3306/seata"user = "seata"password = "seata"minConn = 5maxConn = 30globalTable = "global_table"branchTable = "branch_table"lockTable = "lock_table"queryLimit = 100}
}

3.2 在Spring Boot中使用Seata进行全局事务管理

要在Spring Boot项目中使用Seata,需要添加Seata Spring Boot Starter依赖到pom.xml中。

<dependency><groupId>io.seata</groupId><artifactId>seata-spring-boot-starter</artifactId><version>${seata.version}</version>
</dependency>

然后,在应用的配置文件(例如application.properties)中,配置Seata Server的地址和应用名。

spring.cloud.alibaba.seata.tx-service-group=my_test_tx_group
seata.enabled=true
seata.application-id=spring-boot-seata-example
seata.tx-service-group=my_test_tx_group
seata.service.vgroup-mapping.my_test_tx_group=default
seata.service.grouplist.default=127.0.0.1:8091

要启动一个全局事务,只需在业务方法上添加@GlobalTransactional注解。

@Service
public class BusinessService {@GlobalTransactionalpublic void doBusiness() {// 调用其他微服务,执行业务操作}
}

3.3 在Spring Boot中使用Seata进行分支事务管理

分支事务是全局事务的一部分,它对应于一个服务中的本地事务。在Seata中,分支事务是自动注册和管理的。

在Spring Boot项目中,只需要使用Spring的@Transactional注解管理本地事务,Seata会自动将其注册为分支事务。

@Service
public class OrderService {@Transactionalpublic void createOrder() {// 创建订单}
}

3.4 在Spring Boot中处理Seata的异常和故障

在使用Seata时,可能会遇到一些异常和故障,例如网络故障、数据库故障、事务冲突等。这时需要捕获并处理这些异常。

Seata定义了一些异常类,例如GlobalTransactionException

BranchTransactionException等。我们可以捕获这些异常,并根据异常类型做出相应的处理。

@Service
public class BusinessService {@GlobalTransactionalpublic void doBusiness() {try {// 调用其他微服务,执行业务操作} catch (GlobalTransactionException e) {// 处理全局事务异常} catch (BranchTransactionException e) {// 处理分支事务异常}}
}

4. Seata的高级特性

在了解了Seata的基础使用方法之后,接下来我们将介绍一些Seata的高级特性,这些特性可以帮助我们更好地管理分布式事务,提高系统的性能和稳定性。

4.1 Seata的全局锁

Seata支持全局锁,用于在分布式环境中实现数据的并发控制。全局锁是通过数据库的悲观锁和乐观锁实现的。

在Seata中,全局锁由TC(Transaction Coordinator)管理,它在全局事务开始时获取锁,全局事务提交或回滚时释放锁。全局锁的获取和释放都是通过向TC发送请求实现的。

全局锁的使用对应用是透明的,只需要在操作数据时加上@GlobalLock注解,Seata会自动处理全局锁的获取和释放。

@Service
public class OrderService {@GlobalLockpublic void updateOrder() {// 更新订单}
}

4.2 Seata的并发控制

Seata支持并发控制,用于解决分布式事务中的并发问题。Seata的并发控制是通过全局锁和版本号实现的。

全局锁用于防止其他事务修改当前事务已经读取或修改的数据,版本号用于在事务提交时检测数据是否已经被其他事务修改。如果数据已经被修改,事务提交会失败,并抛出GlobalTransactionException异常。

4.3 Seata的故障恢复

Seata支持故障恢复,用于处理事务执行过程中的异常和故障。如果事务执行过程中发生故障,例如网络故障、数据库故障等,Seata会自动回滚事务,保证数据的一致性。

在Seata中,故障恢复是通过重试和补偿实现的。重试是在事务执行失败时,重新执行事务。补偿是在事务执行成功但提交失败时,执行反向操作,撤销事务的影响。

4.4 Seata的性能优化和调优

Seata支持性能优化和调优,用于提高事务的执行效率和系统的处理能力。Seata的性能优化主要是通过减少网络通信、优化锁的获取和释放、优化事务日志的写入和读取等方式实现的。

在Seata的配置文件中,可以配置一些参数,例如最大并发事务数、最大分支事务数、事务超时时间等,以优化Seata的性能。

5. Seata的实际应用和案例分析

Seata的应用场景非常广泛,下面我们将通过几个实际的案例来详细分析如何在不同的系统中使用Seata进行分布式事务管理。

5.1 在电商系统中使用Seata进行分布式事务管理

在电商系统中,常见的业务场景包括用户下单、支付、发货、退款等,这些操作涉及到用户、订单、商品、库存等多个服务,必须保证数据的一致性。

例如,用户下单的过程中,需要先扣减商品的库存,然后创建订单,最后扣减用户的余额。这是一个典型的分布式事务,需要保证所有的操作都成功或者都失败。

在这种情况下,我们可以使用Seata来管理分布式事务。首先,我们在业务方法上添加@GlobalTransactional注解,开启全局事务:

@Service
public class OrderService {@GlobalTransactionalpublic void createOrder() {// 扣减库存// 创建订单// 扣减余额}
}

然后,我们在每个微服务中使用Seata进行分支事务管理,保证每个操作的一致性:

@Service
public class StockService {@Transactionalpublic void reduceStock() {// 扣减库存}
}

5.2 在金融系统中使用Seata进行分布式事务管理

在金融系统中,常见的业务场景包括转账、提现、充值等,这些操作涉及到账户、交易、审计等多个服务,必须保证数据的一致性。

例如,用户进行转账操作时,需要先扣减转出账户的余额,然后增加转入账户的余额,最后记录交易记录。这是一个典型的分布式事务,需要保证所有的操作都成功或者都失败。

在这种情况下,我们也可以使用Seata来管理分布式事务。同样地,我们在业务方法上添加@GlobalTransactional注解,开启全局事务,然后在每个微服务中使用Seata进行分支事务管理。

5.3 在物流系统中使用Seata进行分布式事务管理

在物流系统中,常见的业务场景包括派单、签收、退货等,这些操作涉及到订单、配送、库存等多个服务,必须保证数据的一致性。

例如,用户下单购买商品时,需要先扣减商品的库存,然后创建订单,最后派发配送单。这是一个典型的分布式事务,需要保证所有的操作都成功或者都失败。

在这种情况下,我们还是可以使用Seata来管理分布式事务。首先,我们在业务方法

上添加@GlobalTransactional注解,开启全局事务,然后在每个微服务中使用Seata进行分支事务管理。

6. Seata与其他分布式事务解决方案的对比

为了更好地理解Seata的特性和优势,下面我们将Seata与其他几种常见的分布式事务解决方案进行对比,包括Saga、TCC和XA。

6.1 Seata vs Saga

Saga是一种长活动模式,它把一个长期运行的事务(也称为Saga)分解成一系列较短的事务,这些较短的事务可以分布在多个服务中。Saga模式的特点是它没有全局锁,但需要每个服务实现补偿操作,用于在某个事务失败时回滚已完成的事务。

Seata和Saga的主要区别在于,Seata采用的是AT模式(Automatic TCC),在全局事务提交时,由TC自动驱动RM完成本地事务的最终一致性,而不需要用户编写额外的补偿操作。而Saga模式需要用户为每个服务实现补偿操作,使得业务逻辑复杂度增大。

6.2 Seata vs TCC

TCC(Try-Confirm-Cancel)是一种两阶段提交的分布式事务解决方案,它要求每个参与者实现Try、Confirm和Cancel三个操作,其中Try操作用于预留资源,Confirm操作用于确认执行,Cancel操作用于取消执行。

Seata和TCC的主要区别在于,Seata的AT模式自动处理了分支事务的一致性问题,用户只需要关注业务逻辑,不需要编写Try、Confirm和Cancel操作。而TCC模式需要用户为每个服务实现Try、Confirm和Cancel操作,使得业务逻辑复杂度增大。

6.3 Seata vs XA

XA是一种两阶段提交的分布式事务解决方案,它定义了全局事务管理器(TM)和资源管理器(RM)的接口,使得多个RM可以参与到一个全局事务中。

Seata和XA的主要区别在于,Seata提供了更强大的功能和更好的性能。首先,Seata的AT模式自动处理了分支事务的一致性问题,而XA需要每个RM都支持两阶段提交协议。其次,Seata支持全局锁和并发控制,而XA不支持。最后,Seata的性能优于XA,因为XA需要每个RM都支持两阶段提交协议,而Seata的AT模式只需要一个简单的数据库连接。

总结

通过使用Seata,我们可以选择适当的分布式事务模式,并通过全局事务管理器、分支事务管理器和事务协调器等组件来管理和协调事务的执行。Seata的使用可以显著简化分布式事务的开发和管理,提高系统的可靠性和性能。希望本文对大家有所帮助

相关文章:

深入理解与实践Seata:分布式事务解决方案

✅作者简介&#xff1a;热爱Java后端开发的一名学习者&#xff0c;大家可以跟我一起讨论各种问题喔。 &#x1f34e;个人主页&#xff1a;Hhzzy99 &#x1f34a;个人信条&#xff1a;坚持就是胜利&#xff01; &#x1f49e;当前专栏&#xff1a;微服务 &#x1f96d;本文内容&…...

Python学习笔记 - 探索元组Tuple的使用

欢迎各位&#xff0c;我是Mr数据杨&#xff0c;你们的Python导游。今天&#xff0c;我要为大家讲解一段特殊的旅程&#xff0c;它与《三国演义》有关&#xff0c;而我们的主角是元组&#xff08;tuple&#xff09;。 让我们想象这样一个场景&#xff0c;三国演义中的诸葛亮&am…...

JAVA网络编程(一)

一、什么是网络编程 定义&#xff1a;在网络通信协议下&#xff0c;不同计算机上运行的程序&#xff0c;进行的数据传输。 应用场景&#xff1a;即时通信&#xff0c;网游&#xff0c;邮件等 不管什么场景&#xff0c;都是计算机与计算机之间通过网络在进行数据传输 java提供一…...

Python 线程队列

文章目录 Python 中的线程在 Python 中使用队列限制线程 本篇文章将介绍限制 Python 中的活动线程数。 Python 中的线程 Python 中的线程允许多个执行线程在单个进程中同时运行。 每个线程独立于其他线程运行&#xff0c;允许并发执行并提高性能。 线程对于执行受 I/O 限制或…...

创建web后端程序(servlet程序搭建)

目录 一、Servlet概述 二、创建servlet程序 1.创建类继承HttpServlet 2.重写HttpServlet类中 service、destroy、init方法 3.重新启动服务器 一、Servlet概述 Server Applet的简称&#xff0c;用Java编写的服务器端的程序。它运行在web服务器中&#xff0c;web服务器负责…...

【章节1】git commit规范 + husky + lint-staged实现commit的时候格式化代码

创建项目我们不多说&#xff0c;可以选择默认的&#xff0c;也可以用你们现有的项目。注意章节1和章节2请一起看&#xff01; 章节1: commit规范 husky lint-staged格式化代码 章节2: husky 检测是否有未解决的冲突 预检查debugger 自动检查是否符合commit规范 前言&#x…...

【入门】拐角III

【入门】拐角III Description 输入整数N&#xff0c;输出相应方阵。 Input 一个整数N。&#xff08; 0 < n < 10 ) Output 一个方阵&#xff0c;每个数字的场宽为3。 Sample Input 1 5 Sample Output 1 5 5 5 5 55 4 4 4 45 4 3 3 35 4 3 2 25 4…...

如何使用 Fail2ban 防止对 Linux 的暴力攻击?

在当今数字化世界中&#xff0c;网络安全成为了一个极其重要的话题。Linux 作为一种广泛使用的操作系统&#xff0c;也面临着各种网络攻击的风险&#xff0c;包括暴力攻击、密码破解和恶意登录等。为了保护 Linux 系统的安全&#xff0c;我们可以使用 Fail2ban 这样的工具来防止…...

2023年,真的别裸辞....

作为IT行业的大热岗位——软件测试&#xff0c;只要你付出了&#xff0c;就会有回报。说它作为IT热门岗位之一是完全不虚的。可能很多人回说软件测试是吃青春饭的&#xff0c;但放眼望去&#xff0c;哪个工作不是这样的呢&#xff1f;会有哪家公司愿意养一些闲人呢&#xff1f;…...

规则引擎架构-基于easy-rules

目录 概念理解实例和编码抽象出2条规则简单的规则引擎事实1的处理事实2的处理 easy-rules 规则的抽象和执行事实描述规则的抽象默认的规则 动态代理执行规则和动作规则的执行&#xff1a;org.jeasy.rules.core.DefaultRulesEngine#doFirepublic class RuleProxy implements Inv…...

【数据结构】第七周

目录 稀疏矩阵快速转置 三元组的矩阵加法 九宫格数独游戏 数组主元素 螺旋数字矩阵 蛇形矩阵 数组循环右移K位 稀疏矩阵快速转置 【问题描述】 稀疏矩阵的存储不宜用二维数组存储每个元素&#xff0c;那样的话会浪费很多的存储空间。所以可以使用一个一维数组存…...

人体三维重构论文集合:awesome 3d human reconstruction

A curated list of related resources for 3d human reconstruction. Your contributions are welcome! Contents papers AIGCnerf or pifugeo fusionphoto3D human whole body3D human...

揭秘Redis持久化原理,探索fork与Copy-on-Write的魔法!

大家好&#xff0c;我是小米&#xff0c;今天我将和大家一起探索Redis持久化原理中的两个关键概念&#xff1a;fork和Copy-on-Write。这两个概念对于理解Redis的数据持久化机制至关重要。让我们一起来揭开这些技术的神秘面纱吧&#xff01; Redis持久化简介 在开始之前&#…...

应届生如何提高职场竞争能力

摘要&#xff1a; 应届生面对竞争激烈的职场&#xff0c;需要不断提高自身的职业素养和竞争能力&#xff0c;才能在激烈的竞争中脱颖而出。本文从积极心态的培养、专业知识的优化、职业规划的制定、团队协作的加强和自我拓展的开展五个方面&#xff0c;提出了提高应届生职场竞争…...

ISIS 实验

(1)拓扑图 2&#xff09;需求&#xff1a; -实现PC1和PC2的通信 3&#xff09;配置步骤&#xff1a; -配置接口IP地址 -开启ISIS---类似于在OSPF中创建进程 -配置NET地址---类似于在OSPF中创建区域&#xff0c;指定Router-id -在接口上启用ISIS--类似于在OSPFv2中用ne…...

国产系统:麒麟之人大金仓数据库部署

一、基本信息和资源 1.1 查看服务器信息 [root7PGxjKPL4 ~]# cat /etc/*release Kylin Linux Advanced Server release V10 (Sword) DISTRIB_IDKylin DISTRIB_RELEASEV10 DISTRIB_CODENAMEjuniper DISTRIB_DESCRIPTION"Kylin V10" DISTRIB_KYLIN_RELEASEV10 DISTRI…...

flink1.17.0 集成kafka,并且计算

前言 flink是实时计算的重要集成组件&#xff0c;这里演示如何集成&#xff0c;并且使用一个小例子。例子是kafka输入消息&#xff0c;用逗号隔开&#xff0c;统计每个相同单词出现的次数&#xff0c;这么一个功能。 一、kafka环境准备 1.1 启动kafka 这里我使用的kafka版本…...

【华为OD机试】数组组成的最小数字【2023 B卷|100分】

【华为OD机试】-真题 !!点这里!! 【华为OD机试】真题考点分类 !!点这里 !! 题目描述: 给定一个整型数组,请从该数组中选择3个元素组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述: 一行用半角逗号分割的字符串记录的整型数…...

Exponential Loss 中的关于indicator 函数的一个恒等式

− x y 2 I ( x ≠ y ) − 1 -xy2\mathbf{ I}(x \ne y)-1 −xy2I(xy)−1 其中 I \mathbf{ I} I 是 indicator 函数&#xff0c; 定义域 为True &#xff0c;函数值为 1 反之为 0 x,y 都 可以取值 {-1,1} 证明过程见下表&#xff1a; xy左式右式-1-1-1-111-1-1-11111-111...

【机器学习】浅析过拟合

过度拟合 我们来想象如下一个场景&#xff1a;我们准备了10000张西瓜的照片让算法训练识别西瓜图像&#xff0c;但是这 10000张西瓜的图片都是有瓜梗的&#xff0c;算法在拟合西瓜的特征的时候&#xff0c;将西瓜带瓜梗当作了一个一般性的特征。此时出现一张没有瓜梗的西瓜照片…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#xff0c;生成对顶尖科学家都有用的…...

Rapidio门铃消息FIFO溢出机制

关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系&#xff0c;以下是深入解析&#xff1a; 门铃FIFO溢出的本质 在RapidIO系统中&#xff0c;门铃消息FIFO是硬件控制器内部的缓冲区&#xff0c;用于临时存储接收到的门铃消息&#xff08;Doorbell Message&#xff09;。…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

深入理解Optional:处理空指针异常

1. 使用Optional处理可能为空的集合 在Java开发中&#xff0c;集合判空是一个常见但容易出错的场景。传统方式虽然可行&#xff0c;但存在一些潜在问题&#xff1a; // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...

nnUNet V2修改网络——暴力替换网络为UNet++

更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...

Docker拉取MySQL后数据库连接失败的解决方案

在使用Docker部署MySQL时&#xff0c;拉取并启动容器后&#xff0c;有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致&#xff0c;包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因&#xff0c;并提供解决方案。 一、确认MySQL容器的运行状态 …...

Python训练营-Day26-函数专题1:函数定义与参数

题目1&#xff1a;计算圆的面积 任务&#xff1a; 编写一个名为 calculate_circle_area 的函数&#xff0c;该函数接收圆的半径 radius 作为参数&#xff0c;并返回圆的面积。圆的面积 π * radius (可以使用 math.pi 作为 π 的值)要求&#xff1a;函数接收一个位置参数 radi…...

【大模型】RankRAG:基于大模型的上下文排序与检索增强生成的统一框架

文章目录 A 论文出处B 背景B.1 背景介绍B.2 问题提出B.3 创新点 C 模型结构C.1 指令微调阶段C.2 排名与生成的总和指令微调阶段C.3 RankRAG推理&#xff1a;检索-重排-生成 D 实验设计E 个人总结 A 论文出处 论文题目&#xff1a;RankRAG&#xff1a;Unifying Context Ranking…...