排行
数据库百科
核心案例
行业报告
月度解读
大事记
产业图谱
中国数据库
向量数据库
时序数据库
实时数据库
搜索引擎
空间数据库
图数据库
数据仓库
大调查
2021年报告
2022年报告
年度数据库
2020年openGauss
2021年TiDB
2022年PolarDB
2023年OceanBase
首页
资讯
活动
大会
学习
课程中心
推荐优质内容、热门课程
学习路径
预设学习计划、达成学习目标
知识图谱
综合了解技术体系知识点
课程库
快速筛选、搜索相关课程
视频学习
专业视频分享技术知识
电子文档
快速搜索阅览技术文档
文档
问答
服务
智能助手小墨
关于数据库相关的问题,您都可以问我
数据库巡检平台
脚本采集百余项,在线智能分析总结
SQLRUN
在线数据库即时SQL运行平台
数据库实训平台
实操环境、开箱即用、一键连接
数据库管理服务
汇聚顶级数据库专家,具备多数据库运维能力
数据库百科
核心案例
行业报告
月度解读
大事记
产业图谱
我的订单
登录后可立即获得以下权益
免费培训课程
收藏优质文章
疑难问题解答
下载专业文档
签到免费抽奖
提升成长等级
立即登录
登录
注册
登录
注册
首页
资讯
活动
大会
课程
文档
排行
问答
我的订单
首页
专家团队
智能助手
在线工具
SQLRUN
在线数据库即时SQL运行平台
数据库在线实训平台
实操环境、开箱即用、一键连接
AWR分析
上传AWR报告,查看分析结果
SQL格式化
快速格式化绝大多数SQL语句
SQL审核
审核编写规范,提升执行效率
PLSQL解密
解密超4000字符的PL/SQL语句
OraC函数
查询Oracle C 函数的详细描述
智能助手小墨
关于数据库相关的问题,您都可以问我
精选案例
新闻资讯
云市场
登录后可立即获得以下权益
免费培训课程
收藏优质文章
疑难问题解答
下载专业文档
签到免费抽奖
提升成长等级
立即登录
登录
注册
登录
注册
首页
专家团队
智能助手
精选案例
新闻资讯
云市场
微信扫码
复制链接
新浪微博
分享数说
采集到收藏夹
分享到数说
首页
/
MQ,究竟如何保证消息幂等?
MQ,究竟如何保证消息幂等?
云时代架构
2020-12-22
354
点击上方
"云时代架构
",
右上角
选择“设为星标”
精品技术文章准时送上!
MQ的核心架构如何?
MQ核心架构,它由
发送端、服务端、固化存储、接收端
四大部分组成。
MQ如何保证消息必达?
MQ消息必达,架构上有两个核心设计点:
(1)消息落地;
(2)消息超时、重传、确认;
画外音:详见核心架构中的步骤1-6。
MQ消息重传,是否可能导致重复的消息?
有可能。
为保证消息的可达性,超时、重传、确认机制
可能导致MQ、或者业务方
收到重复的消息
,从而对业务产生影响。
举个栗子:
购买会员卡,上
游支付系统负责给用户扣款
,
下游系统负责给用户发卡
,通过MQ异步通知。不管是上半场的ACK丢失,导致MQ收到重复的消息,还是下半场ACK丢失,导致购卡系统收到重复的购卡通知,都可能出现,
上游扣了一次钱,下游发了多张卡
。
为了避免对业务的影响,MQ如何保证幂等性?
MQ的幂等性,由两部分构成:
(1)MQ发送端,到MQ-server的幂等性(
上半场
);
(2)MQ-server,到MQ接收端的幂等性(
下半场
);
上半场消息发送,如何保证幂等性?
MQ消息发送上半场,即上图中的1-3:
(1)发送端MQ-client将消息发给服务端MQ-server;
(2)服务端MQ-server将消息落地;
(3)服务端MQ-server回ACK给发送端MQ-client;
如果
3丢失
,发送端MQ-client超时后会重发消息,
可能导致服务端MQ-server收到重复消息
。
此时
重发是MQ-client发起的,消息的处理是MQ-server
,为了避免步骤2落地重复的消息,对每条消息,
MQ系统内部必须生成一个inner-msg-id
,作为去重和幂等的依据,这个
内部消息ID
的特性是:
(1)全局唯一;
(2)MQ生成,具备业务无关性,对消息发送方和消息接收方屏蔽;
有了这个inner-msg-id,就能保证上半场重发,也只有1条消息落到MQ-server的DB中,实现上半场幂等。
下半场消息发送,如何保证幂等性?
MQ消息发送下半场,即上图中的4-6:
(1)服务端MQ-server将消息发给接收端MQ-client;
(2)接收端MQ-client回ACK给服务端;
(3)服务端MQ-server将落地消息删除;
需要强调的是,
接收端MQ-client回ACK给服务端MQ-server,是消息消费业务方的主动调用行为,不能由MQ-client自动发起
,因为MQ系统不知道消费方什么时候真正消费成功。
如果
5丢失
,服务端MQ-server超时后会重发消息,
可能导致MQ-client收到重复的消息
。
此时重发是
MQ-server发起的
,
消息的处理是消息消费业务方
,消息重发势必导致业务方重复消费(上例中的一次付款,重复发卡),为了保证业务幂等性
,业务消息体中,必须有一个biz-id
,作为去重和幂等的依据,这个
业务ID
的特性是:
(1)对于同一个业务场景,全局唯一;
(2)由业务消息发送方生成,业务相关,对MQ透明;
(3)由业务消息消费方负责判重,以保证幂等;
最常见的业务ID有:支付ID,订单ID,帖子ID等。
具体到支付购卡场景,发送方必须将支付ID放到消息体中,消费方必须对同一个支付ID进行判重,保证购卡的幂等。
有了这个业务ID,才能够保证下半场消息消费业务方即使收到重复消息,也只有1条消息被消费,保证了幂等。
总结,
MQ
如何保证消息幂等?
首先,上半场幂等。
MQ-client生成inner-msg-id,保证上半场幂等
。
这个ID全局唯一,业务无关,由MQ保证。
然后,下半场幂等。
业务
发送方
带入biz-id,业务
接收方去重
保证幂等
。
这个ID对单业务唯一,业务相关,对MQ透明。
因此,
幂等性,不仅对MQ有要求,对业务上下游也有要求。
如何画出优秀的架构图?
审计/操作/修改日志实现思路
实战篇:一个核心系统 3 万多行代码的重构之旅
TCP 半连接队列和全连接队列满了会发生什么?又该如何应对?
12 张图,1万多字,让你搞懂 Java 并发中的 AQS 是怎么运行?
支持百万级TPS,Kafka是怎么做到的?答案藏在这10张图里
Nginx + Spring Boot 实现负载均衡
做互联网时代适合的架构:开放、分享、协作
长按二维码即可关注我们
求
在看
|求
转发
数据库
文章转载自
云时代架构
,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
领墨值
有奖问卷
意见反馈
客服小墨