前言
今天是第二天,學習RabbitMQ。第一次接觸到Message Queue是在御諾的時候,當時有個同事做了一個這個東西,在Sprint的結尾展示,那時候就覺得MessageQueue這個東西也太酷了,但一直沒有機會(懶)去接觸。
什麼是Message Queue
Message Queue(訊息佇列、消息隊列),是一種用在應用程序之間傳遞消息的通訊是,Message Queue允許應用之間異步的發送和接收消息,並且不需要直接連接到對方
什麼是RabbitMQ
RabbitMQ是個基於AMQP(Advanced Message Queuing Protocal 高級消息隊列協議) ,用於應用程式之間通訊的中間層,Rabbit有四大核心
- 生產者:發送消息的應用程式
- 消費者:接受消息的應用程式
- 佇列:訊息在Message Queue中儲存的位置
- 交換機:訊息路由的一個組件,會依照我們的配置,把訊息分發給特定的佇列
AMQP也包含了四個核心組件
- 消息:包括消息頭、消息體、消息屬性
- 交換機:消息傳遞的中間件,將消息路由到一個或多個隊列中
- 佇列:用來儲存消息的資料結構
- 綁定:交換機和隊列的綁定
下載與安裝
以下適用於M1、M2
使用brew安裝
|
|
啟動rabbitMq
|
|
停止rabbitMq
|
|
啟動後,可以在瀏覽器中輸入
http://localhost:15672/
即可訪問rabbitMq的畫面
帳號密碼都是guest
就可以看到rabbitMq的畫面了
常用指令
創建使用者
tom為使用者名稱,tom60229為使用者密碼
|
|
賦予使用者權限
將tom設成管理員
|
|
實際使用
範例Code
|
|
執行完後,訪問RabbitMQ的頁面,會發現Queue中確實存在一則Message
這時在創建另一個Consumer
|
|
確實有收到消息,重新整理rabbitMQ頁面後
會發現已經沒有Messege在等待了
交換機介紹
Direct
路由鍵與隊列名「完全匹配」交換機,通過與RoutingKey路由鍵將交換機與隊列進行綁定,消息被發送到exchange時,需要根據消息的RountingKey,來進行匹配,只將消息發送到完全匹配到此RountingKey的隊列,如果想要模糊匹配的話要用Topic。
比如一個隊列綁定到交換機要求路由鍵為"key",則只轉發RountingKey標記為"key"的消息,不會轉發"key1"、“key." …等等,他是完全匹配、單撥的形式
以下為範例Code
|
|
執行完後長這樣
接著去掉用Consumer去查看Messege
改成呼叫queueName_2,接收到的仍是key_1的訊息,因為我們在生產者那邊,將queueName2與key_1進行綁定
Fanout
扇出類型的exchange,會將消息分發給所有綁定了此exchange的隊列,此時RountingKey參數無效,因此不管給哪個Queue送消息、屬於同一個exchange底下的都會共享
|
|
執行後會出現一個新的交換機
在Queue中多出了四個Queue
Warning
如果你的Queue有不該跳起來的卻跳了起來,很可能是你不小心綁定到了同一個exchange。如果你的xc_queue_name_fanout,一直沒跳起來,很可能是你的consumer持續在背景執行,一直消費你的Queue,記得關掉
接著啟動消費者,來看看他拿到什麼
Topic
主題類型交換機,此種交換機與Direct類似,也是需要透過routingKey路由鍵進行匹配分發,區別在Topic可以模糊匹配
- Topic中,將RoutingKey通過".“來分為多個部分
- “*":代表一部分
- “#":代表0個或多個部分,如果綁定的路由為#時,則接受所有消息,因為路由鍵所有都匹配
|
|
執行完後
Headers
幾乎跟Direct一樣,所以基本上用不到,有需要再來看
在SpringBoot中使用
加入依賴
|
|
加入配置文件
注意,這邊記得要自己創建一個使用者,不要用guest,有可能會出錯== 不要問我為什麼會知道
|
|
生成關於exchange、queue的,再將兩者綁在一起Bean
|
|
在配置個
Producer
我們這邊用RestAPI的方式發送請求過去。
|
|
其中的rabbitTemplate是SpringBoot用來與rabbitMq交互的一個類
|
|
接著再寫一個
Consumer
的
Listener
|
|
這個方法會去監聽指定Queue的Messege,並且做相應的處理
目前這邊的方式就是把收到的訊息Print出來,並把那個Messege清空,請特別注意,這邊是由rabbit自動幫你ack(acknowledge)的,如果不想要的話也可以去設定把這部分關掉,這邊就不展示了。
範例圖