rabbitmq

猫猫客服發表於2024-03-22

應用場景

  • 非同步執行
  • 應用解耦
  • 訊息傳送
  • 訊息分發

RabbitMQ介紹

RabbitMQ是實現了AMQP(高階訊息佇列協議)的中介軟體的一種,服務端採用ErLang語言編寫,是分散式系統中很重要的部分

相關概念

角色:傳送者,交換器,佇列,接收者,rabbit在普通的訊息佇列上多加了一層交換機的概念

原理圖:

rabbitmq

  • P代表生產者
  • C代表消費者
  • 中間的即RabbitMQ,包含交換器和佇列

幾個比較重要的概念:

  • 虛擬主機:一個虛擬主機持有一組交換機,佇列和繫結。虛擬主機的作用:在rabbit中,使用者只能在虛擬主機的細粒度下進行許可權控制,如果要禁止A訪問B的虛擬主機(包括佇列,繫結),那就需要分別對A,B建立虛擬主機。每個rabbit伺服器有一個預設的虛擬主機“/”
  • 交換機:用於轉發訊息,不會儲存訊息。如果沒有佇列繫結到交換機的話,他會丟棄生產者傳送的訊息
  • 路由鍵:當訊息到達交換機時,交換機需要根據路由鍵來確定要傳送到哪個佇列
  • 繫結:交換機需要和佇列進行繫結,是多對多的關係

交換機

交換機只負責接受並轉發訊息到相關的佇列,並不儲存訊息。在啟動ACK模式下找不到佇列會返回錯誤。

交換機的四種型別

Direc(繫結-投送)

direc是rabbit預設的交換機方式,也是最簡單的方式,根據全文匹配去查詢佇列

direc的行為是:“先繫結,再投送”。即在繫結的時候先設定一個路由鍵(routing_key),只有訊息的路由鍵匹配時才會將訊息轉發到繫結的佇列中

模式圖

rabbitmq

圖中的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詳解,非常感謝


相關文章