應用場景
- 非同步執行
- 應用解耦
- 訊息傳送
- 訊息分發
RabbitMQ介紹
RabbitMQ是實現了AMQP(高階訊息佇列協議)的中介軟體的一種,服務端採用ErLang語言編寫,是分散式系統中很重要的部分
相關概念
角色:傳送者,交換器,佇列,接收者,rabbit在普通的訊息佇列上多加了一層交換機的概念
原理圖:
- P代表生產者
- C代表消費者
- 中間的即RabbitMQ,包含交換器和佇列
幾個比較重要的概念:
- 虛擬主機:一個虛擬主機持有一組交換機,佇列和繫結。虛擬主機的作用:在rabbit中,使用者只能在虛擬主機的細粒度下進行許可權控制,如果要禁止A訪問B的虛擬主機(包括佇列,繫結),那就需要分別對A,B建立虛擬主機。每個rabbit伺服器有一個預設的虛擬主機“/”
- 交換機:用於轉發訊息,不會儲存訊息。如果沒有佇列繫結到交換機的話,他會丟棄生產者傳送的訊息
- 路由鍵:當訊息到達交換機時,交換機需要根據路由鍵來確定要傳送到哪個佇列
- 繫結:交換機需要和佇列進行繫結,是多對多的關係
交換機
交換機只負責接受並轉發訊息到相關的佇列,並不儲存訊息。在啟動ACK模式下找不到佇列會返回錯誤。
交換機的四種型別
Direc(繫結-投送)
direc是rabbit預設的交換機方式,也是最簡單的方式,根據全文匹配去查詢佇列
direc的行為是:“先繫結,再投送”。即在繫結的時候先設定一個路由鍵(routing_key),只有訊息的路由鍵匹配時才會將訊息轉發到繫結的佇列中
模式圖
圖中的X-Q1有一個路由鍵:orange,X-Q2有兩個路由鍵:black,green,當訊息來時就會根據繫結的路由鍵轉發到繫結的佇列
tips:一個交換機--佇列可以繫結多個路由鍵,上圖表示的是Q2不僅需要black,還需要green,防止別的佇列只需要green或black的情況
Topic(最靈活)
topic轉發訊息主要依靠萬用字元,交換機和路由之間的繫結會定義一種路由模式,只有在模式匹配後交換機才能轉發訊息
注意:
- 路由鍵必須是一串字元,以" . "隔開
- 路由模式必須包含一個*
topic和direct方式的異同
傳送程式碼類似:
rabbitTemplate.convertAndSend("topicExchange","key1.key2.key3","msg")
第一個參數列示交換機,第二個參數列示路由鍵,第三個表示要傳送的訊息
topic與redic類似,只是在匹配上支援了模式,在點分形式的路由鍵中可以使用兩個萬用字元:
- *:表示一個詞
- #:表示0個或多個
Headers
headres也是根據模式匹配的,和topic與redic不同的是:他不採用固定的路由鍵,而是一個自定義匹配的型別
Fanout
廣播訊息的模式,不管是路由鍵還是路由鍵,都會將訊息傳送給繫結給他的所有佇列,如果配置了路由鍵會陪忽略
Spring Boot繼承RabbitMQ
pom包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>複製程式碼
配置檔案
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=username
spring.rabbitmq.password=password複製程式碼
詳細請看:示例程式碼
參考:RabbitMQ詳解,非常感謝