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