桃花潭水深千尺,不及汪伦送我情。
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。