RabbitMQ五種消息模型詳解

一、rabbitmq五種消息模型簡介

RabbitMQ是一個開源的消息隊列中間件,支持多種消息傳輸模式,如發布/訂閱、路由、工作隊列、RPC等。在消息傳輸過程中,RabbitMQ將消息存儲在隊列中並轉發給接收方。

RabbitMQ的五種常用消息模型包括:簡單隊列模型、工作隊列模型、發布/訂閱模型、路由模型、主題模型。

二、rabbitmq五種消息模型應用場景

1、簡單隊列模型

應用場景:適用於只有一個消費者的場景,通常用於解耦和最終目標是將消息發布到集體中。

<!-- rabbitmq 生產者 -->
using (var connection = factory.CreateConnection())
using (var channel = connection.CreateModel())
{
    channel.QueueDeclare(queueName, false, false, false, null);
    string message = "hello rabbitmq";
    var body = Encoding.UTF8.GetBytes(message);
 
    channel.BasicPublish("", queueName, null, body);
    Console.WriteLine("Send Message:{0}", message);
}
<!-- rabbitmq 消費者 -->
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
    var body = ea.Body;
    var message = Encoding.UTF8.GetString(body);
    Console.WriteLine("Received message: {0}", message);
    channel.BasicAck(ea.DeliveryTag, false);
};
channel.BasicConsume(queueName, false, consumer);

2、工作隊列模型

應用場景:適用於多個消費者的場景,任務可以平均地在多個消費者之間分配執行。

<!-- rabbitmq 生產者 -->
using (var connection = factory.CreateConnection())
using (var channel = connection.CreateModel())
{
    channel.QueueDeclare(queueName, true, false, false, null);
    string message = "hello workQueue";
    var body = Encoding.UTF8.GetBytes(message);
    var properties = channel.CreateBasicProperties();
    properties.Persistent = true;
    channel.BasicPublish("", queueName, properties, body);
    Console.WriteLine("Send Message:{0}", message);
}
<!-- rabbitmq 消費者1 -->
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
    var body = ea.Body;
    var message = Encoding.UTF8.GetString(body);
    Console.WriteLine("Received message: {0}", message);
    channel.BasicAck(ea.DeliveryTag, false);
};
channel.BasicConsume(queueName, false, consumer);

發送1000條消息,使用兩個消費者消費:

3、發布/訂閱模型

應用場景:適用於多個消費者需要接收同一個消息的場景。

<!-- rabbitmq 生產者 -->
using (var connection = factory.CreateConnection())
using (var channel = connection.CreateModel())
{
    channel.ExchangeDeclare(exchangeName, ExchangeType.Fanout);
    string message = "hello fanout";
    var body = Encoding.UTF8.GetBytes(message);
    channel.BasicPublish(exchangeName, "", null, body);
 
    Console.WriteLine("Send Message:{0}", message);
}
<!-- rabbitmq 消費者1 -->
channel.ExchangeDeclare(exchangeName, ExchangeType.Fanout);
var queueName = channel.QueueDeclare().QueueName;
channel.QueueBind(queueName, exchangeName, "");
 
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
    var body = ea.Body;
    var message = Encoding.UTF8.GetString(body);
    Console.WriteLine("Received message: {0}", message);
};
channel.BasicConsume(queueName, true, consumer);

啟動兩個消費者監聽同一個隊列:

4、路由模型

應用場景:適用於多個消費者根據不同的條件接收不同的消息。

<!-- rabbitmq 生產者 -->
using (var connection = factory.CreateConnection())
using (var channel = connection.CreateModel())
{
    channel.ExchangeDeclare(exchangeName, ExchangeType.Direct);
    string message = "hello direct";
    var routingKey = "error";
    var body = Encoding.UTF8.GetBytes(message);
    channel.BasicPublish(exchangeName, routingKey, null, body);
 
    Console.WriteLine("Send Message:{0}", message);
}
<!-- rabbitmq 消費者1 -->
var queueName = channel.QueueDeclare().QueueName;
var routingKey = "error";
channel.QueueBind(queueName, exchangeName, routingKey);
 
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
    var body = ea.Body;
    var message = Encoding.UTF8.GetString(body);
    Console.WriteLine("Received message: {0}", message);
};
channel.BasicConsume(queueName, true, consumer);

