柚子快報激活碼778899分享:消息隊列:RabbitMQ
柚子快報激活碼778899分享:消息隊列:RabbitMQ
目錄
1、什么是rabbitMQ
1.1、AMQP
1.2幾種MQ的對比
?編輯
2、快速入門
2.1、安裝RabbitMQ(使用虛擬機安裝)
2.2、使用RabbitMQ準備
2.3、交換機(Exchange)的概念
2.3.1、交換機作用
2.3.2、交換機的四種類型
一、直連交換機?Direct exchange
二、主題交換機? Topic exchange?
三、扇形交換機??Fanout exchange
四、首部交換機? Headers exchange
默認交換機
死信交換機
3、交換機代碼實例
4、死信交換機的延申
4.1、死信隊列 (延遲隊列)
1、什么是rabbitMQ
一款基于AMQP用于軟件之間通信的中間件 。消費并不需要確保提供方存在,實現了服務之間的高度解耦
1.1、AMQP
Advanced Message Queue,高級消息隊列協(xié)議。它是應用層協(xié)議的一個開放標準,為面向消息的中間件設計,基于此協(xié)議的客戶端與消息中間件可傳遞消息,并不受產品、開發(fā)語言等條件的限制。
1.2幾種MQ的對比
2、快速入門
2.1、安裝RabbitMQ(使用虛擬機安裝)
???先下拉鏡像
docker pull rabbitmq:management
? 運行一個容器把RabbitMQ運行起來? 開放端口 15672(管理)? ?5672客戶端使用
docker run -d \
--name my-rabbitmq \
-p 5672:5672 -p 15672:15672 \
-v /home/rabbitmq:/var/lib/rabbitmq \
--hostname my-rabbitmq-host \
-e RABBITMQ_DEFAULT_VHOST=my_vhost \
-e RABBITMQ_DEFAULT_USER=admin \
-e RABBITMQ_DEFAULT_PASS=admin \
--restart=always \
rabbitmq:management
參數說明:
--hostname:主機名(RabbitMQ的一個重要注意事項是它根據所謂的 “節(jié)點名稱” 存儲數據,默認為主機名)
?-e:指定環(huán)境變量:
RABBITMQ_DEFAULT_VHOST:默認虛擬機名
RABBITMQ_DEFAULT_USER:默認的用戶名
RABBITMQ_DEFAULT_PASS:默認用戶名的密碼
2.2、使用RabbitMQ準備
所需依賴
yml文件配置
2.3、交換機(Exchange)的概念
2.3.1、交換機作用
在RabbitMQ中,生產者發(fā)送消息不會直接將消息投遞到隊列中,而是先將消息投遞到交換機中,?在由交換機轉發(fā)到具體的隊列,?隊列再將消息以推送或者拉取方式給消費者進行消費
2.3.2、交換機的四種類型
一、直連交換機?Direct exchange
直連交換機的路由算法非常簡單:?將消息推送到binding?key與該消息的routing key相同的隊列。
? ? ??
直連交換機X上綁定了兩個隊列。第一個隊列綁定了綁定o鍵range, 第二個隊列有兩個綁定鍵: black和green。
在這種場景下,一 個消息在布時指定了路由鍵為orange將會只被路由到隊列Q1 I 路由鍵為black 和green的消息都將被路由到隊列Q2。其他的消息都將被丟失。同一個綁定鍵可以綁定到不同的隊列上去, 可以增加一個交換機X與隊列Q2的綁定鍵,在這種清況下,直連交換機將會和廣播交換機有著相同的行為, 將消息推送到所有匹配的隊列。一個路由鍵為black的消息將會同時被推送到隊列Q1和Q2。
直連交換機缺點:
直連交換機的?routing_key方案非常簡單?,如果我們希望一?條消息發(fā)送給多個隊列?,那么這個交換機需?要綁定上非常多的?routing_key.
假設每個交換機上都綁定一堆的?routing_key連接到各個隊列上。那么消息的管理?就會異常地困難。
二、主題交換機? Topic exchange?
主題交換機的特點:
發(fā)送到主題交換機的 消息不能有任意的 routing key, ?必須是由點號分開的一串單詞,這些單詞可以是任意的,但通常是與消息相關的一些特征。
如以下是幾個有效的routing key:
"stock.usd.nyse", "nyse.vmw", "quick.orange.rabb 代", routing key的單詞可以 有很多,最大限制是255 bytes。
Topic 交換機的 邏輯與 direct 交換機有點 相似 使用特定路由鍵發(fā)送的消息 將被發(fā)送到所有使用匹配綁定鍵綁定的隊列 ,然而 ,綁定鍵有兩個特殊的情況:
*表示匹配任意一個單詞#表示匹配任意—個或多個單詞?
如:
routing key quick.orange.rabbit-> queue Ql, Q2
routing key lazy.orange.elephant-> queue Ql,Q2
延申:
當一個隊列的綁定鍵是"#",它將會接收所有的消息,而不再考慮所接收消息的路由鍵。當一個隊列的綁定鍵沒有用到"#"和'*"時,它又像 direct 交換一樣工作。
三、扇形交換機??Fanout exchange
特點:
扇形交換機是最基本的交換機類型,它所能做的事清非常簡單廣播消息。
扇形交換機會把能接收到的消息全部發(fā)送給綁定在自己身上的隊列。因為廣播不需要'思考”,所以扇形交換機處理消息的速度也是所有的交換機類型里面最快的。
四、首部交換機? Headers exchange
首部交換機和扇形交換機都不需 要路由鍵routingKey,交換機時通過 Headers 頭部來將消息映射到隊列的 ,有點像 HTTP的 Headers.
Hash結構中要求攜帶一個鍵 "x-match", 這個鍵的Val ue可以是any或者all, 這代表消息攜帶的 Hash是需要全部匹配(all), 還是僅匹配一個鍵(any) 就可以了。相比直連交換機 ,首部交換機的優(yōu)勢是匹配的規(guī)則不被限定為字符串(string)而是 Object 類型。
all: 在發(fā)布消息時攜帶的所有Entry必須和綁定在隊列上的所有 Entry完全匹配any: 只要在發(fā)布消息時攜帶的有一對鍵值對 headers滿足隊列定義的多個參數 arguments的其中一 個就能 匹配上 ,注意這里是鍵值對的完全匹配,只匹配到鍵了,值卻不—樣是不行的;
默認交換機
實際上是— 個由 RabbitMQ預先聲明好的名字為空字符串的直連交換機 (direct exchange) 。它有一個特殊的屬性使得它對于簡單應用特別有用處 :那就是每個新建隊列 (queue) ?都會自動綁定到默認交換機上,綁定的 路由鍵(routing key) 名稱與隊列名稱相同。
當你聲明了一個名為“hello”的隊列,RabbitMQ會自動將其綁定到默認交換機上,綁定(binding)的路由鍵名稱也是為“hello”。
當攜帶著名為“hello”的路由鍵的信息被發(fā)送到默認交換機的時候,此消息會被默認交換機路由至名為“hello”的隊列中
類似amq.*的名稱的交換機:這些是RabbitMQ默認創(chuàng)建的交換機。這些隊列名稱被預留做RabbitMQ內部使用,不能被應用使用,否則拋出403錯誤
死信交換機
RabbitMQ作為一個高級消息中間件,提出了死信交換器的概念。
這種交互器專門處理死了的信息(被拒絕可以重新投遞的信息不能算死的)。
消息變成死信一般是以下三種情況:
①、消息被拒絕,并且設置requeue參數為false。
②、消息過期(默認情況下Rabbit中的消息不過期,但是可以設置隊列的過期時間和信息的過期的效果)
③、隊列達到最大長度(一般當設置了最大隊列長度或大小并達到最大值時)
當滿足上面三種情況時,消息會變成死信消息,并通過死信交換機投遞到相應的隊列中。我們只需要監(jiān)聽相應隊列,就可以對死信消息進行最后的處理。
3、交換機代碼實例
routhingkey:路由規(guī)則
測試
?使用扇形交換機時
rabbitTemplate.converAndSend("fanoutExchange","","hello") //中間必填
4、死信交換機的延申
4.1、死信隊列 (延遲隊列)
死信,在官網中對應的單詞為“Dead Letter”,它是 RabbitMQ 的一種消息機制。 一般來說,生產者將消息投遞到 broker 或者直接到 queue 里了,consumer 從 queue 取出消息進行消費,如果它一直無法消費某條數據,那么可以把這條消息放入死信隊列里面。等待 條件滿足了再從死信隊列中取出來再次消費,從而避免消息丟失。
死信消息的三種來源: ????1)消息被拒絕(basic.reject(單條))/ basic.nack(多條))并且requeue=false; ? ? 2)消費消息時程序出現了異常; ? ? 3)消息過期(x-message-ttl); TTL(Time To Life) ? ? 4)隊列中有消息數量超過了最大值(x-max-length); ? ? 5)隊列中的消息容量超過了隊列的最大空間(x-max-length-bytes);
死信隊列使用流程圖
消息的確認默認情況下是自動確認的如果想改為手動可以在配置文件中添加
(manual)為手動處理信息
消息的確認模式有:
? ? ? ? ①:AcknowledgeMode.NONE:自動確認
? ? ? ? ②:AcknowledgeMode.AUTO:根據情況確認
? ? ? ? ③:AcknowledgeMode.MANUAL:手動確認
//手動確認消息 Boolean 是否重新入隊
channel.basicAck(tag,true)
//手動拒絕消息 Boolean 是否重新入隊
channel.basicReject(tag,false);
?
柚子快報激活碼778899分享:消息隊列:RabbitMQ
精彩內容
本文內容根據網絡資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉載請注明,如有侵權,聯(lián)系刪除。