第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

全部開發(fā)者教程

RabbitMQ 入門教程

RabbitMQ 簡介
RabbitMQ 簡介

RabbitMQ 交換機(jī)詳解

1. 前言

Hello,大家好。本小節(jié)為大家介紹 RabbitMQ 中交換機(jī)的相關(guān)概念,以及交換機(jī)的構(gòu)成及作用。在 RabbitMQ 消息發(fā)送原理概述小節(jié)中,我們已經(jīng)對 RabbitMQ 整體架構(gòu)有了一個(gè)初步的了解,已經(jīng)知道了交換機(jī)在 RabbitMQ 中充當(dāng)?shù)慕巧敲幢竟?jié)會繼續(xù)深入講解 RabbitMQ 中的交換機(jī)。

本節(jié)主要內(nèi)容:

  • 什么是交換機(jī);

  • RabbitMQ 常用交換機(jī)詳解;

2. 什么是交換機(jī) ?

在 RabbitMQ 中,交換機(jī)主要用來將生產(chǎn)者生產(chǎn)出來的消息,傳送到對應(yīng)的頻道中,即交換機(jī)是一個(gè)消息傳送的媒介,其英文被稱為 exchange 。交換機(jī)在 RabbitMQ 中起著承上啟下的作用。

RabbitMQ 根據(jù)不同業(yè)務(wù)場景,為我們內(nèi)置了多種交換機(jī),但是這些交換機(jī)并不是每一種都會用到,常用的交換機(jī)也就 3 種,接下來讓我們看一下都有哪三種吧。

交換機(jī)名稱 類型 使用頻率
直通交換機(jī) Direct
扇形交換機(jī) Fanout
主題交換機(jī) Topic

3. RabbitMQ 常用交換機(jī)詳解

3.1 直通交換機(jī)

定義:

直通交換機(jī),又被叫做直連交換機(jī),即 Direct Exchange ,是可以直接將消息根據(jù)特定匹配規(guī)則發(fā)送到對應(yīng)的消息隊(duì)列的交換機(jī),如果匹配規(guī)則相同,則一條消息可以被發(fā)送到多個(gè)對應(yīng)的消息隊(duì)列上,而這個(gè)匹配規(guī)則是通過 routing_key 來進(jìn)行匹配。

偽代碼:

// 省略與 RabbitMQ 服務(wù)端建立連接的過程
String queueName = "test_direct_x";
channel.exchangeDeclare("direct_exchange", "direct");
channel.queueDeclare(queueName, true, false, false, null);

代碼解釋:

第 2 行,我們聲明了一個(gè)名為 test_direct_x 隊(duì)列名稱,對于直通交換機(jī)而言,這個(gè)名稱就是我們所說的 routing_key 。

第 3 行,我們使用了 channel 的 exchangeDeclare 方法來聲明了一個(gè)交換機(jī),其中,該方法的第一個(gè)參數(shù)表示交換機(jī)的名稱,第二個(gè)參數(shù)則表示交換機(jī)的類型,這里我們將類型定義為了直連交換機(jī)類型,其類型名稱為 direct 。

第 4 行,我們使用了 channel 的 queueDeclare 方法來聲明了一個(gè)隊(duì)列,其中,該方法的第一個(gè)參數(shù)為我們聲明的 test_direct_x 隊(duì)列。

消息發(fā)送流程:

結(jié)合上述代碼,直通交換機(jī)的消息發(fā)送流程如下圖所示:

消息在經(jīng)過 direct_exchange 交換機(jī)之后,會根據(jù)名為 test_direct_x 的 routing_key 與相應(yīng)的消息隊(duì)列進(jìn)行匹配,如果消息隊(duì)列 1 、消息隊(duì)列 2 、消息隊(duì)列 3 都與該 routing_key 相匹配,那么我們的消息會全部流轉(zhuǎn)到這三個(gè)消息隊(duì)列中去。

3.2 扇形交換機(jī)

定義:

扇形交換機(jī),即 Fanout Exchange ,是通過類似廣播的形式,將消息傳遞到消息隊(duì)列中去,與直通交換機(jī)不同的是,扇形交換機(jī)不需要綁定 routing_key ,會將消息傳遞到所有與該交換機(jī)綁定的消息隊(duì)列中去。

偽代碼:

// 省略與 RabbitMQ 服務(wù)端建立連接的過程
String queueName = "test_fanout_x";
channel.exchangeDeclare("fanout_exchange", "fanout");
channel.queueBind(queueName, "fanout_exchange", "");

代碼解釋:

第 2 行,我們聲明了一個(gè)名為 test_fanout_x 隊(duì)列。

第 3 行,我們使用了 channel 的 exchangeDeclare 方法來聲明了一個(gè)交換機(jī),其中,該方法的第一個(gè)參數(shù)表示交換機(jī)的名稱,第二個(gè)參數(shù)則表示交換機(jī)的類型,這里我們將類型定義為了扇形交換機(jī)類型,其類型名稱為 fanout 。

第 4 行,我們使用了 channel 的 queueBind 方法來將交換機(jī)與消息隊(duì)列進(jìn)行綁定,其中,該方法的第一個(gè)參數(shù)為我們聲明的 test_fanout_x 隊(duì)列,第二個(gè)參數(shù)為要綁定的交換機(jī)的名稱,這里為 fanout_exchange ,對于扇形交換機(jī)來說,隊(duì)列和交換機(jī)的綁定是必須的,否則無法傳遞消息。

