Spring Cloud part30—Seata的各种分布式事务类型的实现
Seata
什么是Seata
Seata , 官网 , github , 2.6多星
Seata
是一款开源的分布式事务解决方案,致力于在微服务架构下,提供高性能和简单易用的分布式事务服务。Seata
将为用户提供了 AT、TCC、SAGA 和 XA
事务模式,为用户打造一站式的分布式解决方案
在单体应用中,我们可以通过数据库的本地事务(如 MySQL 的
ACID)保证数据一致性,但微服务架构下,一个业务流程可能涉及多个服务(例如电商下单流程涉及订单服务、库存服务、支付服务),每个服务拥有独立的数据库,本地事务无法跨服务生效,此时就需要分布式事务框架协调各服务的事务,确保所有操作要么全部成功,要么全部回滚。
在 Seata 开源之前,Seata
对应的内部版本在阿里经济体内部一直扮演着分布式一致性中间件的角色,帮助经济体平稳的度过历年的双11,对各BU业务进行了有力的支撑。商业化产品GTS
先后在阿里云、金融云进行售卖
Seata 的三大模块
Seata 架构由 Transaction...
Spring Cloud part29—分布式事务中柔性事务的解决方案之补偿型事务
TCC补偿型
什么是TCC补偿型事务
基于消息实现的事务并不能解决所有的业务场景,例如以下场景:某笔订单完成时,同时扣掉用户的现金。
TCC 是 Try-Confirm-Cancel
的缩写,属于补偿型柔性事务的一种。它通过
“预留资源(Try)→...
Spring Cloud part28—分布式事务中柔性事务的解决方案之通知型事务
柔性事务
柔性事务的分类
在电商领域等高并发的互联网场景下,刚性事务在数据库性能和处理能力上都暴露出了瓶颈。
柔性事务有两个特性:基本可用和柔性状态。
基本可用是指分布式系统出现故障的时候允许损失一部分的可用性。
柔性状态是指允许系统存在中间状态,这个中间状态不会影响系统整体的可用性,比如数据库读写分离的主从同步延迟等。柔性事务的一致性指的是最终一致性。
柔性事务主要分为补偿型和通知型,其中,补偿型事务都是同步的,通知型事务都是异步的。
补偿型事务通过 “正向执行 + 逆向补偿”
的机制保证最终一致性,属于同步事务(执行过程中需要等待各环节完成),典型子类型有
TCC 和 Saga。
补偿型事务又分:TCC、Saga;
通知型事务通过异步消息传递保证最终一致性,属于异步事务(执行过程中无需同步等待,通过消息队列或重试机制完成),典型子类型有
MQ 事务消息和最大努力通知型。
通知型事务分:MQ事务消息、最大努力通知型。
补偿型事务
补偿型号事务的设计理念以 “正向执行 +...
Spring Cloud part27—分布式事务中刚性事务的解决方案
刚性事务:XA模型、XA接口规范、XA实现
XA模型或者 X/Open DTP模型
X/OPEN是一个组织.X/Open国际联盟有限公司是一个欧洲基金会,它的建立是为了向UNIX环境提供标准。它主要的目标是促进对UNIX语言、接口、网络和应用的开放式系统协议的制定。它还促进在不同的UNIX环境之间的应用程序的互操作性,以及支持对电气电子工程师协会(IEEE)对UNIX的可移植操作系统接口(POSIX)规范。
X/Open DTP(Distributed Transaction Process)
是一个分布式事务模型。这个模型主要使用了两段提交(2PC -
Two-Phase-Commit)来保证分布式事务的完整性。
在X/Open DTP(Distributed Transaction Process)
模型里面,有三个角色:
AP:
Application,应用程序。也就是业务层。哪些操作属于一个事务,就是AP定义的。
TM:...
SpringCloudpart25—在微服务项目中实际使用Kafka的额外内容
之前项目中没有提到的一些额外的内容
为Kafka配置事务消息
Kafka事务允许生产者将多条消息作为一个原子操作发送,要么全部成功,要么全部失败。这确保了数据的一致性。
默认情况下,Spring-kafka自动生成的KafkaTemplate实例,是不具有事务消息发送能力的。需要使用如下配置激活事务特性。事务激活后,所有的消息发送只能在发生事务的方法内执行了,不然就会抛一个没有事务交易的异常
1spring.kafka.producer.transaction-id-prefix=kafka_tx.
事务有一个 Exactly-Once语义,即使重试,消息也只会被处理一次
添加事务的配置
在配置文件中添加事务的配置
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869spring: application: name: kafka-message ...
Spring Cloud part24—在微服务项目中实际使用Kafka的基本内容
微服务项目内如何集成 Kafka
和其他组件要考虑的事情一样,还是涉及到在哪用,用给谁,如何配置的这三个问题
在 Spring Cloud 微服务项目中集成
Kafka,主要涉及生产者(发送消息)和消费者(接收消息)的实现,以及与
Spring Cloud 生态的适配(如服务发现、配置中心等)
Spring创建了一个项目Spring-kafka,封装了Apache
的Kafka-client,用于在Spring项目里快速集成kafka。
依赖如下
1234567891011<!-- Spring Kafka核心依赖 --><dependency> <groupId>org.springframework.kafka</groupId> <artifactId>spring-kafka</artifactId></dependency><!-- 可选:Spring Cloud Stream(如需通过Stream简化集成)...
Spring Cloud part23—详解Kafka的基本工作原理
Kafka 的基本工作原理
Kafka 的基本架构
Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据,具有高性能、持久化、多副本备份、横向扩展能力,这离不开其架构设计
image-20251030204219667
消息队列的本质就是生产者将消息发布,然后消费者消费其中的消息。
Kafka也一样,生产者将消息发布到主题,然后消费者订阅主题并消费其中的消息。
如下图
image-20251026202552841
生产者将数据生产出来,交给 broker
进行存储,然后消费者需要消费数据了,就从broker中去拿出数据来,然后完成一系列对数据的处理操作,这个过程展开说明就是下面图片,体现了
Kafka 在分布式和高并发上的特点
image-20251026202618360
其中有这么一个细节,就是 producer 产生了数据,就会自动的 push 到
broker 中,但是消费者 consumer 拉取就是主动的去使用 pull 拉取
多个 broker...
Spring Cloud part22—了解Kafka和在你的系统上部署kafka
了解Kafka
什么是Kafka
Kafka 是一款高吞吐量的分布式消息队列
Apache
Kafka是分布式发布-订阅消息系统,Kafka最初由LinkedIn公司开发,Linkedin于2010年贡献给了Apache基金会并成为顶级开源项目。
初衷是解决 “大规模实时数据传输与存储” 问题,因此它的设计更偏向
“高吞吐、可持久化、分布式”
的日志系统,而消息队列只是其核心功能之一。
kafka每秒可以处理几十万条消息,它的延迟最低只有几毫秒。而且kafka集群支持热扩展,同时支持数千个客户端同时读,拥有很好的高并发。
简单说:RabbitMQ 更像 “快递中转站”(强调消息路由、即时投递),而
Kafka 更像 “大型仓库”(强调批量存储、高效读写)。
所以开发中,Kafka多使用在
日志收集:多服务的日志实时写入
Kafka,下游消费端(如 ELK)统一处理分析;
实时数据管道:数据库变更数据(CDC)通过 Kafka
同步到数据仓库、缓存或其他系统;
实时计算:作为 Flink/Spark...
Redis part5—RDB持久化和AOF持久化
Redis 持久化
Redis 本身是缓存,为什么它的持久化会被如此重视呢?
如何确保内存中的数据不因突发事件而丢失?如何在确保性能的前提下,为数据提供一个更加稳固的避风港?这是否矛盾
现在的情况差不多是这样,Redis
早期是纯缓存,但随着功能迭代,很多场景下它被当作内存数据库使用(如存储用户会话、购物车、实时排行榜)。此时持久化的价值体现在两点:
本质是因为它早已超越纯缓存,承担了数据库的职能,数据丢失会直接影响业务
Redis 提供三种持久化的方式: 分别是 RDB(Redis
Database Snapshot) 和 AOF(Append Only...
Redis part4—Redis布隆过滤器
什么是布隆过滤器
布隆过滤器简介
首先,布隆过滤器不是 redis
特有的东西,它是一种通用的数据结构,日常开发中,Redis 4.0
的时候官方提供了插件机制,布隆过滤器正式登场,使用
redisbloom 插件版本,但是 8.0.0 中 redis
正式添加了布隆过滤器。
布隆过滤器 (Bloom Filter)是由 Burton Howard Bloom 于 1970
年提出,它是一种 space efficient
的概率型数据结构,用于判断一个元素是否在集合中。
当布隆过滤器说,某个数据存在时,这个数据可能不存在;当布隆过滤器说,某个数据不存在时,那么这个数据一定不存在。
布隆过滤器(Bloom
Filter)是一种空间效率极高的概率型数据结构,本质是
“一个二进制数组 +...
Spring Boot part21-SpringBoot整合OpenAPI生成接口文档
了解OpenApi
首先说明,它是一个规范,我们在项目中常用的实现是 swagger 和
knife4j
OpenAPI 3.0.0 是 OpenAPI 规范的第一个正式版本,因为它是由 SmartBear
Software 捐赠给 OpenAPI Initiative,并在2015年从 Swagger 规范重命名为
OpenAPI 规范。
OpenAPI 规范(OAS),是定义一个标准的、与具体编程语言无关的 RESTful
API 的规范。OpenAPI
规范使得人类和计算机都能在“不接触任何程序源代码和文档、不监控网络通信”的情况下理解一个服务的作用。如果您在定义您的
API 时做的很好,那么使用 API 的人就能非常轻松地理解您提供的 API
并与之交互了。
如果您遵循 OpenAPI 规范来定义您的
API,那么您就可以用文档生成工具来展示您的
API,用代码生成工具来自动生成各种编程语言的服务器端和客户端的代码,用自动测试工具进行测试等等。
OpenAPI 本质上是一套用于描述 RESTful...
MongoDB part4—在Spring项目中使用MongoDB
在Spring项目中如何使用MongoDB
在Spring项目遇到什么需求需要用到MongoDB
首先,MongoDB 是 NoSQL,其次,它是文档型数据库,它拥有灵活
schema、高写入性能、适合非结构化 / 半结构化数据、水平扩展友好
一般在这样的情况下,我们考虑 MongoDB
存储非结构化 / 半结构化数据
所以说,当数据结构灵活多变(如用户行为日志、商品属性(不同商品字段差异大)、JSON
格式的 API
响应缓存等),传统关系型数据库的固定表结构会导致频繁的表结构变更,而
MongoDB 的文档模型(BSON
格式,支持嵌套结构)可直接存储动态字段,无需预先定义...
