5、主題模型

應用場景:適用於多個消費者通過實現通配符功能接收指定消息。

<!-- rabbitmq 生產者 -->
using (var connection = factory.CreateConnection())
using (var channel = connection.CreateModel())
{
    channel.ExchangeDeclare(exchangeName, ExchangeType.Topic);
    string message = "hello topic1";
    var routingKey = "usa.news";
    var body = Encoding.UTF8.GetBytes(message);
    channel.BasicPublish(exchangeName, routingKey, null, body);
 
    Console.WriteLine("Send Message:{0}", message);
}
<!-- rabbitmq 消費者1 -->
var queueName = channel.QueueDeclare().QueueName;
var routingKey = "usa.#";
channel.QueueBind(queueName, exchangeName, routingKey);
 
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
    var body = ea.Body;
    var message = Encoding.UTF8.GetString(body);
    Console.WriteLine("Received message: {0}", message);
};
channel.BasicConsume(queueName, true, consumer);

三、rabbitmq五種消息模型常用

1、c#

RabbitMQ的C#客戶端,使用簡單方便。以下是使用C#發送消息和消費消息的代碼示例:

<!-- rabbitmq 生產者 -->
using (var connection = factory.CreateConnection())
using (var channel = connection.CreateModel())
{
    channel.QueueDeclare(queueName, false, false, false, null);
    string message = "hello rabbitmq";
    var body = Encoding.UTF8.GetBytes(message);
 
    channel.BasicPublish("", queueName, null, body);
    Console.WriteLine("Send Message:{0}", message);
}
<!-- rabbitmq 消費者 -->
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
    var body = ea.Body;
    var message = Encoding.UTF8.GetString(body);
    Console.WriteLine("Received message: {0}", message);
    channel.BasicAck(ea.DeliveryTag, false);
};
channel.BasicConsume(queueName, false, consumer);

2、rabbitmq的五種消息模型

簡單隊列模型、工作隊列模型、發布/訂閱模型、路由模型、主題模型。

3、rabbitmq消息隊列5種模式

簡單隊列模型、工作隊列模型、發布/訂閱模型、路由模型、主題模型。

4、rabbitmq消息隊列原理

RabbitMQ採用AMQP協議實現,AMQP是Advanced Message Queuing Protocol的縮寫,它是一個公開的、通用的、可編程的消息傳遞協議。它的目的是為面向消息的中間件設計一個標準的應用層傳輸協議,以便於不同的消息中間件系統可以相互操作。

RabbitMQ基於AMQP1.0協議、Erlang實現,提供了高可靠性、高擴展性、高可用性、高並發性和高性能的消息中間件功能。

5、rabbitmq的四種交換機模式

Direct、Topic、Fanout、Header。

例如,使用Direct交換機模式發送消息:

<!-- rabbitmq 生產者 -->
using (var connection = factory.CreateConnection())
using (var channel = connection.CreateModel())
{
    channel.ExchangeDeclare(exchangeName, ExchangeType.Direct);
    string message = "hello direct";
    var routingKey = "error";
    var body = Encoding.UTF8.GetBytes(message);
    channel.BasicPublish(exchangeName, routingKey, null, body);
 
    Console.WriteLine("Send Message:{0}", message);
}

使用Direct交換機模式消費消息:

<!-- rabbitmq 消費者 -->
var queueName = channel.QueueDeclare().QueueName;
var routingKey = "error";
channel.QueueBind(queueName, exchangeName, routingKey);
 
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
    var body = ea.Body;
    var message = Encoding.UTF8.GetString(body);
    Console.WriteLine("Received message: {0}", message);
};
channel.BasicConsume(queueName, true, consumer);

