1. 程式人生 > >訊息佇列中介軟體(一)介紹

訊息佇列中介軟體(一)介紹

訊息佇列中介軟體(一)介紹

訊息佇列介紹

訊息佇列中介軟體是大型系統中的重要元件,已經逐漸成為企業系統內部通訊的核心手段。它具有鬆耦合、非同步訊息、流量削峰、可靠投遞、廣播、流量控制、最終一致性等一系列功能,已經成為非同步RPC的主要手段之一。
目前常見的訊息中介軟體有ActiveMQ、RabbitMQ、ZeroMQ、Kafka、MetaMQ、RocketMQ等。

訊息佇列應用場景

訊息佇列在實際中常見的應用場景有應用解耦、非同步處理、流量錯峰與流控、日誌處理等等。

應用解耦

訊息中介軟體顧名思義是用於訊息存放的中介軟體。拿支付訂單流程舉例,在沒有中介軟體的情況下,流程大致如下:

  • 使用者支付訂單,更新訂單狀態
  • 呼叫庫存服務,完成響應功能
  • 呼叫積分服務,完成響應功能
  • 呼叫簡訊服務,傳送簡訊通知

這個過程是順序執行的,如果庫存和積分或者簡訊服務沒有及時響應,或者簡訊服務處理堵塞,客戶端使用者收到響應的時間將會延長,體驗變差。
其實我們知道對於訂單流程,只有訂單處理才是核心服務,其他依賴系統不是那麼重要,可以通知到即可。所以可以使用訊息中介軟體,我們在處理完畢訂單之後放入中介軟體立刻返回,然後後續服務從中介軟體中拿到資料進行後續的處理。

非同步處理

非同步處理是使用訊息中介軟體的一個重要功能,拿使用者註冊來說,如果沒有訊息中介軟體,流程大致如下:

  • 提交註冊資訊,儲存註冊資訊①
  • 傳送註冊通知郵件②
  • 傳送簡訊驗證碼③

這個過程是順序的,很明顯在傳送郵件或簡訊時候有可能因為網路等原因傳送有一定延遲,這時候響應時間變長。時間為①+②+③。
在不使用中介軟體的情況下我們可以稍微改進,可以在註冊資訊記錄完畢之後同時呼叫傳送通知郵件和傳送簡訊驗證碼的程式。時間為①+(max(②,③))。雖然改進,但是因為使用了並行處理,由於CPU的並行處理能力有限,瓶頸很快就會到來。
可以繼續改進,註冊資訊記錄完畢之後寫入中介軟體,立即返回。簡訊服務和郵件服務從中介軟體中取出資訊傳送通知,時間為①+寫入中介軟體時間。

流量錯峰

在類似於秒殺這樣的場景中會在某個時間流量突增,大量的請求同時到達服務端,無疑對後端的壓力會大大增加,如果都等著處理完成可能會堵死後續的請求。這時候可以使用訊息中介軟體把需要處理的資訊先儲存在中介軟體,也可以控制活動的參與人數。在後續服務程式有能力時再拿出資訊進行處理,就可以削平流量峰值。保證處理程式的正常執行。

日誌處理

在生產環境中,為了監控日誌,會有大量的日誌需要傳輸儲存檢索,現在比較有名的日誌處理架構有ELK,在分散式應用中由於日誌的數量級越來越大,儲存起來對速度的要求也越快越快。這時候需要使用中介軟體解決大量日誌傳輸的問題,比如Kafka。
下圖是一個常見的日誌處理架構:

  1. Kafka:接收使用者日誌的訊息佇列。

  2. Logstash:做日誌解析,統一成JSON輸出給Elasticsearch。

  3. Elasticsearch:實時日誌分析服務的核心技術,一個schemaless,實時的資料儲存服務,通過index組織資料,兼具強大的搜尋和統計功能。

  4. Kibana:基於Elasticsearch的資料視覺化元件,超強的資料視覺化能力是眾多公司選擇ELK stack的重要原因。

JMS訊息服務

JMS是Java訊息服務(Java Message Service)應用程式介面,是一個Java平臺中關於面向訊息中介軟體(MOM)的API,用於在兩個應用程式之間,或分散式系統中傳送訊息,進行非同步通訊。Java訊息服務是一個與具體平臺無關的API,絕大多數MOM提供商都對JMS提供支援。ActiveMQ就是JMS介面的實現。

JMS訊息模式

大部分的訊息佇列都有兩種通訊模式。

  • 點對點(Point-to-Point Messaging Domain)
  • 釋出-訂閱(Publish/Subscribe Messaging Domain)

JMS也不例外的定義了這兩種訊息傳送模型的規範,但是並沒有給予實現,實現JMS介面的訊息中介軟體(MOM)稱為JMS Provider。

點對點
訊息到達訊息系統,被保留在訊息佇列中,然後由一個或者多個消費者消費佇列中的訊息,一個訊息只能被一個消費者消費,然後就會被移除。例如訂單處理系統。
釋出-訂閱
訊息傳送時指定主題(或者說通道),訊息被保留在指定的主題中,消費者可以訂閱多個主題,並使用主題中的所有的訊息,例如現實中的電視與電視訊道。所有客戶端包括髮布者和訂閱者,主題中的訊息可以被所有的訂閱者消費,消費者只能消費訂閱之後傳送到主題中的訊息。

JMS編碼介面

  • ConnectionFactory 用於建立連線到消費中介軟體的連線工廠
  • Connection 代表了應用程式和訊息伺服器之間通訊的線路
  • Destination 指訊息釋出和接收的地點,包括佇列和主題
  • Session 表示一個單執行緒的上下文,用於傳送和接收訊息
  • MessageConsumer 由會話建立,用於接收發送到目標的訊息
  • MessageProducer 由會話建立,用於傳送訊息到目標
  • Message 是消費者在生產者之間傳送的物件,訊息頭,一組訊息屬性,訊息體