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