Spring Cloud Alibaba 实战(八) - 审核业务的分布式事务处理实现
本文主要讲解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)
- 参考文档
https://docs.spring.io/spring/docs5.1. RELEASE/spring-framework-reference/web-reactive.html#webflux-client
◆ MQ
我们采用此法
2 引入MQ后的架构演进
3 MQ适用场景
- 异步处理
- 流量削峰填谷
- 解耦微服务
4 MQ的选择
流行的MQ那么多,如何选择?
- Kafka、RabbitMQ、 RocketMQ、 ActiveMQ...
5 搭建RocketMQ
- 下载与安装
RocketMQ实战(一) - 简介
6 搭建RocketMQ控制台
- 修改pom.xml版本
- 修改代码
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 实现分布式事务流程
业务流程图
- 半消息,虽然被存储到MQserver,但会被标记为暂时不能投递,所以消费者不会接受到该消息
- 半消息发送成功,开始3
- 开始执行本地事务
-
生产者根据本地事务,发送二次确认请求
MQServer如果从4中接收到的是- commit,就把消息置为可投递,这样消费者就可消费该消息了
- rollback:将该消息删除
- MQServer未收到4中的二次确认消息,就会回查
- 生产者检查本地事务的执行结果
- 根据本地事务执行结果,发送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参数即对应
- 回查本地事务执行结果,即通过查询日志记录表,该表在执行完本地事务后更新
- 这即可回查啦
参考
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
阿里云自然语言处理 .NET 使用示例
概述 阿里云自然语言处理(Natural Language Processing)是为各类企业及开发者提供的用于文本分析及挖掘的核心工具,旨在帮助用户高效的处理文本,已经广泛应用在电商、文化娱乐、金融、物流等行业客户的多项业务中,取得了良好的效果。这里主要针对目前官方文档中参考Demo使用SDK较老且本身中文打印输出异常的问题,提供包括SDK安装步骤+正常可用示例.NET Demo。 操作步骤 1、Nuget 安装aliyun-net-sdk-core Install-Package aliyun-net-sdk-core -Version 1.5.3 2、测试Demo using Aliyun.Acs.Core; using Aliyun.Acs.Core.Http; using Aliyun.Acs.Core.Profile; using System; namespace NLPDemo { class Program { static void Main(string[] args) { // ak,sk 获取参考链接:https://yq.aliyun.com/article...
- 下一篇
Hyperledger Fabric C#链码开发指南
本教程介绍如何使用.NET Core开发一个简单的Hyperledger Fabric链码,用于进行基本的资产管理和转账操作。如果你是一个熟练的.NET/C#开发人员,由于种种原因需要使用Hyperledger Fabric作为区块链平台,那么除了转身投入Java/Node.js/Go的怀抱之外,这也提供了另外一种选择。 相关教程推荐: .NET / C# 以太坊开发详解 .NET / C# 比特币开发详解 1、Fabric链码.NET Core开发包 首先创建一个.NET Core项目,在命令行执行如下命令添加对Fabric链码.NET Core开发包的依赖: dotnet add package Thinktecture.HyperledgerFabric.Chaincode \ --version 1.0.0-prerelease.74 Thinktecture.HyperledgerFabric.Chaincode链码开发包提供了两种不同的方法来开发Hyperledger Fabric链码。 使用底层API:通过实现IChaincode接口来开发超级账本Fabric链码是一种比...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS8编译安装MySQL8.0.19
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2全家桶,快速入门学习开发网站教程