31

MQ,究竟如何保证消息幂等?

 3 years ago
source link: https://mp.weixin.qq.com/s?__biz=MjM5ODYxMDA5OQ%3D%3D&%3Bmid=2651965495&%3Bidx=1&%3Bsn=a235e95ac08d32ce4ea18a2c47f3525e
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

MQ的核心架构如何?

eQ7zQj.png!mobile

MQ核心架构,它由 发送端、服务端、固化存储、接收端 四大部分组成。

MQ如何保证消息必达?

MQ消息必达,架构上有两个核心设计点:

(1)消息落地;

(2)消息超时、重传、确认;

画外音:详见核心架构中的步骤1-6。

MQ消息重传,是否可能导致重复的消息?

有可能。

为保证消息的可达性,超时、重传、确认机制 可能导致MQ、或者业务方 收到重复的消息 ,从而对业务产生影响。

举个栗子:

购买会员卡,上 游支付系统负责给用户扣款下游系统负责给用户发卡 ,通过MQ异步通知。不管是上半场的ACK丢失,导致MQ收到重复的消息,还是下半场ACK丢失,导致购卡系统收到重复的购卡通知,都可能出现, 上游扣了一次钱,下游发了多张卡

为了避免对业务的影响,MQ如何保证幂等性?

MQ的幂等性,由两部分构成:

(1)MQ发送端,到MQ-server的幂等性( 上半场 );

(2)MQ-server,到MQ接收端的幂等性( 下半场 );

上半场消息发送,如何保证幂等性?

eQ7zQj.png!mobile

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中,实现上半场幂等。

下半场消息发送,如何保证幂等性?

eQ7zQj.png!mobile

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有要求,对业务上下游也有要求。

真人出镜,欢迎 关注+点赞


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK