新聞中心
一、緣起

成都創(chuàng)新互聯(lián)公司主要從事成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)珠海,10余年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來(lái)電咨詢建站服務(wù):13518219792
上周討論了兩期環(huán)形隊(duì)列的業(yè)務(wù)應(yīng)用:
《高效定時(shí)任務(wù)的觸發(fā)》
《延遲消息的快速實(shí)現(xiàn)》
兩期的均有大量讀者提問(wèn):
- 任務(wù)、延遲消息都放在內(nèi)存里,萬(wàn)一重啟了怎么辦?
- 能否保證消息必達(dá)?
今天就簡(jiǎn)單聊聊消息隊(duì)列(MsgQueue)的消息必達(dá)性架構(gòu)與流程。
二、架構(gòu)方向
MQ要想盡量消息必達(dá),架構(gòu)上有兩個(gè)核心設(shè)計(jì)點(diǎn):
(1)消息落地
(2)消息超時(shí)、重傳、確認(rèn)
三、MQ核心架構(gòu)
上圖是一個(gè)MQ的核心架構(gòu)圖,基本可以分為三大塊:
(1)發(fā)送方 -> 左側(cè)粉色部分
(2)MQ核心集群 -> 中間藍(lán)色部分
(3)接收方 -> 右側(cè)黃色部分
粉色發(fā)送方又由兩部分構(gòu)成:業(yè)務(wù)調(diào)用方與MQ-client-sender
其中后者向前者提供了兩個(gè)核心API:
- SendMsg(bytes[] msg)
- SendCallback()
藍(lán)色MQ核心集群又分為四個(gè)部分:MQ-server,zk,db,管理后臺(tái)web
黃色接收方也由兩部分構(gòu)成:業(yè)務(wù)接收方與MQ-client-receiver
其中后者向前者提供了兩個(gè)核心API:
- RecvCallback(bytes[] msg)
- SendAck()
MQ是一個(gè)系統(tǒng)間解耦的利器,它能夠很好的解除發(fā)布訂閱者之間的耦合,它將上下游的消息投遞解耦成兩個(gè)部分,如上述架構(gòu)圖中的1箭頭和2箭頭:
(1)發(fā)送方將消息投遞給MQ,上半場(chǎng)
(2)MQ將消息投遞給接收方,下半場(chǎng)
四、MQ消息可靠投遞核心流程
MQ既然將消息投遞拆成了上下半場(chǎng),為了保證消息的可靠投遞,上下半場(chǎng)都必須盡量保證消息必達(dá)。
MQ消息投遞上半場(chǎng),MQ-client-sender到MQ-server流程見(jiàn)上圖1-3:
- MQ-client將消息發(fā)送給MQ-server(此時(shí)業(yè)務(wù)方調(diào)用的是API:SendMsg)
- MQ-server將消息落地,落地后即為發(fā)送成功
- MQ-server將應(yīng)答發(fā)送給MQ-client(此時(shí)回調(diào)業(yè)務(wù)方是API:SendCallback)
MQ消息投遞下半場(chǎng),MQ-server到MQ-client-receiver流程見(jiàn)上圖4-6:
- MQ-server將消息發(fā)送給MQ-client(此時(shí)回調(diào)業(yè)務(wù)方是API:RecvCallback)
- MQ-client回復(fù)應(yīng)答給MQ-server(此時(shí)業(yè)務(wù)方主動(dòng)調(diào)用API:SendAck)
- MQ-server收到ack,將之前已經(jīng)落地的消息刪除,完成消息的可靠投遞
1. 如果消息丟了怎么辦?
MQ消息投遞的上下半場(chǎng),都可以出現(xiàn)消息丟失,為了降低消息丟失的概率,MQ需要進(jìn)行超時(shí)和重傳。
2. 上半場(chǎng)的超時(shí)與重傳
MQ上半場(chǎng)的1或者2或者3如果丟失或者超時(shí),MQ-client-sender內(nèi)的timer會(huì)重發(fā)消息,直到期望收到3,如果重傳N次后還未收到,則SendCallback回調(diào)發(fā)送失敗,需要注意的是,這個(gè)過(guò)程中MQ-server可能會(huì)收到同一條消息的多次重發(fā)。
3. 下半場(chǎng)的超時(shí)與重傳
MQ下半場(chǎng)的4或者5或者6如果丟失或者超時(shí),MQ-server內(nèi)的timer會(huì)重發(fā)消息,直到收到5并且成功執(zhí)行6,這個(gè)過(guò)程可能會(huì)重發(fā)很多次消息,一般采用指數(shù)退避的策略,先隔x秒重發(fā),2x秒重發(fā),4x秒重發(fā),以此類推,需要注意的是,這個(gè)過(guò)程中MQ-client-receiver也可能會(huì)收到同一條消息的多次重發(fā)。
MQ-client與MQ-server如何進(jìn)行消息去重,如何進(jìn)行架構(gòu)冪等性設(shè)計(jì),下一次撰文另述,此處暫且認(rèn)為為了保證消息必達(dá),可能收到重復(fù)的消息。
五、總結(jié)
消息總線是系統(tǒng)之間的解耦利器,但切勿濫用,未來(lái)也會(huì)撰文細(xì)究MQ的使用場(chǎng)景,消息總線為了盡量保證消息必達(dá),架構(gòu)設(shè)計(jì)方向?yàn)椋?/p>
- 消息收到先落地
- 消息超時(shí)、重傳、確認(rèn)保證消息必達(dá)
【本文為專欄作者“58沈劍”原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)聯(lián)系原作者】
分享標(biāo)題:消息總線能否實(shí)現(xiàn)消息必達(dá)?
標(biāo)題鏈接:http://fisionsoft.com.cn/article/dpoppsi.html


咨詢
建站咨詢
