Spring Cloud Alibaba 实战(八) - 审核业务的分布式事务处理实现

简介: Github本文主要讲解RabbitMQ的介绍和安装,Spring Cloud Stream核心概念,Spring Cloud Alibaba RocketMQ学习,异步消息推送与消费1 审核业务的实现com/javaedge/contentcenter/service/content/ShareService.

Github

本文主要讲解RabbitMQ的介绍和安装,Spring Cloud Stream核心概念,Spring Cloud Alibaba RocketMQ学习,异步消息推送与消费

1 审核业务的实现

  • com/javaedge/contentcenter/service/content/ShareService.java

假设添加积分操作很耗时,我们的主要操作是审核,而不关心积分,所以可以将其异步化

1.1 Spring实现异步的方法

◆ AsyncRestTemplate

  • 参考文档
    Spring 的异步HTTP请求AsyncRestTemplate

◆ @ Async注解

◆ WebClient ( Spring 5.0引入 ,为取代AsyncRestTemplate)

◆ MQ
我们采用此法

2 引入MQ后的架构演进

3 MQ适用场景

  • 异步处理
  • 流量削峰填谷
  • 解耦微服务

    4 MQ的选择

    流行的MQ那么多,如何选择?
  • Kafka、RabbitMQ、 RocketMQ、 ActiveMQ...


5 搭建RocketMQ

7 Spring消息编程模型

  • 推荐Maven依赖版本分析插件

7.1 编写生产者

content-center

开始拿出三板斧:

  • 引入依赖
  • 添加注解
  • 写配置
  • 服务类添加模板类

7.2 编写消费者

user-center

  • 依赖
  • 配置
  • com.javaedge.contentcenter.rocketmq.AddBonusTransactionListener

小结

  • RocketMQ : RocketMQMessageListener
  • ActiveMQ/Artemis : JmsListener
  • RabbitMQ : RabbitListener
  • Kafka : KafkaListener

    8 分布式事务

    流程剖析、概念术语、
    如何实现事务呢,我们知道Spring有事务注解,那么直接就添加@Transaction注解吧!

    可这样是万无一失了吗?显然不行,因为消息已经发出,没法撤回了
    那么看看RocketMQ是怎么解决分布式事务问题呢

    8.1 实现分布式事务流程

业务流程图

  1. 半消息,虽然被存储到MQserver,但会被标记为暂时不能投递,所以消费者不会接受到该消息
  2. 半消息发送成功,开始3
  3. 开始执行本地事务
  4. 生产者根据本地事务,发送二次确认请求
    MQServer如果从4中接收到的是
    • commit,就把消息置为可投递,这样消费者就可消费该消息了
    • rollback:将该消息删除
  5. MQServer未收到4中的二次确认消息,就会回查
  6. 生产者检查本地事务的执行结果
  7. 根据本地事务执行结果,发送commit/rollback消息

总体来说,就是生产者把消息发送到MQ,但MQ只是将其标记,不让消费者消费
然后生产者就执行本地事务,执行完后就知道到底是该投递还是丢弃该消息了!
这其实就是典型的二次确认
消费回查就是防止二次确认消息发送异常的容错处理

8.2 关键概念

◆ 半消息( Half(Prepare) Message )
暂时无法消费的消息。生产者将消息发送到了MQ server ,但这个消息会被标记为"暂不能投递"状态,先存储起来;消费者不会去消费这条消息。
并不是消息的状态,只是一种特殊的消息而已
◆ 消息回查(Message Status Check )
网络断开或生产者重启可能导致丢失事务消息的第二次确认。当MQ Server发现消息长时间处于半消息状态时,将向消息生产者发送请求,询问该消息的最终状态(提交或回滚)。

8.3 事务消息三状态


◆ Commit
提交事务消息,消费者可以消费此消息
◆ Rollback
回滚事务消息, broker会删除该消息,消费者不能消费.
◆UNKNOWN
broker需要回查确认该消息的状态

9 分布式事务 - 编码实现

  • 在内容中心新增事务日志表rocketmq_transaction_log

    对照上一小节流程图,开始code!

    9.1/2 发半消息

    改造接口

  • 将原先如下代码删除
  • 改为如下接方法

    9.3 执行本地事务

  • 新建rocketmq包,并在其中创建一个新类AddBonusTransactionListener

  • 一定要在该类上加@RocketMQTransactionListener注解
    其中的txProducerGroup一定要对应哦


注意这里的

  • msg参数即对应
  • args参数即对应
  • 回查本地事务执行结果,即通过查询日志记录表,该表在执行完本地事务后更新
  • 这即可回查啦

参考

