RabbitMQ(二) -- 交換器與隊列

一:前情概述

第一篇文章RabbitMQ(一) – 初識RabbitMQ中對RabbitMQ整體進行了簡介,旨在幫助閱讀本系列文章的朋友建立初步的概念。前文中使用到的API並未深入的進行學習理解,本文將從RabbbitMQ應用服務部分即Broker所包含的交換器與隊列兩方面深入學習

二:深入交換器分類

交換器可以理解爲生產者與隊列的第三者,隊列是RabbiMQ最終存儲數據的位置,但是生產者並不會與隊列直接耦合。而是使用交換器做轉發,示意圖如下所示。RabbitMQ中定義交換器有四種,fanout、direct、topic,header。header因爲其性能原因基本不會使用,本文略過
在這裏插入圖片描述

2.1 fanout交換器

該交換器特點就是在綁定交換器與隊列時不需要bindingKey,也就意味着發送到轉換器的消息轉發到隊列時不會進行routingKey與bindingKey的比較操作,交換器會直接將消息轉發到所有綁定的隊列中。示意圖如下:
在這裏插入圖片描述

2.2 direct交換器

交換器可以與多個隊列進行綁定,但是消息就發送到某個特定規則的隊列。這種情況fanout明顯不適合,採用direct限定交換器與隊列綁定的bindingKey,轉換器消息轉發到隊列時需要routingKey與bindingKey的一致校驗。示意圖如下:
在這裏插入圖片描述

2.3 topic交換器

某個Error級別日誌消息需要發送到全部日誌的隊列與當前日誌級別隊列,交換器與這兩個隊列採用不同的bindingKey進行綁定。推送兩次?topic交換器支持routingKey模糊匹配,完美解決。下表是有關topic交換器中routingKey的一些說明

符號 含義
. 層次分隔,如email.log.error
* 匹配符號,代表一層,如email.log.* 可以匹配email.log.info或者email.log.error
# 匹配符號,代表零或多層,如email.log.#可以匹配email.log,info.sys或者email.log

三:交換器API

第二大節講了交換器種類概念,接下來客戶端採用Java語言,從API入手再深入理解交換器的一些特性

3.1 創建交換器

在這裏插入圖片描述

參數 含義
exchange 交換器的名字
type 交換器種類,BuiltinExchangeType枚舉類封裝了上面講的四類交換器類型
durable 耐磨持久化,也就是當RabbitMQ服務應用重啓後該交換器是否還存在
autoDelete 自動刪除,當所有與該交換器綁定的交換器或隊列不存在時即自動刪除
internal true表示該交換器爲內置交換器,客戶端不能直接發送消息,需要交換器到交換器方式使用
arguments key-value形式的一些交換器特性參數,如alternate-exchange。後續講解
交換器聲明的API具備衆多重載的形式,只要理解具體參數含義,選用合適的API進行使用即可

如下Demo爲創建一個持久化自動刪除fanout類型的交換器,控制檯示意圖如下圖:D代表持久化,AD代表自動刪除

channel.exchangeDeclare(exchangeName, BuiltinExchangeType.FANOUT,true,true,null);

在這裏插入圖片描述

3.2 刪除交換器

在這裏插入圖片描述

參數 含義
exchange 交換器名稱
ifUnused 重載參數,true表示交換器正在使用則不刪除,拋出異常。反之則必須刪除,默認值false
  channel.exchangeDelete(exchangeName,true);
3.3 其它API
方法 含義
exchangeDeclareNoWait 不需要返回值,等於異步執行交換器創建 。慎用!!!!
exchangeDeleteNoWait 與上述創建不等待相似
exchangeDeclarePassive 檢測交換器存在,不存在拋出異常

四:Queue隊列

4.1 隊列創建

隊列重載API相對於交換器而言較少,參數含義也基本類似。具體如下所示:
在這裏插入圖片描述

參數 含義
queue 隊列的名字
durable 耐磨持久化,也就是當RabbitMQ服務應用重啓後該隊列是否還存在
autoDelete 自動刪除,當所有消費者斷開與隊列連接後自動刪除。前提是隊列創建後有消費者與其連接過
exclusive 獨佔,true表示只能創建隊列的連接才能使用這個隊列。注意是連接,如同一連接創建的信道是可以使用該隊列的
arguments key-value形式的一些隊列特性參數
隊列聲明的API具備衆多重載的形式,只要理解具體參數含義,選用合適的API進行使用即可

如下Demo創建一個獨佔自動刪除的隊列,示意圖可能會奇怪爲什麼設置了持久化但是沒有D標誌。自動刪除的隊列還要持久化幹嘛?

channel.queueDeclare(queueName,true,true,true,null);

在這裏插入圖片描述

4.2 隊列刪除

隊列刪除相對於交換器而言多了一個參數,其具體參數含義如下:

參數 含義
exchange 交換器名稱
ifUnused true表示隊列正在使用則不刪除拋出異常。反之則必須刪除,默認值false
ifEmpty true表示隊列爲空則刪除,反之不刪除拋出異常,默認值false
channel.queueDelete(queueName,true,true);
4.3 其它API
方法 含義
queuePurge 清空隊列但是不刪除隊列
queueDeclarePassive 與交換器類似檢測隊列存在
queueDeclareNoWait 與交換器類似不等待返回值

五:Binding

RabbitMQ服務應用通過前面兩大節基本就介紹完了,兩個重要組成就是交換器和隊列。兩者之間的綁定是通過Binding實現,同時需要注意的一點就是交換器與交換器之間也可以進行綁定。內置的交換器客戶端不能直接發送消息,就需要通過綁定交換器的方式使用

5.1 交換器綁定

需要明確的一點就是當創建兩個交換器綁定關係之後,當第二個參數的交換器接收消息之後會將消息發送給第一個參數的交換器
在這裏插入圖片描述

        // 創建交換器
        String topicExchange = "topicExchange";
        channel.exchangeDeclare(topicExchange, BuiltinExchangeType.TOPIC, true, false,null);
        String directExchange = "directExchange";
        channel.exchangeDeclare(directExchange,BuiltinExchangeType.DIRECT,true,false,null);
        
        // 交換器綁定
        channel.exchangeBind(directExchange,topicExchange,"exchange");
        
        // 隊列聲明
        String directQueue = "directQueue";
        channel.queueDeclare(directQueue,true,false,false,null);
        
        // 交換器綁定隊列
        channel.queueBind(directQueue,topicExchange,"exchange");
        
        // 發送消息
        channel.basicPublish(topicExchange,"exchange",MessageProperties.PERSISTENT_TEXT_PLAIN,"測試消息".getBytes());

在這裏插入圖片描述

5.2 隊列綁定

隊列綁定在上面例子中其實已經有了對應的API操作,就是將隊列與交換器進行綁定。參數中的需要定義綁定關係的Binding,當然fanout交換器綁定的時候不需要用到這個關係。借用上面例子截圖隊列綁定關係如下:
在這裏插入圖片描述

5.3 其它API
方法 含義
exchangeUnbind 解除交換器綁定
queueUnbind 解除隊列綁定
queueBindNoWait 無返回值綁定隊列
exchangeBindNoWait 無返回值綁定交換器
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章