天天看點

快速入門RabbitMQ核心概念

初識RabbitMQ:

RabbitMQ是一個開源的消息代理和隊列伺服器,用來通過普通協定在完全不同的應用之間共享資料,RabbitMQ是使用Erlang語言來編寫的,并且RabbitMQ是基于AMQP協定的。

哪些網際網路大廠在使用RabbitMQ:

滴滴、美團、頭條、去哪兒、藝龍

為什麼使用RabbitMQ:

開源、性能優秀,穩定性保障

提供可靠性消息投遞模式(confirm) 、傳回模式(return)

與SpringAMQP完美的整合、API豐富

叢集模式豐富,表達式配置,HA模式,鏡像隊列模型

保證資料不丢失的前提做到高可靠性、可用性

主要原因是因為RabbitMQ使用Erlang語言編寫,Erlang語言最初在于交換機領域的架構模式,這樣使得RabbitMQ在Broker之間進行資料互動的性能是非常優秀的

Erlang的優點:Erlang有着和原生Socket一樣的延遲

什麼是AMQP進階消息隊列協定:

AMQP全稱是:Advanced Message Queuing Protocol,是以AMQP翻譯過來就是:進階消息隊列協定。AMQP定義:是具有現代特征的二進制協定。是一個提供統一消息服務的應用層标準進階消息隊列協定,是應用層協定的一個開放标準,為面向消息的中間件設計。

AMQP協定模型:

Server:又稱Broker, 接受用戶端的連接配接,實作AMQP實體服務

Connection:連接配接,應用程式與Broker的網絡連接配接

Channel:網絡信道,幾乎所有的操作都在Channel中進行,Channel是進行消息讀寫的通道。用戶端可建立多個Channel,每個Channel代表一個會話任務

Message:消息,伺服器和應用程式之間傳送的資料,由Properties和Body組成。Properties可以對消息進行修飾,比如消息的優先級、延遲等進階特性;Body則就是消息體内容

Virtual host:虛拟主機,用于進行邏輯隔離,就有點類似于NameSpace或Group的概念,是最上層的消息路由。一個Virtual Host裡面可以有若幹個Exchange和Queue,同一個Virtual Host裡面不能有相同名稱的Exchange或Queue

Exchange:交換機,接收消息,根據路由鍵轉發消息到綁定的隊列

Binding:Exchange和Queue之間的虛拟連接配接,binding中可以包含routing key

Routing key:一個路由規則,虛拟機可用它來确定如何路由一個特定消息

Queue:也稱為Message Queue,消息隊列,儲存消息并将它們轉發給消費者

RabbitMQ整體架構圖:

快速入門RabbitMQ核心概念

RabbitMQ消息流轉圖:

快速入門RabbitMQ核心概念

官方下載下傳位址:

https://www.rabbitmq.com/download.html

我們知道RabbitMQ是基于Erlang編寫的,是以在安裝RabbitMQ之前需要確定安裝了Erlang環境。RabbitMQ與Erlang是有版本對應關系的,可以參考官方列舉的版本對應關系:

https://www.rabbitmq.com/which-erlang.html

例如,我這裡要安裝3.8.9版本的RabbitMQ,那麼按官方的說明,我需要安裝 22.3 ~ 23.x 版本的Erlang環境,我這裡選擇23.1.3版本的Erlang。使用如下指令下載下傳RPM安裝包:

使用<code>yum</code>指令進行安裝,因為<code>yum</code>可自動解決依賴關系:

RabbitMQ新版本沒有提供配置檔案的示例,需要自己去Github上下載下傳:

https://github.com/rabbitmq/rabbitmq-server/blob/master/deps/rabbit/docs/rabbitmq.conf.example

https://github.com/rabbitmq/rabbitmq-server/blob/master/deps/rabbit/docs/advanced.config.example

将配置檔案放到<code>/etc/rabbitmq</code>目錄下:

修改配置檔案:

完成配置後,啟動RabbitMQ Server:

檢查端口是否正常監聽,5672是RabbitMQ的預設端口号:

啟用RabbitMQ的管控台插件,我們可以在管控台中檢視RabbitMQ的基礎監控資訊,以及對RabbitMQ進行管理:

使用浏覽器通路管控台的15672端口,進入到登入界面,預設使用者名密碼均為guest:

快速入門RabbitMQ核心概念

登入成功,進入到管控台首頁:

快速入門RabbitMQ核心概念

<code>rabbitmqctl</code>基礎操作指令:

<code>rabbitmqctl</code>進階操作指令:

建立一個Maven工程,在<code>pom</code>檔案中添加如下依賴:

生産者代碼示例:

消費者代碼示例:

先運作消費者,再運作生産者,此時消費者控制台輸出如下:

快速入門RabbitMQ核心概念

Exchange(交換機)用于接收消息,并根據路由鍵轉發消息所綁定的隊列:

快速入門RabbitMQ核心概念

交換機屬性:

Name:交換機名稱

Type:交換機類型direct、topic、 fanout、 headers

Durability:是否需要持久化,true為持久化

Auto Delete:當最後一個綁定到Exchange 上的隊列删除後,自動删除該Exchange

Internal:目前Exchange是否用于RabbitMQ内部使用,預設為False

Arguments:擴充參數,用于擴充AMQP協定自制定化使用

所有發送到Direct Exchange的消息被轉發到RouteKey中指定的Queue

注意:Direct模式可以使用RabbitMQ自帶的Exchange:default Exchange,是以不需要将Exchange進行任何綁定(binding)操作。消息傳遞時,RouteKey必須完全比對才會被隊列接收,否則該消息會被抛棄

快速入門RabbitMQ核心概念

所有發送到Topic Exchange的消息被轉發到所有關心RouteKey中指定Topic的Queue上

Exchange将RouteKey和某Topic進行模糊比對,此時隊列需要綁定一個Topic

可以使用通配符進行模糊比對:

符号 "#" 比對一個或多個詞

符号 "*" 比對不多不少一個詞

例如:

"log.#" 能夠比對到 "log.info.oa"

"log.*" 隻會比對到 "log.error"

快速入門RabbitMQ核心概念

不處理路由鍵,隻需要簡單的将隊列綁定到交換機上

發送到交換機的消息都會被轉發到與該交換機綁定的所有隊列上

Fanout交換機轉發消息是最快的

快速入門RabbitMQ核心概念

Binding - 綁定:

Exchange和Exchange、Queue之 間的連接配接關系

Binding中可以包含RoutingKey或者參數

Queue - 消息隊列:

消息隊列,實際存儲消息資料

Durability:是否持久化。Durable:是,Transient:否

Auto delete:如選yes,代表當最後一個監聽被移除之後,該Queue會自動被删除

Message - 消息:

伺服器和應用程式之間傳送的資料

本質上就是一段資料,由Properties和Payload(Body)組成

常用屬性:delivery mode、headers(自定義屬性)

Message其他屬性:

content_type、content_encoding、priority

correlation id、reply_to、expiration、message_id

timestamp、type、 user_id、app_id、 cluster_id

設定Message屬性代碼示例:

Virtual host - 虛拟主機:

虛拟位址,用于進行邏輯隔離,最上層的消息路由

一個Virtual Host裡面可以有若幹個Exchange和Queue

同一個Virtual Host裡面不能有相同名稱的Exchange或Queue