目录
相关文章
|
20天前
|
存储 Java 文件存储
🗄️Spring Boot 3 整合 MinIO 实现分布式文件存储
本文介绍了如何基于Spring Boot 3和MinIO实现分布式文件存储。随着应用规模扩大,传统的单机文件存储方案难以应对大规模数据和高并发访问,分布式文件存储系统成为更好的选择。文章详细讲解了MinIO的安装、配置及与Spring Boot的整合步骤,包括Docker部署、MinIO控制台操作、Spring Boot项目中的依赖引入、配置类编写及工具类封装等内容。最后通过一个上传头像的接口示例展示了具体的开发和测试过程,强调了将API操作封装成通用工具类以提高代码复用性和可维护性的重要性。
141 7
🗄️Spring Boot 3 整合 MinIO 实现分布式文件存储
|
16天前
|
人工智能 自然语言处理 前端开发
Spring AI与DeepSeek实战二:打造企业级智能体
本文介绍如何基于Spring AI与DeepSeek模型构建企业级多语言翻译智能体。通过明确的Prompt设计,该智能体能自主执行复杂任务,如精准翻译32种ISO标准语言,并严格遵循输入格式和行为限制。代码示例展示了如何通过API实现动态Prompt生成和翻译功能,确保服务的安全性和可控性。项目已开源,提供更多细节和完整代码。 [GitHub](https://github.com/zlt2000/zlt-spring-ai-app) | [Gitee](https://gitee.com/zlt2000/zlt-spring-ai-app)
144 11
|
23天前
|
人工智能 Java API
Spring AI与DeepSeek实战一:快速打造智能对话应用
在 AI 技术蓬勃发展的今天,国产大模型DeepSeek凭借其低成本高性能的特点,成为企业智能化转型的热门选择。而Spring AI作为 Java 生态的 AI 集成框架,通过统一API、简化配置等特性,让开发者无需深入底层即可快速调用各类 AI 服务。本文将手把手教你通过spring-ai集成DeepSeek接口实现普通对话与流式对话功能,助力你的Java应用轻松接入 AI 能力!虽然通过Spring AI能够快速完成DeepSeek大模型与。
360 11
|
1月前
|
JavaScript 前端开发 Java
Jeesite5:Star24k,Spring Boot 3.3+Vue3实战开源项目,架构深度拆解!让企业级项目开发效率提升300%的秘密武器
Jeesite5 是一个基于 Spring Boot 3.3 和 Vue3 的企业级快速开发平台,集成了众多优秀开源项目,如 MyBatis Plus、Bootstrap、JQuery 等。它提供了模块化设计、权限管理、多数据库支持、代码生成器和国际化等功能,极大地提高了企业级项目的开发效率。Jeesite5 广泛应用于企业管理系统、电商平台、客户关系管理和知识管理等领域。通过其强大的功能和灵活性,Jeesite5 成为了企业级开发的首选框架之一。访问 [Gitee 页面](https://gitee.com/thinkgem/jeesite5) 获取更多信息。
Jeesite5:Star24k,Spring Boot 3.3+Vue3实战开源项目,架构深度拆解!让企业级项目开发效率提升300%的秘密武器
|
3月前
|
存储 JavaScript 开发工具
基于HarmonyOS 5.0(NEXT)与SpringCloud架构的跨平台应用开发与服务集成研究【实战】
本次的.HarmonyOS Next ,ArkTS语言,HarmonyOS的元服务和DevEco Studio 开发工具,为开发者提供了构建现代化、轻量化、高性能应用的便捷方式。这些技术和工具将帮助开发者更好地适应未来的智能设备和服务提供方式。
102 8
基于HarmonyOS 5.0(NEXT)与SpringCloud架构的跨平台应用开发与服务集成研究【实战】
|
4月前
|
存储 Java 关系型数据库
在Spring Boot中整合Seata框架实现分布式事务
可以在 Spring Boot 中成功整合 Seata 框架,实现分布式事务的管理和处理。在实际应用中,还需要根据具体的业务需求和技术架构进行进一步的优化和调整。同时,要注意处理各种可能出现的问题,以保障分布式事务的顺利执行。
269 53
|
2月前
|
Java 关系型数据库 数据库
微服务SpringCloud分布式事务之Seata
SpringCloud+SpringCloudAlibaba的Seata实现分布式事务,步骤超详细,附带视频教程
158 1
|
3月前
|
存储 NoSQL Java
使用lock4j-redis-template-spring-boot-starter实现redis分布式锁
通过使用 `lock4j-redis-template-spring-boot-starter`,我们可以轻松实现 Redis 分布式锁,从而解决分布式系统中多个实例并发访问共享资源的问题。合理配置和使用分布式锁,可以有效提高系统的稳定性和数据的一致性。希望本文对你在实际项目中使用 Redis 分布式锁有所帮助。
290 5
|
3月前
|
消息中间件 监控 Java
如何将Spring Boot + RabbitMQ应用程序部署到Pivotal Cloud Foundry (PCF)
如何将Spring Boot + RabbitMQ应用程序部署到Pivotal Cloud Foundry (PCF)
61 6
|
3月前
|
Java 关系型数据库 MySQL
如何将Spring Boot + MySQL应用程序部署到Pivotal Cloud Foundry (PCF)
如何将Spring Boot + MySQL应用程序部署到Pivotal Cloud Foundry (PCF)
94 5

热门文章

最新文章