消息發(fā)送和消費(fèi)的可靠性必須由分布式消息服務(wù)DMS和生產(chǎn)者以及消費(fèi)者協(xié)同工作才能保證。同時開發(fā)者需要盡量合理使用DMS消息隊列,以提高消息發(fā)送和消息消費(fèi)的效率與準(zhǔn)確性。

對使用分布式消息服務(wù)DMS的生產(chǎn)者和消費(fèi)者有如下的使用建議:
重視消息生產(chǎn)與消費(fèi)的確認(rèn)過程
消息生產(chǎn)(發(fā)送)
發(fā)送消息后,生產(chǎn)者需要根據(jù)DMS的返回信息確認(rèn)消息是否發(fā)送成功,如果返回失敗需要重新發(fā)送。
每次生產(chǎn)消息,生產(chǎn)者都需要等待消息發(fā)送API的應(yīng)答信號,以確認(rèn)消息是否成功發(fā)送。在消息傳遞過程中,如果發(fā)生異常,生產(chǎn)者沒有接收到發(fā)送成功的信號,生產(chǎn)者自己決策是否需要重復(fù)發(fā)送消息。如果接收到發(fā)送成功的信號,則表明該消息已經(jīng)被DMS可靠存儲。
消息消費(fèi)
消息消費(fèi)時,消費(fèi)者需要確認(rèn)消息是否已被成功消費(fèi)。
生產(chǎn)的消息被依次存儲在DMS的存儲介質(zhì)中。消費(fèi)時依次獲取DMS中存儲的消息。消費(fèi)者獲取消息后,進(jìn)行消費(fèi)并記錄消費(fèi)成功或失敗的狀態(tài),并將消費(fèi)狀態(tài)提交到DMS,由DMS決定消費(fèi)下一批消息或回滾重新消費(fèi)消息。
在消費(fèi)過程中,如果出現(xiàn)異常,沒有提交消費(fèi)確認(rèn),該批消息會在后續(xù)的消費(fèi)請求中再次被獲取。
消息生產(chǎn)與消費(fèi)的冪等傳遞
DMS設(shè)計了一系列可靠性保障措施,確保消息不丟失。例如使用消息同步存儲機(jī)制防止系統(tǒng)與服務(wù)器層面的異常重啟或者掉電,使用消息確認(rèn)(ACK)機(jī)制解決消息傳輸過程中遇到的異常。
考慮到網(wǎng)絡(luò)異常等極端情況,用戶除了做好消息生產(chǎn)與消費(fèi)的確認(rèn),還需要配合DMS完成消息發(fā)送與消費(fèi)的重復(fù)傳輸設(shè)計。
當(dāng)無法確認(rèn)消息是否已發(fā)送成功,生產(chǎn)者需要將消息重復(fù)發(fā)送給DMS。
當(dāng)重復(fù)收到已處理過的消息,消費(fèi)者需要告訴DMS消費(fèi)成功且保證不重復(fù)處理。
消息可以批量生產(chǎn)和消費(fèi)
為提高消息發(fā)送和消息消費(fèi)效率,推薦使用批量消息發(fā)送和消費(fèi)。通常,默認(rèn)消息消費(fèi)為批量消費(fèi),而消息發(fā)送盡可能采用批量發(fā)送。同時批量方式可有效減少API調(diào)用次數(shù),減少服務(wù)使用費(fèi)用。
如下面兩張示意圖對比所示,消息批量生產(chǎn)與消費(fèi),可以減少API調(diào)用次數(shù),節(jié)約資源。
批量發(fā)送消息時,單次不能超過10條消息,總大小不能超過512KB。
批量生產(chǎn)(發(fā)送)消息可以靈活使用,在消息并發(fā)多的時候,批量發(fā)送,并發(fā)少時,單條發(fā)送。這樣能夠在減少調(diào)用次數(shù)的同時保證消息發(fā)送的實(shí)時性。

此外,批量消費(fèi)消息時,消費(fèi)者應(yīng)按照接收的順序?qū)ο⑦M(jìn)行處理、確認(rèn),當(dāng)對某一條消息處理失敗時,不再需要繼續(xù)處理本批消息中的后續(xù)消息,直接對已正確處理的消息進(jìn)行確認(rèn)即可。
巧用消費(fèi)組協(xié)助運(yùn)維
用戶使用DMS服務(wù)作為消息管理系統(tǒng),查看隊列的消息內(nèi)容對于定位問題與調(diào)試服務(wù)是至關(guān)重要的。
當(dāng)消息的生產(chǎn)和消費(fèi)過程中遇到疑難問題時,通過創(chuàng)建不同消費(fèi)組可以幫助定位分析問題或調(diào)試服務(wù)對接。用戶可以創(chuàng)建一個新的消費(fèi)組,對隊列中的消息進(jìn)行消費(fèi)并分析消費(fèi)過程,這樣不會影響其他服務(wù)對消息的處理。