亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

全部開發者教程

RabbitMQ 入門教程

RabbitMQ 簡介
RabbitMQ 簡介

RabbitMQ 核心基礎概念詳解

1. 前言

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

本節主要內容:

  • AMQP 協議與 RabbitMQ 的聯系;

  • RabbitMQ 基礎概念梳理;

  • RabbitMQ 基礎概念詳解。

希望各位同學可以完全理解本節內容,這對學習 RabbitMQ 有著至關重要的作用。

2. AMQP 協議與 RabbitMQ 的聯系

2.1 什么是 AMQP 協議

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

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

2.2 與 RabbitMQ 的聯系

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

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

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

3. RabbitMQ 基礎概念梳理

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

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

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

4. RabbitMQ 基礎概念詳解

4.1 生產者與消費者

定義:

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

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

代碼實現:

那么我們如何在 RabbitMQ 中來定義一個生產者和一個消費者呢?接下來就讓我們來看一下 RabbitMQ 中生產者與消費者的基礎通用 API :

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

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

代碼解釋:

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

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

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

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

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

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

代碼解釋:

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

通過上述代碼,我們就實現了 RabbitMQ 的生產端,那消費端又該如何實現呢?

代碼實現:

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

代碼解釋:

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

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

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

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

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

4.2 消息

定義:

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

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

4.3 虛擬主機

定義:

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

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

代碼實現:

在 RabbitMQ 中,默認的虛擬主機為 “/” ,即如果我們不指定我們的虛擬主機,則所有的消息都會存儲到名稱為 “/” 的虛擬主機下,而我們如何使用虛擬主機呢?如下代碼所示:

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

代碼解釋:

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

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

4.4 交換機

定義:

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

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

代碼實現:

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

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

代碼解釋:

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

4.5 路由 Key

定義:

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

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

代碼實現:

我們應該如何定義 routing key 呢?如下代碼所示:

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

代碼解釋:

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

4.6 頻道

定義:

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

代碼實現:

我們應該如何定義 channel 呢?如下代碼所示:

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

代碼解釋:

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

4.7 消息隊列

定義:

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

當生成消息隊列時,RabbitMQ 會根據不同的消息匹配策略,將不同領域的消息劃分到對應的消息隊列中去。消費者可以獲取消息隊列中的消息并消費,且我們可以通過設置一個閥值來規定我們同一時刻消費者需要消費的消息條數,這在高并發環境中是很重要的。

5. 小結

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

本小節是學習 RabbitMQ 的基礎,在學習本節內容時,一定要理清楚本節中所涉及的所有的概念,同學們只有對這些概念有所了解之后,才能開始 RabbitMQ 的學習,各位同學加油。