MQ能不能實(shí)現(xiàn)消息必達(dá)?要想消息必達(dá),架構(gòu)設(shè)計(jì)上有兩個(gè)核心設(shè)計(jì)點(diǎn):如上圖所示,MQ的核心架構(gòu)圖分為三大塊:1. 發(fā)送方 -> 左側(cè)粉色部分;2. MQ核心集群 -> 中間藍(lán)色部分;藍(lán)色MQ核心集群由MQ-server,zk,db,管理后臺(tái)web等一系列子系統(tǒng)組成。RecvCallback(bytes[] msg)MQ是一個(gè)系統(tǒng)間解耦的利器,它能夠很好的解除發(fā)布訂閱者之間的耦合,它將上下游的消息投遞解耦成兩個(gè)部分,如上述架構(gòu)圖中的箭頭1和箭頭2:箭頭1,上半場(chǎng):發(fā)送方將消息投遞給MQ;箭頭2,下半場(chǎng):MQ將消息投遞給接收方;MQ既然將消息投遞拆成了上下半場(chǎng),為了保證消息的可靠投遞,上下半場(chǎng)都必須盡量保證消息必達(dá)。MQ消息投遞上半場(chǎng),流程見上圖123:1. sender將消息發(fā)送給MQ-server;3. MQ-server回調(diào)sender;MQ上半場(chǎng)的123如果丟失或者超時(shí),sender內(nèi)置的timer會(huì)重發(fā)消息,直到收到3。如果重傳N次后還未收到3,則SendCallback向業(yè)務(wù)方回調(diào)發(fā)送失敗。?MQ消息投遞下半場(chǎng),流程見上圖456:4. MQ-server回調(diào)reciever;5. reciever收到消息,處理業(yè)務(wù)邏輯,將ACK發(fā)送給MQ-server;
6. MQ-server收到ACK,將之前已經(jīng)落地的消息刪除,流程結(jié)束;MQ下半場(chǎng)的456如果丟失或者超時(shí),MQ-server內(nèi)置的timer會(huì)重發(fā)消息,直到收到5并且成功執(zhí)行6。上下半場(chǎng)都要超時(shí)重發(fā),策略如何?1. 定時(shí)重發(fā),每隔10秒發(fā)一次,直到超出次數(shù);2. 指數(shù)退避,先隔x秒重發(fā),2x秒重發(fā),4x秒重發(fā),以此類推;1. MQ是系統(tǒng)之間的解耦利器,它能解除消息發(fā)送方與接收方的直接耦合;2. MQ將消息投遞解耦成了上下兩個(gè)半場(chǎng);3. MQ消息必達(dá),架構(gòu)上有兩個(gè)核心設(shè)計(jì)點(diǎn):消息重發(fā)可能導(dǎo)致收到重復(fù)的消息,如何進(jìn)行架構(gòu)冪等性設(shè)計(jì),下次撰文另述。https://www.geeksforgeeks.org/message-queues-system-design/
==全文完==
該文章在 2025/1/6 10:44:29 編輯過