消息隊列(Message Queue)允許應用程序通過相互之間發送消息來通信。消息隊列在目標隊列繁忙的時候,提供一個臨時的消息存儲。
下面我將從以下幾個方面來介紹消息隊列。
1、什麼是消息隊列?
2、使用消息隊列可以帶來什麼好處?
3、消息隊列的基本分類
一、什麼是消息隊列?
隊列是一個線性的先進先出的等待處理的事物的集合。消息隊列是在兩個應用之間發送的消息的隊列。它包含一系列等待被處理的工作對象。
消息是指在發送者和接受者之間傳遞的數,它本質上是有着特定格式的字節數組。消息可能是告訴一個系統開始處理或者完成處理某個任務的信息,或者一個平常的信息。
最基本的消息隊列的架構是非常簡單的:有一個生產者客戶端,它負責創建消息並且把消息傳遞給隊列;還有一個被稱爲消費者的應用程序,它連接到隊列並且獲取消息進行處理。隊列中的消息在消費者獲取之前會一直在隊列中存儲的。
二、使用消息隊列的好處
1、異步處理
消息隊列提供了一個異步的通信協議,生產者需要處理程序馬上返回處理結果。電子郵件或許是最好異步消息最好的例子:當一封電子郵件被髮送出去以後,發送者可以繼續做其他的事情,而不需要立即等到接收者的響應。因此,這種方式解耦了生產者和消費者之間的關聯,生產者和消費者不是必須要同時和消息隊列進行交互。
2、解耦合(DECOUPLING)
解耦用於描述一個系統對另一個系統的的依賴性,並且解耦是把兩個系統獨立開來,從而使他們的功能更加高內聚。
一個解耦的系統可以做到兩個或者更多的系統之間無需要建立連接就可以通信,因此係統之間可以保持完全自主和對其他系統的透明性。解耦合通常也是一個計算機系統的良好架構的標識,這樣的系統更加容易維護、擴展和調試。
當消費程序出現問題的時候,生產者依然可以把消息放入隊列中,因此生產者並不受影響,待消費者恢復正常以後繼續處理就可以。
3、架構清晰簡單
使用了消息隊列的架構設計,使生產者和消費者之間的職責和關係更加清晰,減少了邏輯處理的複雜性;另外對於提高併發性和線程安全的架構設計要簡單了很多,不需要更多的鎖機制。
4、可擴展(SCALABILITY)
可擴展性是對於上游和下游更加簡單了,隨着業務的發展,消息的量級肯定也在逐漸的增加。若不適用消息隊列,當數據量少的時候是很容易處理的,但是當達到一定的數量級,大數據量對架構的要求會很高的。可以通過消息隊列的形式解決一部分問題,這種生產者消費者模式如果想要做擴展,核心的模塊則是在消息隊列上,生產者和消費者端的架構擴展是很容易的。因此,各大互聯網公司都再自己的消息隊列上下了很大精力。
三、消息隊列的基本分類
消息隊列無論是簡單的還是複雜的,是單機的還是分佈式的,從生產者和消費者之間的關係來說,我把其分爲兩種:
1、點對點消息隊列
生產者和消費者之間是一對一的關係,這些消息的生產是專門爲了一個消費者服務的。
比如我現在的系統有從Gateway系統接收實時的用戶在京東瀏覽商詳頁的信息,因此我們通過Redis Queue實現了消息隊列。當gateway寫入數據以後,我這邊消費完成,數據就會被從隊列中移除不會再繼續保存。
其模型如下:
2、發佈/訂閱模式(Pub/Sub)
這種模式的使用場景一般爲生產者提供的是基礎業務的數據,對於上層業務會有不止一個消費者。因此,發佈/訂閱 模式保證了各個consumer對於消息的使用是相互獨立,互不影響的。比如Kafka就是一個典型的Pub/Sub模式的消息隊列。
其模型爲:
參考文檔:What is message queueing?