环境:springboot2.4.12 + RocketMQ4.8.0
依赖
配置文件
普通消息
发送
接收
顺序消息
发送
这里是根据hashkey将消息发送到不同的队列中
consumeMode = ConsumeMode.ORDERLY,指明了消息模式为顺序模式,一个队列,一个线程。
结果
图片
当consumeMode = ConsumeMode.CONCURRENTLY执行结果如下:
图片
集群/广播消息模式
发送端
集群消息模式
消费端
messageModel = MessageModel.CLUSTERING
测试
启动两个服务分别端口是8080,8081
8080服务
图片
8081服务
图片
集群消息模式下,每个服务分别接收一部分消息,实现了负载均衡
广播消息模式
消费端
messageModel = MessageModel.BROADCASTING
测试
启动两个服务分别端口是8080,8081
8080服务
图片
8081服务
图片
集群消息模式下,每个服务分别都接受了同样的消息。
事务消息
RocketMQ事务的3个状态
TransactionStatus.CommitTransaction:提交事务消息,消费者可以消费此消息TransactionStatus.RollbackTransaction:回滚事务,它代表该消息将被删除,不允许被消费。TransactionStatus.Unknown :中间状态,它代表需要检查消息队列来确定状态。
RocketMQ实现事务消息主要分为两个阶段:正常事务的发送及提交、事务信息的补偿流程 整体流程为:
正常事务发送与提交阶段
1、生产者发送一个半消息给MQServer(半消息是指消费者暂时不能消费的消息)2、服务端响应消息写入结果,半消息发送成功3、开始执行本地事务4、根据本地事务的执行状态执行Commit或者Rollback操作
事务信息的补偿流程1、如果MQServer长时间没收到本地事务的执行状态会向生产者发起一个确认回查的操作请求2、生产者收到确认回查请求后,检查本地事务的执行状态3、根据检查后的结果执行Commit或者Rollback操作补偿阶段主要是用于解决生产者在发送Commit或者Rollback操作时发生超时或失败的情况。
发送端
生产者对应的监听器
消费端
Service
Controller
测试
调用接口后,控制台输出:
图片
从打印日志看出来都保存完毕了后 消费端才接受到消息。
图片
图片
删除数据,再测试ID为1会报错的。
图片
数据库中没有数据。。。
是不是也不是很复杂,2个阶段来处理。
完毕!!!