RabbitMQ工作原理的技巧與注意事項

一、RabbitMQ的基本概念

在學習RabbitMQ之前,必須理解RabbitMQ的基本概念及其作用。RabbitMQ是一個開源的消息隊列系統,用於快速、可靠地處理存儲和轉發消息。它基於AMQP(高級消息隊列協議)開發,提供了許多高級特性,如消息持久性、發佈/訂閱模式和自動健康監測等。

// RabbitMQ基本操作示例代碼
using RabbitMQ.Client;
using System.Text;

// 生產者,發佈消息
IModel channel = connection.CreateModel();
channel.BasicPublish(exchange: "", routingKey: "hello", body: Encoding.UTF8.GetBytes("Hello World!"));

// 消費者,接收消息
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
  byte[] messageBodyBytes = ea.Body.ToArray();
  string message = Encoding.UTF8.GetString(messageBodyBytes);
  Console.WriteLine("Received {0}", message);
};
channel.BasicConsume(queue: "hello", autoAck: true, consumer: consumer);

上面的代碼示例展示了如何在生產者端發送消息,並在消費者端接收消息。其中,生產者通過BasicPublish()方法來發佈消息,消費者則通過BasicConsume()方法來訂閱消息。另外,RabbitMQ還支持交換機(exchange)機制,用於在隊列之間進行消息路由。

二、交換機的類型

RabbitMQ支持四種類型的交換機:direct、fanout、topic和headers。它們分別對應着不同的消息路由策略。其中,direct模式是最簡單的模式,它會將消息路由到與routing key完全匹配的隊列中。而fanout模式則是廣播模式,它會將消息路由到所有綁定到該交換機上的隊列中。topic模式則是按照正則表達式匹配規則來路由消息,而headers則是通過消息頭中的鍵值對來路由消息。

// Direct模式示例代碼
// 生產者,發佈消息
channel.ExchangeDeclare(exchange: "direct_logs", type: ExchangeType.Direct);

var severity = (args.Length > 0) ? args[0] : "info";
var message = (args.Length > 1) ? string.Join(" ", args.Skip(1).ToArray()) : "Hello World!";
var body = Encoding.UTF8.GetBytes(message);

channel.BasicPublish(exchange: "direct_logs", routingKey: severity, basicProperties: null, body: body);

// 消費者,接收消息
channel.ExchangeDeclare(exchange: "direct_logs", type: ExchangeType.Direct);
var queueName = channel.QueueDeclare().QueueName;

foreach (var severity in args)
{
    channel.QueueBind(queue: queueName, exchange: "direct_logs", routingKey: severity);
}

var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
    var body = ea.Body.ToArray();
    var message = Encoding.UTF8.GetString(body);
    var routingKey = ea.RoutingKey;
    Console.WriteLine(" [x] Received '{0}':'{1}'", routingKey, message);
};

channel.BasicConsume(queue: queueName, autoAck: true, consumer: consumer);

上面的代碼示例演示了如何使用direct模式來發送和接收消息。其中,生產者通過ExchangeDeclare()方法來聲明交換機,通過BasicPublish()方法來發佈消息。消費者則通過QueueDeclare()方法來創建隊列,通過QueueBind()方法來綁定隊列和交換機,然後通過BasicConsume()方法來訂閱消息。

三、消息的持久化

當RabbitMQ服務器關閉或者崩潰時,所有未被處理的消息都會丟失,這是非常危險的。為了避免這種情況的發生,我們可以將消息設置為持久化。當消息被設置為持久化時,RabbitMQ會將消息寫入到硬盤中,這樣即使服務器崩潰,消息也可以被恢復。

// 持久化示例代碼
// 生產者,發佈持久化消息
channel.ExchangeDeclare(exchange: "logs", type: ExchangeType.Fanout);
var properties = channel.CreateBasicProperties();
properties.Persistent = true;
var message = GetMessage(args);
var body = Encoding.UTF8.GetBytes(message);
channel.BasicPublish(exchange: "logs", routingKey: "", basicProperties: properties, body: body);

// 消費者,接收持久化消息
channel.QueueDeclare(queue: queueName, durable: true, exclusive: false, autoDelete: false, arguments: null);
channel.BasicQos(prefetchSize: 0, prefetchCount: 1, global: false);
var consumer = new EventingBasicConsumer(channel);
channel.BasicConsume(queue: queueName, autoAck: false, consumer: consumer);

consumer.Received += (model, ea) =>
{
    var body = ea.Body.ToArray();
    var message = Encoding.UTF8.GetString(body);
    Console.WriteLine(" [x] Received {0}", message);

    int dots = message.Split('.').Length - 1;
    Thread.Sleep(dots * 1000);

    Console.WriteLine(" [x] Done");

    channel.BasicAck(deliveryTag: ea.DeliveryTag, multiple: false);
};

