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/n/283625.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝的头像小蓝
上一篇 2024-12-22 08:08
下一篇 2024-12-22 08:08

相关推荐

  • int类型变量的细节与注意事项

    本文将从 int 类型变量的定义、声明、初始化、范围、运算和类型转换等方面,对 int 类型变量进行详细阐述和讲解,帮助读者更好地掌握和应用 int 变量。 一、定义与声明 int…

    编程 2025-04-29
  • 使用vscode建立UML图的实践和技巧

    本文将重点介绍在使用vscode在软件开发中如何建立UML图,并且给出操作交互和技巧的指导。 一、概述 在软件开发中,UML图是必不可少的重要工具之一。它为软件架构和各种设计模式的…

    编程 2025-04-29
  • RabbitMQ和Yii2的消息队列应用

    本文将探讨RabbitMQ和Yii2之间的消息队列应用。从概念、安装和配置、使用实例等多个方面详细讲解,帮助读者了解和掌握RabbitMQ和Yii2的消息队列应用。 一、Rabbi…

    编程 2025-04-29
  • Python函数重载的使用方法和注意事项

    Python是一种动态语言,它的函数重载特性有些不同于静态语言,本文将会从使用方法、注意事项等多个方面详细阐述Python函数重载,帮助读者更好地应用Python函数重载。 一、基…

    编程 2025-04-28
  • Akka 设置邮箱大小的方法和注意事项

    为了保障系统的稳定性和可靠性,Akka 允许用户设置邮箱大小。本文将介绍如何在 Akka 中设置邮箱大小,并且提供一些注意事项,以帮助读者解决可能遇到的问题。 一、设置邮箱大小 A…

    编程 2025-04-28
  • 优秀周记1000字的撰写思路与技巧

    优秀周记是每个编程开发工程师记录自己工作生活的最佳方式之一。本篇文章将从周记的重要性、撰写思路、撰写技巧以及周记的示例代码等角度进行阐述。 一、周记的重要性 作为一名编程开发工程师…

    编程 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

发表回复

登录后才能评论