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

MQ 如何實(shí)現(xiàn),消息冪等( MQ 真的不能再背鍋了)?

開(kāi)發(fā) 架構(gòu)
架構(gòu)設(shè)計(jì)上有兩個(gè)核心設(shè)計(jì)點(diǎn):消息落地和息超時(shí)、重傳、確認(rèn),但消息重傳可能導(dǎo)致reciever收到重復(fù)的消息,從而對(duì)業(yè)務(wù)產(chǎn)生影響。

MQ如何實(shí)現(xiàn),消息必達(dá)?》消息必達(dá),架構(gòu)設(shè)計(jì)上有兩個(gè)核心設(shè)計(jì)點(diǎn):

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

但消息重傳可能導(dǎo)致reciever收到重復(fù)的消息,從而對(duì)業(yè)務(wù)產(chǎn)生影響。

MQ如何實(shí)現(xiàn)消息冪等呢?這還是得從MQ的消息發(fā)送流程說(shuō)起。

如《MQ如何實(shí)現(xiàn),消息必達(dá)?》所述,MQ能解除發(fā)布訂閱者之間的耦合,它將消息投遞解耦成上下兩個(gè)半場(chǎng):

  • 箭頭1,上半場(chǎng):發(fā)送方將消息投遞給MQ;
  • 箭頭2,下半場(chǎng):MQ將消息投遞給接收方;

MQ要想實(shí)現(xiàn)冪等,上下半場(chǎng)都必須做到冪等。

上半場(chǎng),如何做到冪等?

MQ消息投遞上半場(chǎng),流程見(jiàn)上圖123:

  • 1:sender將消息發(fā)送給MQ-server;
  • 2:MQ-server將消息落地;
  • 3:MQ-server回調(diào)sender;

如果步驟3超時(shí),步驟1會(huì)重傳,會(huì)導(dǎo)致步驟2收到重復(fù)的消息。此時(shí),

  • 重發(fā)方是:MQ-client
  • 接收方是:MQ-server

消息的收發(fā)在MQ系統(tǒng)內(nèi)閉環(huán),可以由MQ來(lái)實(shí)施消息冪等。

MQ如何實(shí)施消息冪等?

為了避免步驟2落地重復(fù)的消息,對(duì)每條消息,MQ系統(tǒng)內(nèi)部必須生成一個(gè)inner-msg-id,作為去重和冪等的依據(jù)。

這個(gè)inner-msg-id的特性是:

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

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

下半場(chǎng),如何做到冪等?

MQ消息投遞下半場(chǎng),流程見(jiàn)上圖456:

  • 4:MQ-server回調(diào)reciever;
  • 5:reciever收到消息,處理業(yè)務(wù)邏輯,將ACK發(fā)送給MQ-server;
  • 6:MQ-server收到ACK,將之前已經(jīng)落地的消息刪除,流程結(jié)束;

如果步驟5超時(shí),步驟4會(huì)重傳,會(huì)導(dǎo)致業(yè)務(wù)處理方收到重復(fù)的消息。此時(shí),

  • 重發(fā)方是:MQ-server
  • 接收方是:業(yè)務(wù)處理方

消息的收發(fā)不能在MQ系統(tǒng)內(nèi)閉環(huán),只能由業(yè)務(wù)處理方來(lái)保證消息冪等。

業(yè)務(wù)處理方如何實(shí)施消息冪等?

在消息實(shí)體中,必須有一個(gè)biz-id,作為去重和冪等的依據(jù),這個(gè)biz-id的特性是:

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

最常見(jiàn)的biz-id有:

  • 訂單id,業(yè)務(wù)方有義務(wù)避免重復(fù)生成;
  • 支付id,業(yè)務(wù)方有義務(wù)避免重復(fù)扣款;
  • 帖子id,業(yè)務(wù)方有義務(wù)避免重復(fù)發(fā)布;
  • ...

總結(jié)

MQ要想實(shí)現(xiàn)冪等,上下半場(chǎng)都必須做到冪等。

上半場(chǎng):

  • MQ-client生成inner-msg-id,保證上半場(chǎng)冪等;
  • inner-msg-id全局唯一,業(yè)務(wù)無(wú)關(guān),由MQ保證;

下半場(chǎng):

  • 業(yè)務(wù)發(fā)送方帶入biz-id,業(yè)務(wù)接收方去重保證冪等;
  • 這個(gè)biz-id對(duì)業(yè)務(wù)唯一,業(yè)務(wù)相關(guān),對(duì)MQ透明。

冪等性,不僅對(duì)MQ有要求,對(duì)業(yè)務(wù)上下游也有要求,那些罵MQ無(wú)法保證冪等的架構(gòu)師,其實(shí)自己...

知其然,知其所以然。

思路比結(jié)論更重要。

責(zé)任編輯:趙寧寧 來(lái)源: 架構(gòu)師之路
相關(guān)推薦

2020-10-18 07:25:55

MQ消息冪等架構(gòu)

2025-01-10 08:20:00

MQ消息架構(gòu)

2024-11-13 00:59:13

2017-04-03 21:23:44

消息總線(xiàn)冪等性消息

2024-05-14 08:20:59

線(xiàn)程CPU場(chǎng)景

2022-02-18 09:20:43

消息中間件分布式MQ 冪等

2025-04-14 05:00:00

2009-06-14 17:18:55

ibmdwWebSphereMQ

2023-06-29 10:10:06

Rocket MQ消息中間件

2023-10-24 07:50:18

消息中間件MQ

2020-11-03 07:43:24

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

2021-03-08 10:19:59

MQ消息磁盤(pán)

2024-12-12 14:56:48

消息積壓MQ分區(qū)

2024-04-23 08:46:45

消息積壓KafkaMQ

2022-07-26 00:00:00

MQ消息中間件

2019-08-23 12:12:49

MQ消息隊(duì)列

2024-09-23 08:04:45

MYSQL數(shù)據(jù)存儲(chǔ)

2020-07-30 08:03:36

MQ死信隊(duì)列

2019-12-03 13:57:38

CIO背鍋IT

2021-07-01 07:54:15

MQ系統(tǒng)高可用
點(diǎn)贊
收藏

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