springboot-rocketmq 顺序消息和事务消息实践

桃花潭水深千尺,不及汪伦送我情。

1 前言

在日常的开发中,mq 在分布式系统中的应用十分广泛,在复杂的业务中 mq 起到异步处理和系统解耦的作用。在本文中将结合自己的实践使用 rocketmq 经验来进行分享, 主要介绍顺序消息和事务消息的处理。

2 rocketmq 配置

springboot 中使用 rocketmq 需要先引入依赖,具体如下所示:

xml 复制代码
<dependency>
   <groupId>org.apache.rocketmq</groupId>
   <artifactId>rocketmq-spring-boot-starter</artifactId>
   <version>2.2.2</version>
</dependency>

对于 rocketmq 的配置如下所示,根据业务需要可以修改消费者和生产者配置,其中大多数可以采用默认项,采用约定大于配置的原则。

3 rocketmq 消息

如下图所示,即消息生产者发送消息的配置,和配置项相同,主要是在 client 模式下使用。生产者一般都是以生产者组的方式呈现,创建完成生产者后,可以发送各种类型的消息。

复制代码
1  从发送方式来看,可以分为异步发送、同步发送、单向发送。
2  从发送顺序来分,可以分为全局有序和分区有序消息。
3  从时效性来说也有延迟消息,延迟消息的等级可以根据业务需要进行设置。
4  从消息发送的数量可以有单条消息和批量消息。
5  最后还有事务消息,可以协助解决分布式事务问题,保证业务处理和消息发送同时成功。

消息的消费配置如下所示,从消费方式上将可以有集群消息和广播消息,前者可以将消息按照一定算法分配给消费者,同一个消息只能被一个消费者消费。广播消息是同一条消息能被所有的消费者消息,通常用于配置的更新。

消费者通过 MessageListener 来消费消息,其中包括 MessageListenerConcurrentlyMessageListenerOrderly 两种类型,分别表示并发消费消息和顺序消费消息(一个队列一个线程)。

4 rocketmq 顺序消息

以上已经介绍了 rocketmq 消息发送和消费的方式, 在 springboot 中使用相对简单,可以使用 RocketMQTemplate 处理消息的发送。在发送顺序消息时,需要指定消息发送的 hashKey , 这样可以保证相同业务的数据发送到同一个 broker 的同一个 queue 中,只有通过这样的方式,才能保证消息发送的顺序性。此外在消息消费时,需要使用集群模式进行消费。

bash 复制代码
# 单向发送顺序消息 同步顺序消息 异步顺序消息
sendOneWayOrderly
syncSendOrderly
asyncSendOrderly

如上图所示,发送顺序消息时,可以指定 MessageQueueSelector,根据其 hashkey 计算其轮询算法,发送顺序消息。在消费顺序消息时,需要如右侧配置,可以进行顺序消费。

5 rocketmq 事务消息

在发送事务消息时,需要组装发送的消息,执行事务消息时,需要指定 sendMessageInTransaction 方法进行发送消息,在消息发送时可以指定消息的请求头以及额外的消息参数。

在消息发送时,需要实现 RocketMQLocalTransactionListener 的两个方法,用于执行本地事务业务以及检查本地业务事务是否执行成功,当事务成功则提交消息,否则事务失败则回滚事务。当业务还在处理中时,则需要返回未知的状态。待到本地事务执行成功,才能真正的发送消息给消费者进行消费。

bash 复制代码
# 执行本地事务消息
executeLocalTransaction
# 检查本地事务消息
checkLocalTransaction

6 总结

本文主要介绍了 rocketmq 的实践操作,以顺序消息和事务消息为例介绍了其使用的特点。在此基础之上加深了对消息的理解,在后续的应用场景中能够更好的发挥其作用。本文中所涉及的代码已经上传至 github, 欢迎大家点赞关注。项目 github 地址 springboot-auth

相关推荐
香吧香15 分钟前
Spring boot 中 CommandLineRunner 在服务启动完成后自定义执行
java·spring boot·spring cloud
一 乐15 分钟前
美食推荐|基于springboot+vue的美食分享系统设计与实现(源码+数据库+文档)
前端·数据库·vue.js·spring boot·后端·美食
qq_124987075327 分钟前
基于springboot+vue+mysql的校园博客系统(源码+论文+部署+安装)
java·vue.js·spring boot·mysql·毕业设计
韩立学长1 小时前
基于Springboot民族文化与旅游网站j9x74dt2(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·旅游
是梦终空1 小时前
计算机毕业设计248—基于Java+Springboot+vue的博物馆预约系统(源代码+数据库+开发文档)
java·spring boot·vue·毕业设计·jwt·博物馆预约系统·博物馆网站
7哥♡ۣۖᝰꫛꫀꪝۣℋ3 小时前
Spring Boot ⽇志
java·spring boot·后端
新手程序员大大4 小时前
springCloudGateway+Nacos注册与转发Netty+WebSocket
spring boot
即将进化成人机4 小时前
springboot项目创建方式
java·spring boot·后端
vx_bisheyuange4 小时前
基于SpringBoot的游戏交易系统
spring boot·后端·游戏·毕业设计
毕设源码-朱学姐4 小时前
【开题答辩全过程】以 基于SpringBoot的流行音乐网站的设计与实现为例,包含答辩的问题和答案
java·spring boot·后端