Spring Cloud Alibaba 实战(八) - 审核业务的分布式事务处理实现-阿里云开发者社区

开发者社区> javaedge> 正文

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

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 实现分布式事务流程

业务流程图

  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参数即对应
  • 回查本地事务执行结果,即通过查询日志记录表,该表在执行完本地事务后更新
  • 这即可回查啦

参考

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
史上最快! 10小时大数据入门实战(三)-分布式文件系统HDFS
HDFS 环境搭建 HDFS 伪分布式环境搭建 CentOS 环境安装步骤 MacOS安装环境 安装jd...
1313 0
【云吞铺子】业务系统性能压测最佳实践(二)--业务压测注意事项
云吞铺子--双11最佳技术实践系列# 本期继续为大家带来阿里云在本次双11实战中沉淀的前沿经验和满满干货!由阿里云技术高手霄翎为您深度阐述云上业务压测全流程注意事项!大牛出品,必属精品!
8929 0
一个内存增长问题的分析和处理(二)——valgrind工具的用法
valgrind是linux下对C++和C程序进行内存泄露检测的工具,除了内存检测,valgrind还提供了很多其他的功能,这里主要介绍下valgrind的内存检测的功能。   首先是文件的下载,valgrind的官方网址是http://valgrind.org/,最新版本的valgrind是3.9,下载地址如下:http://valgrind.org/downloads/。
875 0
Rainbond 部署SpringCloud微服务架构业务实践
SpringCloud架构作为目前业界使用最广的微服务架构模式,其后期运维交付问题较多。如何使用Rainbond来解决SpringCloud微服务架构在交付运维阶段的难题,本文将以实践的方式来阐述。
1320 0
《阿里巴巴Java Spring Boot 2.0开发实战课程》05课:三层MVC网站与架构分层误区、Java面试题
本期分享主题:三层架构MVC网站与分层架构误区、Java面试题,国内系统架构设计的文章和书籍。经常会搞错分层的概念,本课程进行了讲解。还有关于model概念的解析,以及Java Spring Boot2.0面试题。 另外java是免费的!
3153 0
+关注
588
文章
1
问答
来源圈子
更多
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载