1 交換機類型
1.1 Direct(直連交換機)
1.1.1 解釋
根據消息攜帶的路由鍵(routing key)將消息投遞給對應隊列的,步驟如下:
1: 將一個隊列綁定到某個交換機上,同時賦予該綁定一個路由鍵(routing key)
// 綁定隊列到交換機
channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "key");
2: 當一個攜帶着路由值爲R的消息被髮送給直連交換機時,交換機會把它路由給綁定值同樣爲R的隊列
channel.basicPublish(EXCHANGE_NAME, "key", null, message.getBytes());
1.1.2 圖解
1.2 Fanout(扇型交換機)
1.2.1 解釋
將消息路由給綁定到它身上的所有隊列。
// 聲明exchange(交換機)
hannel.exchangeDeclare(EXCHANGE_NAME, "fanout");
不同於直連交換機,路由鍵在此類型上不啓任務作用。
如果N個隊列綁定到某個扇型交換機上,當有消息發送給此扇型交換機時,交換機會將消息的發送給這所有的N個隊列上
// 綁定隊列到交換機
channel.queueBind(queueName, EXCHANGE_NAME, "");
Fanout交換機轉發消息是最快的;
1.2.2 圖解
1.3 Topic(主題交換機)
1.3.1 解釋
將路由鍵和某模式進行匹配;此時隊列需要綁定要一個模式上;符號"#"匹配一個或多個詞,符號"*"匹配一個詞;因此"key.#"能夠匹配到"key.gp6.name"和"key.gp6",但是"key.*" 只會匹配到"key.gp6";
1.3.2 圖解
1.4 Headers(頭交換機)
1.4.1 解釋
不處理路由鍵;而是根據發送的消息內容中的headers屬性進行匹配;在綁定Queue與Exchange時指定一組鍵值對;當消息發送到RabbitMQ時會取到該消息的headers與Exchange綁定時指定的鍵值對進行匹配;如果完全匹配則消息會路由到該隊列,否則不會路由到該隊列;headers屬性是一個鍵值對,可以是Hashtable,鍵值對的值可以是任何類型;而fanout,direct,topic 的路由鍵都需要要字符串形式的;
1.4.2 匹配規則
x-match = all :表示所有的鍵值對都匹配才能接受到消息
x-match = any :表示只要有鍵值對匹配就能接受到消息
1.5 默認交換機
1.5.1 解釋
默認交換機(default exchange)實際上是一個由RabbitMQ預先聲明好的名字爲空字符串的直連交換機(direct exchange)
每個新建隊列(queue)都會自動綁定到默認交換機上,綁定的路由鍵(routing key)名稱與隊列名稱相同。
1.5.2 默認交換機
1.6 Dead Letter Exchange(死信交換機)
1.6.1 解釋
在默認情況,如果消息在投遞到交換機時,交換機發現此消息沒有匹配的隊列,則這個消息將被悄悄丟棄。
爲了解決這個問題,RabbitMQ中有一種交換機叫死信交換機。
當消費者不能處理接收到的消息時,將這個消息重新發布到另外一個隊列中,等待重試或者人工干預。
這個過程中的exchange和queue就是所謂的”Dead Letter Exchange 和 Queue”
2 交換機屬性
2.1 Name
交換機名稱
2.2 Durability
是否持久化。如果持久性,則RabbitMQ重啓後,交換機還存在
2.3 Auto-delete
當所有與之綁定的消息隊列都完成了對此交換機的使用後,刪掉它
2.4 Arguments
擴展參數
2.5 Type
交換機類型
2.6 Internal
當前Exchange是否用於RabbitMQ內部使用,默認爲False