初識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消息流轉圖:
官方下載下傳位址:
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:
登入成功,進入到管控台首頁:
<code>rabbitmqctl</code>基礎操作指令:
<code>rabbitmqctl</code>進階操作指令:
建立一個Maven工程,在<code>pom</code>檔案中添加如下依賴:
生産者代碼示例:
消費者代碼示例:
先運作消費者,再運作生産者,此時消費者控制台輸出如下:
Exchange(交換機)用于接收消息,并根據路由鍵轉發消息所綁定的隊列:
交換機屬性:
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必須完全比對才會被隊列接收,否則該消息會被抛棄
所有發送到Topic Exchange的消息被轉發到所有關心RouteKey中指定Topic的Queue上
Exchange将RouteKey和某Topic進行模糊比對,此時隊列需要綁定一個Topic
可以使用通配符進行模糊比對:
符号 "#" 比對一個或多個詞
符号 "*" 比對不多不少一個詞
例如:
"log.#" 能夠比對到 "log.info.oa"
"log.*" 隻會比對到 "log.error"
不處理路由鍵,隻需要簡單的将隊列綁定到交換機上
發送到交換機的消息都會被轉發到與該交換機綁定的所有隊列上
Fanout交換機轉發消息是最快的
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