大家好,我是技术人小Top
本号之前的文章介绍了什么是消息中间件,为什么现在越来越多项目需要用到消息中间件,以及在使用消息中间件的过程中不可避免的会遇到的数据一致性的问题及解决办法。后续结合Springboot2.2.6介绍了如何构建RabbitMQ的消息发送端、消息接收端,以及消息如何异常处理。
今天咱们来介绍如何使用RabbitMQ构建完整的数据一致性保障 ^-^
整体设计
数据一致性主要由消息发送端、RabbitMQ、消息接收端三部分组成
- 发送端实现功能:落地入库、消息校验、失败重发
- RabbitMQ实现功能:Exchange消息处理、Queue消息处理、消息持久化
- 接收端实现功能:落地入库、失败处理、查询接口
消息发送端部分
步骤1
调用RabbitTemplate#convertAndSend API发送消息到Exchange
具体见文章1(文末有链接)
步骤2
调用RabbitTemplate#setConfirmCallback API确认消息发送到Exchange成功,并保存成功的消息入库
具体见文章1(文末有链接)
步骤3
调用RabbitTemplate#setConfirmCallback API确认消息发送到Exchange失败,并保存失败的消息入库
具体见文章1(文末有链接)
步骤4
调用RabbitTemplate#setReturnCallback API确认消息发送到Queue失败,并更新数据库中的消息状态为失败
具体见文章1(文末有链接)
步骤5
定时调用接收端暴露的查询消息消费状态接口确认消费成功和失败
1、本地把所有发送成功的消息从数据库中查询出来
2、远程调用接收端的查询接口把消费成功的数据查询出来
3、比较两者的差集,如果相等则比较结束
4、如果不等则将差集数据传递到第6步
步骤6
定时根据第5步的确认结果,对于消费失败的消息定时重新发送
1、如果有第5步传递过来的数据,则将这些消息重新发送到RabbitMQ
2、本地把所有发送失败的消息从数据库中查询出来
3、如果有失败的数据,则将这些消息重新发送到RabbitMQ
RabbitMQ部分
组件声明及创建
消息发送端负责创建Virtual Host、Exchange、Queue等
具体见文章1(文末有链接)
相关配置文件
消息发送端配置消息发送机制
具体见文章1(文末有链接)
消息接收端部分
步骤1
创建消息监听类或方法
具体见文章2(文末有链接)
步骤2
调用Channel#basicAck API确认消息接收成功,并保存成功的消息入库
具体见文章2(文末有链接)
步骤3
调用Channel#basicNack API确认消息接收失败,并保存失败的消息入库
具体见文章2(文末有链接)
步骤4
调用Channel#basicNack API通知RabbitMQ抛弃错误消息
具体见文章2(文末有链接)
步骤5
RabbitMQ将第4步的错误信息分发到死信交换机及死信队列
具体见文章3(文末有链接)
步骤6
创建对外查询消息消费状态接口,提供给消息发送方进行消息消费状态校验以及重新发送
小结
今天主要介绍了如何构建RabbitMQ数据一致性保障
欢迎持续关注本号,更多精彩内容,敬请期待~
相关文章链接
文章1:小T说:消息中间件,构建RabbitMQ消息发布端代码
文章2:Springboot2.2.6构建RabbitMQ消息接收端
文章3:Springboot2.2.6+RabbitMQ消息异常处理