「消息隊列」是在消息的傳輸過程當中保存消息的容器。消息隊列,通常咱們會簡稱它爲MQ(Message Queue)python
咱們先無論消息(Message)這個詞,來看看隊列(Queue)。web
隊列是一種先進先出的數據結構。python用list 實現隊列。數據庫
class Queue: def __init__(self): self.items = [] def isEmpty(self): return self.items == [] def enqueue(self, item): self.items.insert(0, item) def dequeue(self): if self.isEmpty(): return None return self.items.pop() def size(self): return len(self.items)
在Python裏邊,已經實現了很多的隊列了,好比 queue模塊中的 Queue,Collections中的deque:服務器
2、爲何要用消息隊列?網絡
爲何要用消息隊列,也就是在問:用了消息隊列有什麼好處。數據結構
1.經過異步處理提升系統性能(削峯、減小響應所需時間);架構
2.下降系統耦合性。併發
(1) 經過異步處理提升系統性能(削峯、減小響應所需時間)異步
經過以上分析咱們能夠得出消息隊列具備很好的削峯做用的功能——即經過異步處理,將短期高併發產生的事務消息存儲在消息隊列中,從而削平高峯期的併發事務。分佈式
舉例:在 各類稀缺資源(火車票,打折商品)的搶購 中,合理使用消息隊列能夠有效抵禦促銷活動剛開始大量訂單涌入對系統的衝擊。
(2) 下降系統耦合性
若是模塊之間不存在直接調用,那麼新增模塊或者修改模塊就對其餘模塊影響較小,這樣系統的可擴展性無疑更好一些。
咱們最多見的事件驅動架構相似生產者消費者模式,在大型網站中一般用利用消息隊列實現事件驅動結構。
另外爲了不消息隊列服務器宕機形成消息丟失,會將成功發送到消息隊列的消息存儲在消息生產者服務器上,等消息真正被消費者服務器處理後才刪除消息。
在消息隊列服務器宕機後,生產者服務器會選擇分佈式消息隊列服務器集羣中的其餘服務器發佈消息。