自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

MQ,究竟如何保證消息冪等?

開發(fā) 開發(fā)工具 前端
MQ核心架構(gòu),它由發(fā)送端、服務(wù)端、固化存儲(chǔ)、接收端四大部分組成。

[[346872]]

MQ的核心架構(gòu)如何?

MQ核心架構(gòu),它由發(fā)送端、服務(wù)端、固化存儲(chǔ)、接收端四大部分組成。

MQ如何保證消息必達(dá)?

MQ消息必達(dá),架構(gòu)上有兩個(gè)核心設(shè)計(jì)點(diǎn):

  • 消息落地;
  • 消息超時(shí)、重傳、確認(rèn);

畫外音:詳見核心架構(gòu)中的步驟1-6。

MQ消息重傳,是否可能導(dǎo)致重復(fù)的消息?

有可能。

為保證消息的可達(dá)性,超時(shí)、重傳、確認(rèn)機(jī)制可能導(dǎo)致MQ、或者業(yè)務(wù)方收到重復(fù)的消息,從而對(duì)業(yè)務(wù)產(chǎn)生影響。

舉個(gè)栗子:購買會(huì)員卡,上游支付系統(tǒng)負(fù)責(zé)給用戶扣款,下游系統(tǒng)負(fù)責(zé)給用戶發(fā)卡,通過MQ異步通知。不管是上半場(chǎng)的ACK丟失,導(dǎo)致MQ收到重復(fù)的消息,還是下半場(chǎng)ACK丟失,導(dǎo)致購卡系統(tǒng)收到重復(fù)的購卡通知,都可能出現(xiàn),上游扣了一次錢,下游發(fā)了多張卡。

為了避免對(duì)業(yè)務(wù)的影響,MQ如何保證冪等性?

MQ的冪等性,由兩部分構(gòu)成:

  • MQ發(fā)送端,到MQ-server的冪等性(上半場(chǎng));
  • MQ-server,到MQ接收端的冪等性(下半場(chǎng));

上半場(chǎng)消息發(fā)送,如何保證冪等性?

MQ消息發(fā)送上半場(chǎng),即上圖中的1-3:

  • 發(fā)送端MQ-client將消息發(fā)給服務(wù)端MQ-server;
  • 服務(wù)端MQ-server將消息落地;
  • 服務(wù)端MQ-server回ACK給發(fā)送端MQ-client;

如果3丟失,發(fā)送端MQ-client超時(shí)后會(huì)重發(fā)消息,可能導(dǎo)致服務(wù)端MQ-server收到重復(fù)消息。

此時(shí)重發(fā)是MQ-client發(fā)起的,消息的處理是MQ-server,為了避免步驟2落地重復(fù)的消息,對(duì)每條消息,MQ系統(tǒng)內(nèi)部必須生成一個(gè)inner-msg-id,作為去重和冪等的依據(jù),這個(gè)內(nèi)部消息ID的特性是:

  • 全局唯一;
  • MQ生成,具備業(yè)務(wù)無關(guān)性,對(duì)消息發(fā)送方和消息接收方屏蔽;

有了這個(gè)inner-msg-id,就能保證上半場(chǎng)重發(fā),也只有1條消息落到MQ-server的DB中,實(shí)現(xiàn)上半場(chǎng)冪等。

下半場(chǎng)消息發(fā)送,如何保證冪等性?

MQ消息發(fā)送下半場(chǎng),即上圖中的4-6:

  • 服務(wù)端MQ-server將消息發(fā)給接收端MQ-client;
  • 接收端MQ-client回ACK給服務(wù)端;
  • 服務(wù)端MQ-server將落地消息刪除;

需要強(qiáng)調(diào)的是,接收端MQ-client回ACK給服務(wù)端MQ-server,是消息消費(fèi)業(yè)務(wù)方的主動(dòng)調(diào)用行為,不能由MQ-client自動(dòng)發(fā)起,因?yàn)镸Q系統(tǒng)不知道消費(fèi)方什么時(shí)候真正消費(fèi)成功。

如果5丟失,服務(wù)端MQ-server超時(shí)后會(huì)重發(fā)消息,可能導(dǎo)致MQ-client收到重復(fù)的消息。

此時(shí)重發(fā)是MQ-server發(fā)起的,消息的處理是消息消費(fèi)業(yè)務(wù)方,消息重發(fā)勢(shì)必導(dǎo)致業(yè)務(wù)方重復(fù)消費(fèi)(上例中的一次付款,重復(fù)發(fā)卡),為了保證業(yè)務(wù)冪等性,業(yè)務(wù)消息體中,必須有一個(gè)biz-id,作為去重和冪等的依據(jù),這個(gè)業(yè)務(wù)ID的特性是:

  • 對(duì)于同一個(gè)業(yè)務(wù)場(chǎng)景,全局唯一;
  • 由業(yè)務(wù)消息發(fā)送方生成,業(yè)務(wù)相關(guān),對(duì)MQ透明;
  • 由業(yè)務(wù)消息消費(fèi)方負(fù)責(zé)判重,以保證冪等;

最常見的業(yè)務(wù)ID有:支付ID,訂單ID,帖子ID等。 具體到支付購卡場(chǎng)景,發(fā)送方必須將支付ID放到消息體中,消費(fèi)方必須對(duì)同一個(gè)支付ID進(jìn)行判重,保證購卡的冪等。

有了這個(gè)業(yè)務(wù)ID,才能夠保證下半場(chǎng)消息消費(fèi)業(yè)務(wù)方即使收到重復(fù)消息,也只有1條消息被消費(fèi),保證了冪等。

總結(jié),MQ如何保證消息冪等?

首先,上半場(chǎng)冪等。

MQ-client生成inner-msg-id,保證上半場(chǎng)冪等。

這個(gè)ID全局唯一,業(yè)務(wù)無關(guān),由MQ保證。

然后,下半場(chǎng)冪等。

業(yè)務(wù)發(fā)送方帶入biz-id,業(yè)務(wù)接收方去重保證冪等。

這個(gè)ID對(duì)單業(yè)務(wù)唯一,業(yè)務(wù)相關(guān),對(duì)MQ透明。

因此,冪等性,不僅對(duì)MQ有要求,對(duì)業(yè)務(wù)上下游也有要求。

【本文為51CTO專欄作者“58沈劍”原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)聯(lián)系原作者】

戳這里,看該作者更多好文

 

責(zé)任編輯:趙寧寧 來源: 51CTO專欄
相關(guān)推薦

2017-04-03 21:23:44

消息總線冪等性消息

2025-01-13 05:00:00

2021-04-14 17:18:27

冪等性數(shù)據(jù)源MySQL

2023-09-01 15:27:31

2021-03-08 10:19:59

MQ消息磁盤

2024-07-30 11:40:00

數(shù)據(jù)庫NoSQLSQL

2024-09-12 15:28:38

localhost?網(wǎng)絡(luò)IPv4

2020-07-15 08:14:12

高并發(fā)

2025-02-26 08:20:18

2022-11-26 00:00:07

內(nèi)存數(shù)組程序

2021-01-18 14:34:59

冪等性接口客戶端

2021-03-28 09:45:05

冪等性接口數(shù)據(jù)

2024-07-10 12:23:10

2024-09-03 14:16:54

2024-03-13 15:18:00

接口冪等性高并發(fā)

2023-10-26 07:32:42

2016-01-28 09:51:55

2020-11-03 07:43:24

MQ版本號(hào)程序員

2015-07-09 10:44:53

微服務(wù)分布式DevOps

2018-02-01 09:32:16

傳統(tǒng)運(yùn)維SRE
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)