消息發(fā)送流程:

結(jié)合上述代碼,扇形交換機(jī)的消息發(fā)送流程如下圖所示:

消息在經(jīng)過 fanout_exchange 交換機(jī)之后,會首先檢測有沒有已經(jīng)與該交換機(jī)進(jìn)行綁定的消息隊(duì)列,如果沒有與該交換機(jī)進(jìn)行綁定的消息隊(duì)列,則消息會自動失效,且跑拋出異常;如果有與該交換進(jìn)行綁定的消息隊(duì)列,則 fanout_exchange 交換機(jī)會將消息以廣播的形式傳遞到所有的消息隊(duì)列中去。

上圖中,消息隊(duì)列 1 、消息隊(duì)列 2 、消息隊(duì)列 3 這三個(gè)消息隊(duì)列的名稱均為 test_fanout_x ,且均與名為 fanout_exchange 的交換機(jī)進(jìn)行了綁定,所以,消息在經(jīng) fanout_exchange 交換機(jī)之后,均會被傳遞到這三個(gè)隊(duì)列中去。

3.3 主題交換機(jī)

定義:

主題交換機(jī),即 Topic Exchange ,是通過 routing_key 與 bidding_key 的匹配規(guī)則進(jìn)行消息傳遞的一種交換機(jī)。

與直通交換機(jī)不同的是,直通交換機(jī)中的 routing_key 和 bidding_key 的名稱必須保持一致,但是在主題交換機(jī)中,bidding_key 會通過一定的規(guī)則去匹配 routing_key ,以此將消息發(fā)送到相匹配的消息隊(duì)列中去。

Tips: 交換機(jī)與隊(duì)列之間進(jìn)行綁定的 key ,被稱為 bidding_key ,消息與交換機(jī)之間進(jìn)行綁定的 key ,被稱為 routing_key 。

偽代碼:

// 省略與 RabbitMQ 服務(wù)端建立連接的過程
String queueName = "test.topic.x";
channel.exchangeDeclare("topic_exchange", "topic");
channel.queueBind(queueName, "fanout_exchange", "test.#");

代碼解釋:

第 2 行,我們聲明了一個(gè)名為 test.topic.x 的隊(duì)列。

第 3 行,我們使用了 channel 的 exchangeDeclare 方法來聲明了一個(gè)交換機(jī),其中,該方法的第一個(gè)參數(shù)表示交換機(jī)的名稱,第二個(gè)參數(shù)則表示交換機(jī)的類型,這里我們將類型定義為了扇形交換機(jī)類型,其類型名稱為 topic 。

第 4 行,我們使用了 channel 的 queueBind 方法來將交換機(jī)與消息隊(duì)列進(jìn)行綁定,其中,該方法的第一個(gè)參數(shù)為我們聲明的 test_fanout_x 隊(duì)列,第二個(gè)參數(shù)為要綁定的交換機(jī)的名稱,這里為 fanout_exchange ,第三個(gè)參數(shù)為 bidding_key , 這里是 test.# 。

消息發(fā)送流程:

結(jié)合上述代碼,主題交換機(jī)的消息發(fā)送流程如下圖所示:

消息在經(jīng)過 topic_exchange 交換機(jī)之后,會根據(jù) routing_key 與 bidding_key 的匹配規(guī)則檢索相匹配的消息隊(duì)列,如果沒有檢測到任何相匹配的消息隊(duì)列,則消息會自動失效;如果檢測到存在相匹配的消息隊(duì)列,則消息均會會被傳送到這些消息隊(duì)列中去。

上圖中,消息隊(duì)列 1 、消息隊(duì)列 2 是我們代碼所設(shè)置的,bidding_key 為 test.# 的兩個(gè)消息隊(duì)列,第三個(gè)消息隊(duì)列的 bidding_key 為 #.topic ,根據(jù)主題交換機(jī) # 號匹配規(guī)則,routing_key 都會與這些 bidding_key 相匹配,消息均會被傳遞到這三個(gè)消息隊(duì)列中去。

Tips: 在主題交換機(jī)中,除了 # 號匹配規(guī)則之外,還有 . 號匹配規(guī)則,他們兩個(gè)的匹配規(guī)則大同小異,這里只對 # 好匹配規(guī)則做了介紹,希望同學(xué)們在課下可以自行了解 . 號的匹配規(guī)則。

4. 小結(jié)

本小節(jié)對常用的 3 種 RabbitMQ 中的交換機(jī)進(jìn)行了詳細(xì)介紹,從不同種類交換機(jī)的概念開始,到交換機(jī)的偽代碼實(shí)現(xiàn),再到不同種交換機(jī)的消息發(fā)送流程結(jié)束,為各位同學(xué)詳細(xì)介紹了直通交換機(jī)、扇形交換機(jī)、主題交換機(jī)的相關(guān)概念,以及消息發(fā)送流程,旨在幫助同學(xué)們可以對 RabbitMQ 中常用的 3 種交換機(jī)都有一個(gè)系統(tǒng)性地了解。