四、rabbitmq使用場景

RabbitMQ可以應用於高並發、高可用、解耦系統的消息中間件。以下是RabbitMQ的常見應用場景:

1、任務異步處理:RabbitMQ能夠異步處理任務,從而提升網站性能;

2、應用解耦:RabbitMQ可以用於應用系統間的解耦;

3、數據同步:RabbitMQ能夠將數據同步到多個系統,保證數據的準確性;

4、消息通知:RabbitMQ可以作為消息通知的工具;

5、數據分析:RabbitMQ可以較好地應用於大數據分析的場景。

五、rabbitmq消息模型選取

在選擇消息模型時,需要考慮以下因素:

1、消息的類型和特性;

2、消息的生命周期和傳輸效率;

3、消息的可靠性和冪等性。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/307239.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2025-01-02 18:06
下一篇 2025-01-02 18:06

相關推薦

  • TensorFlow Serving Java:實現開發全功能的模型服務

    TensorFlow Serving Java是作為TensorFlow Serving的Java API,可以輕鬆地將基於TensorFlow模型的服務集成到Java應用程序中。…

    編程 2025-04-29
  • Python訓練模型後如何投入應用

    Python已成為機器學習和深度學習領域中熱門的編程語言之一,在訓練完模型後如何將其投入應用中,是一個重要問題。本文將從多個方面為大家詳細闡述。 一、模型持久化 在應用中使用訓練好…

    編程 2025-04-29
  • RabbitMQ和Yii2的消息隊列應用

    本文將探討RabbitMQ和Yii2之間的消息隊列應用。從概念、安裝和配置、使用實例等多個方面詳細講解,幫助讀者了解和掌握RabbitMQ和Yii2的消息隊列應用。 一、Rabbi…

    編程 2025-04-29
  • ARIMA模型Python應用用法介紹

    ARIMA(自回歸移動平均模型)是一種時序分析常用的模型,廣泛應用於股票、經濟等領域。本文將從多個方面詳細闡述ARIMA模型的Python實現方式。 一、ARIMA模型是什麼? A…

    編程 2025-04-29
  • Python實現一元線性回歸模型

    本文將從多個方面詳細闡述Python實現一元線性回歸模型的代碼。如果你對線性回歸模型有一些了解,對Python語言也有所掌握,那麼本文將對你有所幫助。在開始介紹具體代碼前,讓我們先…

    編程 2025-04-29
  • VAR模型是用來幹嘛

    VAR(向量自回歸)模型是一種經濟學中的統計模型,用於分析並預測多個變量之間的關係。 一、多變量時間序列分析 VAR模型可以對多個變量的時間序列數據進行分析和建模,通過對變量之間的…

    編程 2025-04-28
  • 如何使用Weka下載模型?

    本文主要介紹如何使用Weka工具下載保存本地機器學習模型。 一、在Weka Explorer中下載模型 在Weka Explorer中選擇需要的分類器(Classifier),使用…

    編程 2025-04-28
  • ROS線程發布消息異常解決方法

    針對ROS線程發布消息異常問題,我們可以從以下幾個方面進行分析和解決。 一、檢查ROS代碼是否正確 首先,我們需要檢查ROS代碼是否正確。可能會出現的問題包括: 是否正確初始化RO…

    編程 2025-04-28
  • 使用Python發送微信消息給別人

    問題:如何使用Python發送微信消息給別人? 一、配置微信開發者平台 首先,要想發送微信消息,需要在微信開發者平台中進行配置,來獲取對應的授權信息。具體步驟如下: 1、登錄微信公…

    編程 2025-04-28
  • Python實現BP神經網絡預測模型

    BP神經網絡在許多領域都有着廣泛的應用,如數據挖掘、預測分析等等。而Python的科學計算庫和機器學習庫也提供了很多的方法來實現BP神經網絡的構建和使用,本篇文章將詳細介紹在Pyt…

    編程 2025-04-28

發表回復

登錄後才能評論