消息隊列中間件(一)介紹


消息隊列介紹

消息隊列中間件是大型系統中的重要組件,已經逐漸成為企業系統內部通信的核心手段。它具有松耦合、異步消息、流量削峰、可靠投遞、廣播、流量控制、最終一致性等一系列功能,已經成為異步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 是消費者在生產者之間傳送的對象,消息頭,一組消息屬性,消息體

<完>
本文原發於個人博客:https://www.codingme.net 轉載請注明出處
本文原文鏈接:https://www.codingme.net/2018/11/io/mq-introduction/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM