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

相关推荐
马尚道10 小时前
SpringBoot开发双11商品服务系统 | 已完结
spring boot
韩立学长10 小时前
【开题答辩实录分享】以《自然灾害隐患点管理信息系统》为例进行答辩实录分享
数据库·spring boot
我命由我1234510 小时前
Spring Cloud - Spring Cloud 注册中心与服务提供者(Spring Cloud Eureka 概述、微服务快速入门、微服务应用实例)
java·spring boot·spring·spring cloud·微服务·eureka·java-ee
一线大码11 小时前
SpringBoot 优雅实现接口的多实现类方式
java·spring boot·后端
Q_Q196328847512 小时前
python+uniapp基于微信小程序的助眠小程序
spring boot·python·小程序·django·flask·uni-app·node.js
摇滚侠12 小时前
Spring Boot 3零基础教程,WEB 开发 Thymeleaf 属性优先级 行内写法 变量选择 笔记42
java·spring boot·笔记
摇滚侠12 小时前
Spring Boot 3零基础教程,WEB 开发 Thymeleaf 总结 热部署 常用配置 笔记44
java·spring boot·笔记
十年小站12 小时前
一、新建一个SpringBoot3项目
java·spring boot
程序员阿达12 小时前
开题报告之基于SpringBoot框架的路面故障信息上报系统设计与实现
java·spring boot·后端
哞哞不熬夜12 小时前
JavaEE--SpringIoC
java·开发语言·spring boot·spring·java-ee·maven