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

全部開發者教程

RabbitMQ 入門教程

RabbitMQ 簡介
RabbitMQ 簡介
首頁 慕課教程 RabbitMQ 入門教程 RabbitMQ 入門教程 消息發送模式實戰之發布訂閱模式

消息發送模式實戰之發布訂閱模式

1. 前言

Hello,大家好。在上一小節中,我們對 RabbitMQ 中的消息模式之直接模式和主題模式,做了基礎概念的回顧,以及對兩種不同的消息發送模式進行了代碼實操,讓同學們可以清楚地知道實際的代碼應該怎么編寫。

本小節將繼續介紹 RabbitMQ 中其他消息發送模式的代碼實操內容,同樣地,在正式介紹代碼實操部分內容之前,我們還是需要回顧一下,相應消息發送模式的基礎概念。

本節主要內容:

  • 發布訂閱模式基礎概念回顧;

  • 發布訂閱模式代碼實操。

2.發布訂閱模式基礎概念回顧

在之前的小節中,我們對發布訂閱模式做了詳細的介紹,現在讓我們來回顧一下我們對發布訂閱模式做過的一些基礎性的介紹。

定義:

發布訂閱模式,即生產者發布消息,消費者通過訂閱的方式來消費消息。

其實,發布訂閱模式的本質還是生產者生產消息,消費者從消息隊列中獲取消息并進行消費。

所謂的發布訂閱模式,只不過是給傳統的發送和接收起一個高大上的名字罷了,本質上仍熱是消息的生產和消費,只不過這種模式更像于發布和訂閱,因此得名發布訂閱模式。

描述:

在 RabbitMQ 的消息發送模式中,發布訂閱模式對應的只有一種實際的業務場景,我們把他稱為群發模式。

如上圖所示,此場景是發布訂閱模式中的一種,但是這種模式沒有任何存在意義,因為在這種模式下,生產者生產出一條消息之后,將消息直接發送到了交換機上,之后的流程就沒有了。

大家注意看,此時的交換機上沒有綁定任何消息隊列,所以,此時位于交換機上的消息將丟失,消費者無法拿到消息進行消費。這種模式場景并沒有任何實際意義,因為我們生產的消息無法被消費掉,我們的業務流程也就不能正常流轉。

接下來讓我們看看具有實際意義的發布訂閱模式:

生產者生產一條消息后,將消息首先發送到交換機上,交換機進行檢測,發現存在兩個隊列都綁定在自身上面,于是,將消息全部投遞到所綁定的隊列上面,最后再由消費者接收消息并消費。

發布訂閱模式的特點,就是一個生產者、一個交換機、多個隊列、多個消費者, 由于生產者生產出來的消息會發送到綁定在交換機上的所有隊列上,這種場景很類似于我們給很多人群發消息,所以,這種模式被叫做群發模式。

3 發布訂閱模式代碼實操

3.1 第一種業務場景

在上述發布訂閱消息發送模式中,我們介紹了發布訂閱模式的基礎概念,同時,引入了兩種發布訂閱模式的業務場景,并且對不同的業務場景做了基本的介紹,下面讓我們來看一下如何使用代碼來實現這兩種不同的業務場景。

實現代碼:

// 發布訂閱模式-第一種業務場景
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("192.168.0.1");
connectionFactory.setPort(5672);
connectionFactory.setUsername("guest");
connectionFactory.setPassword("guest");
Connection connection = connectionFactory.newConnection();
Channel channel = connection.createChannel();
channel.exchangeDeclare(EXCHANGE_NAME, "fanout");
channel.close();
connection.close();

代碼解釋:

第 1-5 行,我們使用了 RabbitMQ 的 ConnectionFactory 連接工廠,來初始化了一些獲取 RabbitMQ 連接的必要參數。

第 6 行,我們從 RabbitMQ 的連接工廠中,獲取到了一個 RabbitMQ Conneciton 連接實例。

第 7 行,我們通過 RabbitMQ 連接實例,創建了一個 channel 通道,為之后的消息通信提供媒介。

第 8 行,我們使用了 channel 通道中的 exchangeDeclare 方法,來為我們的 channel 通道綁定了一個 exchange 交換機。

由于在第一種業務場景中,我們不會在 exchange 交換機上綁定任何的消息隊列,所以在上述代碼中,我們看不到 channel 通道與 queue 消息隊列進行綁定的方法。

在此種業務場景下,當生產者生產出來消息之后,在將消息發布到我們的 exchange 交換機上,整個流程就結束了,沒有消費者可以拿到這一消息,所以,這種業務場景毫無意義。

最后,讓我們來看第二種業務場景。

3.2 第二種業務場景

我們來看主體模式的代碼實現:

實現代碼:

ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("192.168.0.1");
connectionFactory.setPort(5672);
connectionFactory.setUsername("guest");
connectionFactory.setPassword("guest");
Connection connection = connectionFactory.newConnection();
Channel channel = connection.createChannel();
channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "");
channel.basicConsume(QUEUE_NAME, false, consumer);
channel.close();
connection.close();

代碼解釋:

第 1-7 行,代碼和第一種業務場景相似,這里不再贅述。

第 8 行,我們使用 channel 的 queueBind 方法來將消息隊列和通道進行綁定,這里注意,我們并沒有為我們的消息隊列指定一個 Routing Key 值,如果這里指定了,就不是發布訂閱模式了。

第 9 行,我們使用 channel 的 basicConsume 方法,來獲取我們的消息,并對消息進行一個消費。

第 10-11 行,代碼和第一種業務場景相似,這里不再贅述。

通過上述代碼段,我們可以看到,我們在 channel 通道上,綁定了一個消息隊列,這樣我們的消息就可以被消費者進行消費了。

Tips:
1. 我們在實現發布訂閱模式的時候,在生產者端,我們需要將 exchange 交換機的類型,聲明為 fanout 類型,這種類型才是我們說的發布訂閱模式;
2. 發布訂閱模式更多的應用場景,是用在消息通知群發、批量傳送數據等業務場景,消息傳送效率還是很高的。

4. 小結

本小節為同學們詳細介紹了 RabbitMQ 消息發送模式之發布訂閱模式的代碼實操等內容,包括發布訂閱模式的基礎概念等內容的回顧,以及發布訂閱模式常見的兩種業務場景的代碼實現,兩種業務場景的不同之處及使用場景等內容,同學們需要理清代碼實現的思路和步驟。