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

全部開發(fā)者教程

RabbitMQ 入門教程

RabbitMQ 簡介
RabbitMQ 簡介
首頁 慕課教程 RabbitMQ 入門教程 RabbitMQ 入門教程 RabbitMQ 核心基礎(chǔ)概念詳解

RabbitMQ 核心基礎(chǔ)概念詳解

1. 前言

Hello,大家好。本節(jié)會為同學(xué)們介紹 RabbitMQ 中的核心基礎(chǔ)概念。這些核心基礎(chǔ)概念組成 RabbitMQ 的基本元素,貫穿整個 RabbitMQ 的始終,如果我們不了解這些基礎(chǔ)概念,那么當(dāng)我們在使用 RabbitMQ 時,就會一臉懵,所以,在使用 RabbitMQ 之前,充分了解 RabbitMQ 的這些基礎(chǔ)概念是非常有必要的。

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

  • AMQP 協(xié)議與 RabbitMQ 的聯(lián)系;

  • RabbitMQ 基礎(chǔ)概念梳理;

  • RabbitMQ 基礎(chǔ)概念詳解。

希望各位同學(xué)可以完全理解本節(jié)內(nèi)容,這對學(xué)習(xí) RabbitMQ 有著至關(guān)重要的作用。

2. AMQP 協(xié)議與 RabbitMQ 的聯(lián)系

2.1 什么是 AMQP 協(xié)議

說起 AMQP 協(xié)議,我們可能會感到有點陌生,那么為什么還要了解 AMQP 協(xié)議呢? 因為了解什么是 AMQP 協(xié)議可以為我們學(xué)習(xí) RabbitMQ 打下知識基礎(chǔ),讓我們很清楚的知道 RabbitMQ 是用來做什么的。

AMQP 協(xié)議,即 Advanced Message Queuing Protocol,直譯為高級消息隊列協(xié)議,我們只要知道 AMQP 協(xié)議就是一個高級消息隊列協(xié)議就行了。

2.2 與 RabbitMQ 的聯(lián)系

AMQP 協(xié)議由三大模塊組成,分別是交換機、消息隊列、消息隊列路由。通過這三大模塊間的配合,可以實現(xiàn)對消息的發(fā)送、消息的監(jiān)聽等功能。

RabbitMQ 就是借鑒了 AMQP 協(xié)議的組成模塊,在 AMQP 協(xié)議的基礎(chǔ)上,對這些模塊進行整合、拓展,并最終形成了基于 erlang 語言和 AMQP 協(xié)議的一個完備的消息中間件,因此,在 RabbitMQ 中,有些基礎(chǔ)概念是和 AMQP 協(xié)議中的是幾乎一樣的,而有些概念確是 AMQP 協(xié)議中沒有的。

而無論 AMQP 協(xié)議中有沒有其他的概念,在這里會一并介紹。

3. RabbitMQ 基礎(chǔ)概念梳理

在詳細(xì)開始介紹 RabbitMQ 的基礎(chǔ)概念之前,讓我們先來看一下,在 RabbitMQ 中都有哪些基礎(chǔ)概念需要我們知道。

序號 名稱
01 消息
02 虛擬主機
03 交換機
04 路由 Key
05 頻道
06 消息隊列
07 生產(chǎn)者
08 消費者

Tips: 上述清單中的生產(chǎn)者與消費者概念,并不是 RabbitMQ 中特有的概念,考慮到學(xué)習(xí)本課程的同學(xué)基礎(chǔ),在這里就一并進行介紹了。

4. RabbitMQ 基礎(chǔ)概念詳解

4.1 生產(chǎn)者與消費者

定義:

在了解什么是生產(chǎn)者與消費者時,我們可以先不從計算機專業(yè)的角度考慮什么是生產(chǎn)者與消費者,我們可以先來了解它們的字面意思。從生活角度考慮,生產(chǎn)者就是生產(chǎn)某某東西的人,而消費者就是消費某某東西的人,它們兩個一個是生產(chǎn),一個是消費,且保持著一種先生產(chǎn)后消費的關(guān)系。

針對于計算機專業(yè)角度來說,生產(chǎn)者就是生產(chǎn)一條數(shù)據(jù)的手段或者途徑,而消費者則是消費一條數(shù)據(jù)的手段或者途徑。在 RabbitMQ 中,生產(chǎn)者指的就是具備生產(chǎn)一條消息能力的方法,消費者指的就是具備消費一條消息能力的方法。

代碼實現(xiàn):

那么我們?nèi)绾卧?RabbitMQ 中來定義一個生產(chǎn)者和一個消費者呢?接下來就讓我們來看一下 RabbitMQ 中生產(chǎn)者與消費者的基礎(chǔ)通用 API :

在 RabbitMQ 中要想聲明一個生產(chǎn)者,我們首先需要與 RabbitMQ Server 建立通信,即將我們的應(yīng)用程序與 RabbitMQ 的服務(wù)器建立鏈接,如下代碼所示:

ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("127.0.0.1");
connectionFactory.setPort("5672");
Connection connection = connectionFactory.newConnection();

