事务流程如何实现 java_Spring Cloud Alibaba 实战(八) - 审核业务的分布式事务处理实现...

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

1 审核业务的实现

1533ca59ebdafc9ce9839e1af814aaba.png

7747771dc44c5904eff76d12b11e5b55.png

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

08510dc51e67cc1e587ff6d97d24302e.png

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

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后的架构演进

c141d159ccb053f0e32a40b8d6d185a2.png

3 MQ适用场景

异步处理

流量削峰填谷

解耦微服务

4 MQ的选择

流行的MQ那么多,如何选择?

Kafka、RabbitMQ、 RocketMQ、 ActiveMQ...

b4a3a73fdf58f0336958b87e248ac7e7.png

737054155a38369c82f1bd97d1639172.png

5 搭建RocketMQ

6 搭建RocketMQ控制台

14e180da690a189dfe8b282abae9b3c5.png

修改pom.xml版本

d19591095e0c2f1050a8ffcf57825d19.png

修改代码

60e7dd42525de867e544f601cc07eb1a.png

6c53e23128d1925be5a2be197f0274c8.png

7 Spring消息编程模型

推荐Maven依赖版本分析插件

6a83af57180d2c8740876249815ebf55.png

7.1 编写生产者

content-center

开始拿出三板斧:

引入依赖

324f49ceaec5ae19094e6eb3d45aa3a1.png

添加注解 无

写配置

9f3d5798725d65fcbd0fa7df46b6e94d.png

服务类添加模板类

c4b76590610387fcd1bb13eb9b781387.png

12fcc1fd2a783f66f503f4eb69e61d5d.png

7.2 编写消费者

user-center

依赖

ba47ef2f2dc2bd233f406a56c3fc5dfc.png

配置

a35720d9de433de59c56fb8a0eda5fe3.png

com.javaedge.contentcenter.rocketmq.AddBonusTransactionListener

749db71f503a319a3b7de51c864d711d.png

小结

RocketMQ : RocketMQMessageListener

ActiveMQ/Artemis : JmsListener

RabbitMQ : RabbitListener

Kafka : KafkaListener

8 分布式事务

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

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

8.1 实现分布式事务流程

ad98d36fc14a593fba07c9091339e0ef.png

业务流程图

2e693053f0e713f2c3b61db17560e6f4.png

半消息,虽然被存储到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 事务消息三状态

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

9 分布式事务 - 编码实现

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

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

9.1/2 发半消息

68bf642816b3cf47d128e182a4c6ed30.png

改造接口

将原先如下代码删除

a27ecfef6f8e6db5ba9087fcf52fd396.png

改为如下接方法

999df0e0faa6c4e36217878f499d6013.png

9.3 执行本地事务

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

a6063f5efe29bec2ec819f0398c5b219.png

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

16e3611cbbe3c8ee1ec3a2b9ba9de88f.png

b4550af12de4356fdd57ec33254c8ea5.png

注意这里的

50b0754fb90d21ebb0f55c703116cc2b.png

msg参数即对应

99ecab02ad36afd45eae23c5e8d934f8.png

args参数即对应

f051ac0105d958779cf8f10463103484.png

回查本地事务执行结果,即通过查询日志记录表,该表在执行完本地事务后更新

96e596a9db4b7895ecb2d7eda1897c34.png

这即可回查啦

9114fe4fb8a86ca78afd8169f12519d5.png

参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值