應(yīng)用消息隊列可以對系統(tǒng)進(jìn)行解耦,流量削峰,在分布式系統(tǒng)設(shè)計中,消息隊列是重要的組件之一。
在開發(fā)中應(yīng)用過ActiveMQ,kafka等mq,不過對消息隊列背后的實現(xiàn)原理關(guān)注不多,其實了解消息隊列背后的實現(xiàn)特別重要,
比如對一致性等實現(xiàn)的關(guān)注,可以幫助我們在開發(fā)中避免踩坑,規(guī)避問題的出現(xiàn)。這篇文章簡單探討下當(dāng)設(shè)計和實現(xiàn)一個消息隊列時,我們需要關(guān)心哪些地方。
消息隊列功能和特性
一個傳統(tǒng)意義上的消息隊列,需要支持消息的發(fā)送,接受和消息暫存的功能。
在實際應(yīng)用中,對消息隊列的要求遠(yuǎn)不止于此,在不同的業(yè)務(wù)場景中,需要消息隊列提供如順序消息,消息可靠性,消息持久化等需求。
1.即時通信和消息隊列
從消息能否會被即時接受和處理的角度,可以把消息傳遞的方式分為兩種。
一種是即時消息通訊,也就是說消息從發(fā)送者一端發(fā)出后立即就可以達(dá)到接收者一端;
另一種方式稱為延遲消息通訊,即消息從某一端發(fā)出后,首先進(jìn)入一個容器進(jìn)行臨時存儲,當(dāng)達(dá)到某種條件后,再由這個容器發(fā)送給另一端。
延遲消息通訊的容器實現(xiàn)就是消息隊列。
2.消息隊列基礎(chǔ)功能
消息隊列需要支持消息的發(fā)送,消息暫存,和消息的異步消費,
3.消息隊列需要支持的特性
除了基本功能以外,消息隊列在某些特殊的場景還需要支持事務(wù),消息重試等功能。
消息的順序
投遞可靠性保證
消息持久化
支持不同消息模型
多實例集群功能
分布式環(huán)境下的負(fù)載均衡
消息隊列的基礎(chǔ)設(shè)計
為了實現(xiàn)消息隊列的基礎(chǔ)功能,即消息的傳輸,存儲和消費,
需要從以下幾個維度去進(jìn)行設(shè)計:
通信協(xié)議
存儲選擇
消費關(guān)系維護
1.通信協(xié)議
消息既是信息的載體,消息發(fā)送者需要知道如何構(gòu)造消息,消息接收者需要知道如何解析消息,它們需要按照一種統(tǒng)一的格式描