代碼解釋:

第 1 行,我們實例化了一個 RabbitMQ 的鏈接工廠,這是與 RabbitMQ 服務(wù)器建立鏈接的必要基礎(chǔ)操作。

第 2-3 行,我們使用我們實例化的鏈接工廠中的 setHost 和 setPort 方法來設(shè)置我們需要鏈接的 RabbitMQ 服務(wù)器的 ip 地址,以及端口號,RabbitMQ 服務(wù)默認(rèn)的端口號為 5672。

第 4 行,在將 RabbitMQ 服務(wù)的 host 和 port 設(shè)置完畢后,我們使用 connectionFactory 的 newConnection 方法來創(chuàng)建出了一條鏈接,并返回我們連接 RabbitMQ 服務(wù)的 connection 信息。

在建立好連接之后,我們就可以向 RabbitMQ 中發(fā)送消息了,如下代碼所示:

Channel channel = connection.createChannel();
String msg = "Hello RabbitMQ";
channel.basicPublish("", "test01", null, msg.getBytes());

現(xiàn)階段,在上段代碼中,我們只需要了解最后一行代碼所表示的含義即可。

代碼解釋:

第 3 行,我們使用了 channel 的 basicPublish 方法來將我們定義的 msg 消息投遞到 RabbitMQ 中,其中, basicPublish 方法的第一個參數(shù)表示交換機的名稱,第二個參數(shù)表示路由 Key 的名稱,第三個參數(shù)表示消息所設(shè)置的參數(shù),第四個參數(shù)表示將我們的 msg 數(shù)據(jù)轉(zhuǎn)換為 bytes 之后再進行投遞。

通過上述代碼,我們就實現(xiàn)了 RabbitMQ 的生產(chǎn)端,那消費端又該如何實現(xiàn)呢?

代碼實現(xiàn):

String queueName = "test01";
channel.queueDeclare(queueName, true, false, false, null);
DefaultConsumer defaultConsumer = new DefaultConsumer(channel);
channel.basicConsume(queueName, true, defaultConsumer);

代碼解釋:

第 1 行,我們根據(jù)生產(chǎn)者聲明的路由 Key ,定義了一個名為 queueName 的變量,來接收路由 Key 。

第 2 行,我們使用 channel 的 queueDeclare 方法,來聲明一個名為 queueName 的隊列。

第 3 行,我們對 RabbitMQ 中用來接收消息的 Consumer 進行初始化。

第 4 行,我們使用 channel 的 basicConsume 方法,來講我們投遞到 RabbitMQ 中的消息進行消費。

Tips 在這里,我們只是對 RabbitMQ 中如何實現(xiàn)生產(chǎn)端與消費端進行一個簡單的了解,后續(xù)會進行深入介紹。

4.2 消息

定義:

消息,顧名思義,就是我們平常所說的一條信息、一條數(shù)據(jù),消息是 RabbitMQ 中的核心元素,我們產(chǎn)生的任何數(shù)據(jù),在 RabbitMQ 中都被稱為消息。

在整個 RabbitMQ 工作流程中間,有且只有消息被流轉(zhuǎn),我們使用 RabbitMQ 的目的就是來處理我們應(yīng)用程序中需要 RabbitMQ 來處理的任何消息,該消息可以是一句話,可以是一張圖片,可以是一條視頻,也可以是一種文檔。

4.3 虛擬主機

定義:

虛擬主機,即 Virtual Host ,是用來存儲 RabbitMQ 中所有消息數(shù)據(jù)的集合,每個 RabbitMQ 服務(wù)中默認(rèn)只有一臺虛擬主機,并且提供用戶自定義虛擬主機的功能。

我們可以這樣理解:RabbitMQ 中的每個虛擬主機都是一臺數(shù)據(jù)庫,在這個數(shù)據(jù)庫中會存儲 RabbitMQ 的交換機、頻道、路由 Key ,以及消息隊列,每一個虛擬主機是一個獨立的單元,各虛擬主機之間不會相互干擾,各自完成各自的任務(wù)。

代碼實現(xiàn):

在 RabbitMQ 中,默認(rèn)的虛擬主機為 “/” ,即如果我們不指定我們的虛擬主機,則所有的消息都會存儲到名稱為 “/” 的虛擬主機下,而我們?nèi)绾问褂锰摂M主機呢?如下代碼所示:

ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setVirtualHost("/");

代碼解釋:

第 2 行,我們使用 RabbitMQ 鏈接工廠的 setVirtualHost 方法,來為我們的鏈接指定一個虛擬主機,而指定的虛擬主機就是 RabbitMQ 所提供的默認(rèn)虛擬主機。

