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

相关推荐
昵称为空C2 小时前
SpringBoot3 http接口调用新方式RestClient + @HttpExchange像使用Feign一样调用
spring boot·后端
阿里云云原生11 小时前
海量接入、毫秒响应:易易互联携手阿里云构筑高可用物联网消息中枢
rocketmq
麦兜*11 小时前
MongoDB Atlas 云数据库实战:从零搭建全球多节点集群
java·数据库·spring boot·mongodb·spring·spring cloud
麦兜*11 小时前
MongoDB 在物联网(IoT)中的应用:海量时序数据处理方案
java·数据库·spring boot·物联网·mongodb·spring
汤姆yu11 小时前
基于springboot的毕业旅游一站式定制系统
spring boot·后端·旅游
计算机毕业设计木哥12 小时前
计算机毕设选题推荐:基于Java+SpringBoot物品租赁管理系统【源码+文档+调试】
java·vue.js·spring boot·mysql·spark·毕业设计·课程设计
gtGsl_14 小时前
深入解析 Apache RocketMQ架构组成与核心组件作用
架构·rocketmq·java-rocketmq
hdsoft_huge1 天前
Java & Spring Boot常见异常全解析:原因、危害、处理与防范
java·开发语言·spring boot
AD钙奶-lalala1 天前
SpringBoot实现WebSocket服务端
spring boot·后端·websocket
毕设源码-朱学姐1 天前
【开题答辩全过程】以 4S店汽车维修保养管理系统为例,包含答辩的问题和答案
java·spring boot·汽车