消息隊列

一、消息隊列

  「消息隊列」是在消息的傳輸過程當中保存消息的容器。消息隊列,通常咱們會簡稱它爲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) 下降系統耦合性

 若是模塊之間不存在直接調用,那麼新增模塊或者修改模塊就對其餘模塊影響較小,這樣系統的可擴展性無疑更好一些。

  • 剛開始只有一臺服務器,訂單系統 和 配送系統 共用一個數據庫 (用戶少,數據量不大)
  • 兩臺服務器,訂單系統通知配送系統,等待響應回覆,延遲較大(用戶稍多,數據量稍微增大)
    • 性能稍有提高,典型的同步操做
  • 使用消息隊列,在大型分佈式系統中,同步 變 異步通訊

               

  •  剛開始,訂單系統 經過 普通方法調用 就能夠 通知 配送系統,
  • 分開之後只能經過網絡,調用  web的服務 來 通知 配送系統。
  • 最後 經過 消息隊列 異步通訊。

 

咱們最多見的事件驅動架構相似生產者消費者模式,在大型網站中一般用利用消息隊列實現事件驅動結構。

  1. 把數據到消息隊列叫作生產者(Message Producer)
  2. 從消息隊列裏邊數據叫作消費者(Message Consumer)

 

  • 消息發送者(生產者)和消息接受者(消費者)之間沒有直接耦合
  • 消息發送者將消息發送至分佈式消息隊列即結束對消息的處理,
  • 消息接受者從分佈式消息隊列獲取該消息後進行後續處理,並不須要知道該消息從何而來。
  • 對新增業務,只要對該類消息感興趣,便可訂閱該消息,對原有系統和業務沒有任何影響,從而實現網站業務的可擴展性設計

另外爲了不消息隊列服務器宕機形成消息丟失,會將成功發送到消息隊列的消息存儲在消息生產者服務器上,等消息真正被消費者服務器處理後才刪除消息。

在消息隊列服務器宕機後,生產者服務器會選擇分佈式消息隊列服務器集羣中的其餘服務器發佈消息。

相關文章
相關標籤/搜索