RabbitMQ學習系列(一): RabbitMQ快速入門

RabbitMQ是目前非常熱門的一款訊息中介軟體,不管是網際網路大廠還是中小企業都在大量使用。作為一名合格的開發者,有必要對RabbitMQ有所瞭解,本文是RabbitMQ快速入門文章,主要內容包括RabbitMQ是什麼、RabbitMQ核心概念、常用交換器型別等。

熟悉的電商場景同學應該都知道:一般商品服務和訂單服務屬於兩個不同的微服務,在下單的過程中訂單服務需要呼叫商品服務進行扣庫存操作。按照傳統的方式,下單過程要等到呼叫完畢之後才能返回下單成功,如果網路產生波動等原因使得商品服務扣庫存延遲或者失敗,如果在高併發的場景下,這樣的處理顯然是不合適的,那怎麼進行最佳化呢?這就需要用到訊息佇列。

訊息佇列提供一個非同步通訊機制,訊息的傳送者不必一直等待到訊息被成功處理才返回,而是立即返回。訊息中介軟體負責處理網路通訊,如果網路連線不可用,訊息被暫存於隊列當中,當網路暢通的時候在將訊息轉發給相應的應用程式或者服務,當然前提是這些服務訂閱了該佇列。如果在商品服務和訂單服務之間使用訊息中介軟體,既可以提高併發量,又降低服務之間的耦合度。

RabbitMQ 就是這樣一個開源的訊息代理的佇列伺服器,透過AMQP 協議在不同的應用之間實現資料共享。

一、介紹

RabbitMQ學習系列(一): RabbitMQ快速入門

RabbitMQ是一個由erlang開發的基於AMQP(Advanced Message Queue )協議的開源實現。用於在分散式系統中儲存轉發訊息,在易用性、擴充套件性、高可用性等方面都非常的優秀。是當前最主流的訊息中介軟體之一。

RabbitMQ的官網

:http://www。rabbitmq。com

訊息佇列的典型應用場景:

非同步處理。把訊息放入訊息中介軟體中,等到需要的時候再去處理。

流量削峰。例如秒殺活動,在短時間內訪問量急劇增加,使用訊息佇列,當訊息佇列滿了就拒絕響應,跳轉到錯誤頁面,這樣就可以使得系統不會因為超負載而崩潰。

日誌處理

應用解耦。假設某個服務A需要給許多個服務(B、C、D)傳送訊息,當某個服務(例如B)不需要傳送訊息了,服務A需要改程式碼再次部署;當新加入一個服務(服務E)需要服務A的訊息的時候,也需要改程式碼重新部署;另外服務A也要考慮其他服務掛掉,沒有收到訊息怎麼辦?要不要重新發送呢?是不是很麻煩,使用MQ釋出訂閱模式,服務A只生產訊息傳送到MQ,B、C、D從MQ中讀取訊息,需要A的訊息就訂閱,不需要了就取消訂閱,服務A不再操心其他的事情,使用這種方式可以降低服務或者系統之間的耦合。

二、AMQP協議

提到RabbitMQ,就不得不提AMQP協議。AMQP是一個提供統一訊息服務的應用層標準高階訊息佇列協議,AMQP是應用層協議的一個開放標準,為面向訊息的中介軟體設計。訊息中介軟體主要用於元件之間的解耦,訊息的傳送者無需知道訊息使用者的存在,同樣,訊息使用者也不用知道傳送者的存在。AMQP的主要特徵是面向訊息、佇列、路由(包括點對點和釋出/訂閱)、可靠性、安全。

RabbitMQ學習系列(一): RabbitMQ快速入門

正如圖中所看到的,AMQP協議模型有三部分組成:生產者、消費者和服務端。

生產者是投遞訊息的一方,首先連線到Server,建立一個連線,開啟一個通道;然後生產者宣告交換器和佇列,設定相關屬性,並透過路由鍵將交換器和佇列進行繫結。同理,消費者也需要進行建立連線,開啟通道等操作,便於接收訊息。

接著生產者就可以傳送訊息,傳送到服務端中的虛擬主機,虛擬主機中的交換器根據路由鍵選擇路由規則,然後傳送到不同的訊息佇列中,這樣訂閱了訊息佇列的消費者就可以獲取到訊息,進行消費。

三、系統架構

RabbitMQ學習系列(一): RabbitMQ快速入門

訊息佇列的使用過程大概如下:

(1)客戶端連線到訊息佇列伺服器,開啟一個channel。

(2)客戶端宣告一個exchange,並設定相關屬性。

(3)客戶端宣告一個queue,並設定相關屬性。

(4)客戶端使用routing key,在exchange和queue之間建立好繫結關係。

(5) 客戶端投遞訊息到exchange。exchange接收到訊息後,就根據訊息的key和已經設定的binding,進行訊息路由,將訊息投遞到一個或多個佇列裡。

如下圖所示:AMQP 裡主要要說兩個元件:Exchange 和 Queue

綠色的 X 就是 Exchange ,紅色的是 Queue ,這兩者都在 Server 端,又稱作 Broker ,

這部分是 RabbitMQ 實現的,而藍色的則是客戶端,通常有 Producer 和 Consumer 兩種型別。

四、幾個核心概念

P: 為Producer,資料的傳送方。

C:為Consumer,資料的接收方。

Exchange:訊息交換機,它指定訊息按什麼規則,路由到哪個佇列。

Queue:訊息佇列載體,每個訊息都會被投入到一個或多個佇列。

Binding:繫結,它的作用就是把exchange和queue按照路由規則繫結起來。

Routing Key:路由關鍵字,exchange根據這個關鍵字進行訊息投遞。

vhost:虛擬主機,一個broker裡可以開設多個vhost,用作不同使用者的許可權分離。

channel:訊息通道,在客戶端的每個連線裡,可建立多個channel,每個channel代表一個會話任務。

說明: RabbitMQ 的一些基本的概念,就介紹完了,雖然都是些概念,但是瞭解他的一些原理,還是很重要的,特別是exchange 和 路由的概念和作用。接下來會具體介紹它的安裝和使用。

最後

以上, RabbitMQ 的一些基本的概念,就介紹完了,雖然都是些概念,但是瞭解他的一些原理,還是很重要的,特別是exchange 和 路由的概念和作用。接下來會具體介紹它的安裝和使用。歡迎大傢俬信我(

章為忠學架構

推薦閱讀:

Spring Boot如何整合Quartz 實現定時任務

Spring Boot入門系列(八)整合定時任務Task,一秒搞定定時任務

Spring Boot入門系列(十五)Spring Boot 開發環境熱部署的配置

Spring Boot 使用JdbcTemplate操作資料庫,配置多資料來源

Maven快速入門(二)手動建立maven專案hellomaven

Maven快速入門(一)Maven介紹及環境搭建

史上最強《Java 開發手冊》泰山版,阿里出品,必屬精品

Spring Boot入門系列(十三)如何實現事務,極簡版!