上面的代碼示例演示了如何將消息設置為持久化。在生產者端,我們通過設置properties的Persistent屬性來將消息設置為持久化消息。而在消費者端,則需要在QueueDeclare()方法中設置durable為true來聲明隊列為持久化隊列。此外,在處理完一條消息後,需要使用BasicAck()方法來確認消息已經被消費。

四、RabbitMQ的高可用性

RabbitMQ支持多個節點之間的集群,從而提高了消息隊列的高可用性。在RabbitMQ集群中,每個節點都具有相同的角色,並且它們之間可以共享相同的隊列和交換機。當其中一個節點崩潰時,其他節點會自動接管它的任務,從而保證了消息隊列的可靠性。

// RabbitMQ集群示例代碼
// 創建RabbitMQ連接
var factory = new ConnectionFactory() { HostName = "localhost", UserName = "guest", Password = "guest", Port = 5672, VirtualHost = "/" };
var connection = factory.CreateConnection();

// 創建Model
var channel = connection.CreateModel();

// 聲明Exchange,Queue,並綁定。其中,Queue需要設置為exclusive=false,以支持多個消費者。
channel.ExchangeDeclare(exchange: "logs", type: ExchangeType.Fanout);
var queueName = channel.QueueDeclare().QueueName;
channel.QueueBind(queue: queueName, exchange: "logs", routingKey: "");

// 創建消費者,用於消費消息
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
    var body = ea.Body.ToArray();
    var message = Encoding.UTF8.GetString(body);
    Console.WriteLine(" [x] Received {0}", message);
};
channel.BasicConsume(queue: queueName, autoAck: true, consumer: consumer);

上面的代碼示例展示了如何在RabbitMQ集群中創建Exchange、Queue並進行綁定。其中,生產者和消費者都應該連接到集群中的某一個節點進行消息傳遞。

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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-22 08:08
下一篇 2024-12-22 08:08

相關推薦

  • 使用vscode建立UML圖的實踐和技巧

    本文將重點介紹在使用vscode在軟件開發中如何建立UML圖,並且給出操作交互和技巧的指導。 一、概述 在軟件開發中,UML圖是必不可少的重要工具之一。它為軟件架構和各種設計模式的…

    編程 2025-04-29
  • int類型變量的細節與注意事項

    本文將從 int 類型變量的定義、聲明、初始化、範圍、運算和類型轉換等方面,對 int 類型變量進行詳細闡述和講解,幫助讀者更好地掌握和應用 int 變量。 一、定義與聲明 int…

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

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

    編程 2025-04-29
  • 優秀周記1000字的撰寫思路與技巧

    優秀周記是每個編程開發工程師記錄自己工作生活的最佳方式之一。本篇文章將從周記的重要性、撰寫思路、撰寫技巧以及周記的示例代碼等角度進行闡述。 一、周記的重要性 作為一名編程開發工程師…

    編程 2025-04-28
  • Akka 設置郵箱大小的方法和注意事項

    為了保障系統的穩定性和可靠性,Akka 允許用戶設置郵箱大小。本文將介紹如何在 Akka 中設置郵箱大小,並且提供一些注意事項,以幫助讀者解決可能遇到的問題。 一、設置郵箱大小 A…

    編程 2025-04-28
  • Python函數重載的使用方法和注意事項

    Python是一種動態語言,它的函數重載特性有些不同於靜態語言,本文將會從使用方法、注意事項等多個方面詳細闡述Python函數重載,幫助讀者更好地應用Python函數重載。 一、基…

    編程 2025-04-28
  • pythonpass函數的使用及相關注意事項

    python中,pass語句是一個空語句,什麼也不做,只是一個佔位符,通常被用於等待代碼的實現或者暫時跳過執行。在函數中,pass語句的作用是佔位符,用於創建函數的框架,等待具體的…

    編程 2025-04-28
  • Python同步賦值語句的使用方法和注意事項

    Python同步賦值語句是Python中用來同時為多個變量賦值的一種方法。通過這種方式,可以很方便地同時為多個變量賦值,從而提高代碼的可讀性和編寫效率。下面從多個方面詳細介紹Pyt…

    編程 2025-04-28
  • 堆疊圖配色技巧分享

    堆疊圖是數據可視化中常用的一種表現形式,而配色則是影響堆疊圖觀感和傳達信息的重要因素之一。本文將分享一些堆疊圖配色的技巧,幫助你創造更好的數據可視化。 一、色彩搭配原則 色彩是我們…

    編程 2025-04-27
  • 使用uring_cmd提高開發效率的技巧

    對於編程開發工程師來說,提高效率一直是致力追求的目標。本文將深度解析如何使用uring_cmd,提升工作效率。 一、常用命令 uring_cmd是一個非常強大的命令行工具,但是大部…

    編程 2025-04-27

發表回復

登錄後才能評論