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 来消费消息,其中包括 MessageListenerConcurrently 和MessageListenerOrderly 两种类型,分别表示并发消费消息和顺序消费消息(一个队列一个线程)。

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。

相关推荐
code_slave(码畜)1 小时前
微服务架构落地:消息队列架构设计(上篇)——异步解耦、削峰填谷,看懂业务事件流转本质
spring boot·spring cloud·微服务·云原生·架构
小蒜学长1 小时前
基于Java的公司采购系统的设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端·公司采购系统
小坏讲微服务2 小时前
Spring Boot 4 新特性全解析:从上手到生产实战
java·spring boot·后端·架构·springboot4
huaweichenai4 小时前
spring boot 实现file文件上传
java·spring boot·后端
VX_bysjlw9854 小时前
数码设备销售网站设计与实现39138-计算机毕设原创(免费领源码+带部署教程)
java·vue.js·spring boot·mysql·tomcat·mybatis·idea
code_slave(码畜)5 小时前
微服务架构落地:消息队列架构设计(下篇)——消息堆积、死信治理与集群监控告警实战
spring boot·spring cloud·微服务·云原生·中间件·架构
霸道流氓气质7 小时前
OpenTelemetry 入门与实战:Java Agent、Spring Boot Starter与LLM调用追踪示例
java·开发语言·spring boot
m0_587383007 小时前
24 小时自助健身房系统软件开发实战指南与案例解析
java·spring boot·spring·系统架构·需求分析
爱编程的小白L7 小时前
基于SpringBoot+Vue的医院门诊排队叫号系统的设计与实现
spring boot
马剑威(威哥爱编程)7 小时前
【AI全栈后端12-12】Spring Boot 3.x 到 4.x 迁移实操:Jakarta 11、Jackson 3 与 AI 2.0
java·开发语言·spring boot·后端