分享
day07-MQ高级
输入“/”快速插入内容
day07-MQ高级
飞书用户7020
49684
154772
70
444
❗
大家学习中如果碰到困难,可以加入
黑马智学伴侣
寻求帮助,有学习交流群,老师、同学在线答疑。还有独享的企业级项目,避免与人撞车。
对应的B站视频:
在昨天的练习作业中,我们改造了余额支付功能,在支付成功后利用RabbitMQ通知交易服务,更新业务订单状态为已支付。
但是大家思考一下,如果这里
MQ
通知失败,支付服务中支付流水显示支付成功,而交易服务中的订单状态却显示未支付,数据出现了不一致。
此时前端发送请求查询支付状态时,肯定是查询交易服务状态,会发现业务订单未支付,而用户自己知道已经支付成功,这就导致用户体验不一致。
因此,这里我们必须尽可能确保
MQ
消息的可靠性,即:消息应该至少被消费者处理1次
那么问题来了:
•
我们该如何确保
MQ
消息的可靠性
?
•
如果真的发送失败,有没有其它的兜底方案?
这些问题,在今天的学习中都会找到答案。
1.发送者的可靠性
首先,我们一起分析一下消息丢失的可能性有哪些。
消息从发送者发送消息,到消费者处理消息,需要经过的流程是这样的:
画板
消息从生产者到消费者的每一步都可能导致消息丢失:
•
发送消息时丢失:
◦
生产者发送消息时连接
MQ
失败
◦
生产者发送消息到达
MQ
后未找到
Exchange
◦
生产者发送消息到达
MQ
的
Exchange
后,未找到合适的
Queue
◦
消息到达
MQ
后,处理消息的进程发生异常
•
MQ
导致消息丢失:
◦
消息到达
MQ
,保存到队列后,尚未消费就突然宕机
•
消费者处理消息时:
◦
消息接收后尚未处理突然宕机
◦
消息接收后处理过程中抛出异常
综上,
我们要解决消息丢失问题,保证
MQ
的可靠性,就必须从3个方面入手
:
•
确保生产者一定把消息发送到
MQ
•
确保
MQ
不会将消息弄丢
•
确保消费者一定要处理消息
这一章我们先来看如何确保生产者一定能把消息发送到
MQ
。
1.1.
生产者重试机制
首先第一种情况
,就是生产者发送消息时,出现了网络故障,导致与
MQ
的连接中断。
为了解决这个问题,SpringAMQP提供的消息发送时的重试机制。即:当
RabbitTemplate
与
MQ
连接超时后,多次重试。
修改
publisher
模块的
application.yaml
文件,添加下面的内容: