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

相关推荐
奋斗的袍子0072 小时前
Spring AI + Ollama 实现调用DeepSeek-R1模型API
人工智能·spring boot·深度学习·spring·springai·deepseek
wolf犭良3 小时前
19、《Springboot+MongoDB整合:玩转文档型数据库》
数据库·spring boot·mongodb
小万编程3 小时前
基于SpringBoot+Vue奖学金评比系统(高质量源码,可定制,提供文档,免费部署到本地)
java·spring boot·后端·毕业设计·计算机毕业设计·项目源码
楠枬4 小时前
网页五子棋——匹配模块
java·spring boot·websocket
qq_12498707534 小时前
Java+SpringBoot+Vue+数据可视化的综合健身管理平台(程序+论文+讲解+安装+调试+售后)
java·开发语言·spring boot·毕业设计
qq_12498707534 小时前
Java+SpringBoot+Vue+数据可视化的美食餐饮连锁店管理系统
java·spring boot·毕业设计·美食
m0_748240545 小时前
Springboot项目:使用MockMvc测试get和post接口(含单个和多个请求参数场景)
java·spring boot·后端
Long_poem6 小时前
【自学笔记】Spring Boot框架技术基础知识点总览-持续更新
spring boot·笔记·后端
楠枬6 小时前
网页五子棋——对战后端
java·开发语言·spring boot·websocket·spring