Tips:
1. 一般來說,每一個應(yīng)用程序或者每一個獨立的業(yè)務(wù)模塊,都會創(chuàng)建屬于自己領(lǐng)域的虛擬主機,目的就是為了和其他業(yè)務(wù)模塊分離開,同時,這樣的架構(gòu)模式更利于不同業(yè)務(wù)數(shù)據(jù)的統(tǒng)計與維護,在線上環(huán)境中,也更利于我們同學(xué)排查業(yè)務(wù)故障。
2. 如果你不知道你的應(yīng)用程序該如何劃分虛擬主機,那就請使用 RabbitMQ 自帶的默認(rèn)虛擬主機,這一點是很重要的。

4.4 交換機

定義:

交換機,即 exchange ,是傳遞消息的中間工具,我們可以把交換機理解為,傳遞消息的媒介,即我們發(fā)到 RabbitMQ 服務(wù)器中的消息,在經(jīng)過虛擬主機之后,會首先到達 exchange 中,然后由 exchange 根據(jù)不同的匹配策略來將消息傳遞到對應(yīng)的頻道中去。

針對不同的業(yè)務(wù)場景,RabbitMQ 為我們內(nèi)置了多種交換機供我們選擇,這里只是對交換機的概念做一個簡單的介紹,后續(xù)我們再詳細(xì)介紹 RabbitMQ 中所有的交換機。

代碼實現(xiàn):

我們應(yīng)該如何選擇一種交換機呢?如下代碼所示:

channel.exchangeDeclare("test_exchange", "direct");

代碼解釋:

第 1 行,我們使用了 channel 的 exchangeDeclare 方法,來選擇了一種類型的交換機,該交換機類型為直接交換機,方法的第一個參數(shù)表示交換機的名稱,我們可以根據(jù)實際情況自定義交換機名稱,方法的第二個參數(shù)為交換機的類型,這個我們不可以自定義,必須要和 RabbitMQ 中所支持的交換機類型的名稱保持一致才行。

4.5 路由 Key

定義:

路由 Key ,即 routing key ,交換機與頻道之間進行綁定的 key ,通過這個 key ,可以實現(xiàn)消息由交換機轉(zhuǎn)移至頻道的過程,從而實現(xiàn)消息的流轉(zhuǎn)。

在同一個虛擬主機中,不能存在相同路由 key 的 key 值。

代碼實現(xiàn):

我們應(yīng)該如何定義 routing key 呢?如下代碼所示:

channel.basicPublish("", "test_routing_key", null, msg.getBytes());

代碼解釋:

第 1 行,我們使用了 channel 的 basicPublish 方法,上述內(nèi)容中已經(jīng)對該方法進行了介紹,現(xiàn)在讓我們直接來看該方法的第二個參數(shù),第二個參數(shù)表示我們路由 key 的名稱,這里為 test_routing_key 。

4.6 頻道

定義:

頻道,即 channel ,我們可以理解為傳遞消息的通道,在 RabbitMQ 中,消息最終經(jīng)過 channel 發(fā)送給對應(yīng)的消費者,消費者接收到消息并將該消息進行消費。

代碼實現(xiàn):

我們應(yīng)該如何定義 channel 呢?如下代碼所示:

ConnectionFactory connectionFactory = new ConnectionFactory();
// 省略連接 RabbitMQ 服務(wù)器的配置
Connection connection = connectionFactory.newConnection();
Channel channel = connection.createChannel();

代碼解釋:

第 4 行,在由 ConnectionFactory 構(gòu)建出一個連接后,我們使用了 connection 的 createChannel 方法來通過建立好的連接創(chuàng)建一個頻道。

4.7 消息隊列

定義:

消息隊列,即消息所在的場所。在 RabbitMQ 中,不可能只存在一條消息,那么當(dāng)存在多條消息時,RabbitMQ 會將這些消息組成一個隊列,用來存放同一領(lǐng)域下的消息,這個隊列就被稱為消息隊列。

當(dāng)生成消息隊列時,RabbitMQ 會根據(jù)不同的消息匹配策略,將不同領(lǐng)域的消息劃分到對應(yīng)的消息隊列中去。消費者可以獲取消息隊列中的消息并消費,且我們可以通過設(shè)置一個閥值來規(guī)定我們同一時刻消費者需要消費的消息條數(shù),這在高并發(fā)環(huán)境中是很重要的。

5. 小結(jié)

本小節(jié)詳細(xì)介紹了 RabbitMQ 中的基礎(chǔ)核心概念,包括消息、虛擬主機、交換機、路由 Key 、頻道、消息隊列、生產(chǎn)者、消費者,針對可以通過代碼實現(xiàn)的基礎(chǔ)核心概念,做了代碼實現(xiàn)和代碼解釋,旨在幫助同學(xué)們在對理論知識有一定認(rèn)知的同時,可以對相應(yīng)概念的代碼實現(xiàn)也有一個了解。

本小節(jié)是學(xué)習(xí) RabbitMQ 的基礎(chǔ),在學(xué)習(xí)本節(jié)內(nèi)容時,一定要理清楚本節(jié)中所涉及的所有的概念,同學(xué)們只有對這些概念有所了解之后,才能開始 RabbitMQ 的學(xué)習(xí),各位同學(xué)加油。