10 交換機詳解

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章