RabbitMQ是目前非常熱門的一款訊息中介軟體,不管是網際網路大廠還是中小企業都在大量使用。作為一名合格的開發者,有必要對RabbitMQ有所瞭解,本文是RabbitMQ快速入門文章,主要內容包括RabbitMQ是什麼、RabbitMQ核心概念、常用交換器型別、用Docker安裝RabbitMQ等。
RabbitMQ簡介
以熟悉的電商場景為例,如果商品服務和訂單服務是兩個不同的微服務,在下單的過程中訂單服務需要呼叫商品服務進行扣庫存操作。按照傳統的方式,下單過程要等到呼叫完畢之後才能返回下單成功,如果網路產生波動等原因使得商品服務扣庫存延遲或者失敗,會帶來較差的使用者體驗,如果在高併發的場景下,這樣的處理顯然是不合適的,那怎麼進行優化呢?這就需要訊息佇列登場了。
訊息佇列提供一個非同步通訊機制,訊息的傳送者不必一直等待到訊息被成功處理才返回,而是立即返回。訊息中介軟體負責處理網路通訊,如果網路連線不可用,訊息被暫存於佇列當中,當網路暢通的時候在將訊息轉發給相應的應用程式或者服務,當然前提是這些服務訂閱了該佇列。如果在商品服務和訂單服務之間使用訊息中介軟體,既可以提高併發量,又降低服務之間的耦合度。
RabbitMQ就是這樣一款我們苦苦追尋的訊息佇列。RabbitMQ是一個開源的訊息代理的佇列伺服器,用來通過普通協議在完全不同的應用之間共享資料。
RabbitMQ是使用Erlang語言來編寫的,並且RabbitMQ是基於AMQP協議的。Erlang語言在資料互動方面效能優秀,有著和原生Socket一樣的延遲,這也是RabbitMQ高效能的原因所在。可謂“人如其名”,RabbitMQ像兔子一樣迅速。
RabbitMQ除了像兔子一樣跑的很快以外,還有這些特點:
- 開源、效能優秀,穩定性保障
- 提供可靠性訊息投遞模式、返回模式
- 與Spring AMQP完美整合,API豐富
- 叢集模式豐富,表示式配置,HA模式,映象佇列模型
- 保證資料不丟失的前提做到高可靠性、可用性
MQ典型應用場景:
- 非同步處理。把訊息放入訊息中介軟體中,等到需要的時候再去處理。
- 流量削峰。例如秒殺活動,在短時間內訪問量急劇增加,使用訊息佇列,當訊息佇列滿了就拒絕響應,跳轉到錯誤頁面,這樣就可以使得系統不會因為超負載而崩潰。
- 日誌處理
- 應用解耦
AMQP協議和RabbitMQ
提到RabbitMQ,就不得不提AMQP協議。AMQP協議是具有現代特徵的二進位制協議。是一個提供統一訊息服務的應用層標準高階訊息佇列協議,是應用層協議的一個開放標準,為面向訊息的中介軟體設計。
先了解一下AMQP協議中間的幾個重要概念:
- Server:接收客戶端的連線,實現AMQP實體服務。
- Connection:連線,應用程式與Server的網路連線,TCP連線。
- Channel:通道,訊息讀寫等操作在通道中進行。客戶端可以建立多個通道,每個通道代表一個會話任務。
- Message:訊息,應用程式和伺服器之間傳送的資料,訊息可以非常簡單,也可以很複雜。有Properties和Body組成。Properties為外包裝,可以對訊息進行修飾,比如訊息的優先順序、延遲等高階特性;Body就是訊息體內容。
- Virtual Host:虛擬主機,用於邏輯隔離。一個虛擬主機裡面可以有若干個Exchange和Queue,同一個虛擬主機裡面不能有相同名稱的Exchange或Queue。
- Exchange:交換器,接收訊息,按照路由規則將訊息路由到一個或者多個佇列。如果路由不到,或者返回給生產者,或者直接丟棄。RabbitMQ常用的交換器常用型別有direct、topic、fanout、headers四種,後面詳細介紹。
- Binding:繫結,交換器和訊息佇列之間的虛擬連線,繫結中可以包含一個或者多個RoutingKey。
- RoutingKey:路由鍵,生產者將訊息傳送給交換器的時候,會傳送一個RoutingKey,用來指定路由規則,這樣交換器就知道把訊息傳送到哪個佇列。路由鍵通常為一個“.”分割的字串,例如“com.rabbitmq”。
- Queue:訊息佇列,用來儲存訊息,供消費者消費。
我們完全可以直接使用 Connection 就能完成通道的工作,為什麼還要引入通道呢?
試想這樣一個場景, 一個應用程式中有很多個執行緒需要從 RabbitMQ 中消費訊息,或者生產訊息,那麼必然需要建立很多個 Connection,也就是許多個 TCP 連線。然而對於作業系統而言,建立和銷燬 TCP 連線是非常昂貴的開銷,如果遇到使用高峰,效能瓶頸也隨之顯現。 RabbitMQ 採用 TCP 連線複用的方式,不僅可以減少效能開銷,同時也便於管理 。
下圖是AMQP的協議模型:
正如圖中所看到的,AMQP協議模型有三部分組成:生產者、消費者和服務端。
生產者是投遞訊息的一方,首先連線到Server,建立一個連線,開啟一個通道;然後生產者宣告交換器和佇列,設定相關屬性,並通過路由鍵將交換器和佇列進行繫結。同理,消費者也需要進行建立連線,開啟通道等操作,便於接收訊息。
接著生產者就可以傳送訊息,傳送到服務端中的虛擬主機,虛擬主機中的交換器根據路由鍵選擇路由規則,然後傳送到不同的訊息佇列中,這樣訂閱了訊息佇列的消費者就可以獲取到訊息,進行消費。
最後還要關閉通道和連線。
RabbitMQ是基於AMQP協議實現的,其結構如下圖所示,和AMQP協議簡直就是一模一樣。
常用交換器
RabbitMQ常用的交換器型別有direct、topic、fanout、headers四種。
Direct Exchange
該型別的交換器將所有傳送到該交換器的訊息被轉發到RoutingKey指定的佇列中,也就是說路由到BindingKey和RoutingKey完全匹配的佇列中。
Topic Exchange
該型別的交換器將所有傳送到Topic Exchange的訊息被轉發到所有RoutingKey中指定的Topic的佇列上面。
Exchange將RoutingKey和某Topic進行模糊匹配,其中“”用來匹配一個詞,“#”用於匹配一個或者多個詞。例如“com.#”能匹配到“com.rabbitmq.oa”和“com.rabbitmq”;而"login."只能匹配到“com.rabbitmq”。
Fanout Exchange
該型別不處理路由鍵,會把所有傳送到交換器的訊息路由到所有繫結的佇列中。優點是轉發訊息最快,效能最好。
Headers Exchange
該型別的交換器不依賴路由規則來路由訊息,而是根據訊息內容中的headers屬性進行匹配。headers型別交換器效能差,在實際中並不常用。
安裝和使用入門
在雲端計算和容器技術大熱的今天,不會Docker顯得未免太out了吧。Docker提供一種安全、可重複的環境中自動部署軟體的方式,本文使用Docker進行安裝RabbitMQ。
我選擇3.8.0-beta.4-management進行安裝,帶有management是含有管理介面的。
拉取映象和啟動:
docker run -d --hostname my-rabbit -p 5672:5672 -p 15672:15672 rabbitmq:3.8.0-beta.4-management
檢視映象:
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/rabbitmq 3.8.0-beta.4-management d0f93d2b83f7 3 days ago 180 MB
開啟瀏覽器訪問localhost:15672,如果你和我一樣裝在虛擬機器上面的話,需要開啟虛擬機器ip:15672
進行填寫賬號密碼:預設賬號密碼都是guest.
到此,RabbitMQ已經安裝並執行起來了。
總結
本文介紹了RabbitMQ是什麼、RabbitMQ核心概念、常用交換器型別、用Docker安裝RabbitMQ等內容,看完本文,想必對於RabbitMQ已經有了一些初步的瞭解了,後面的世界更精彩。
本文參考慕課網免費課程:《RabbitMQ訊息中介軟體極速入門與實戰》。