LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

C# RabbitMQ详解:从基础到实战的消息队列实现与应用

admin
2025年9月19日 14:36 本文热度 163

前言

RabbitMQ 是一个流行的开源消息中间件,它基于 AMQP(高级消息队列协议)实现,广泛用于分布式系统中异步消息传递、解耦服务之间的通信、提高系统的可伸缩性和可靠性。RabbitMQ 是一种消息代理,负责接收、存储并转发消息,它支持多种协议、可靠性机制以及多种客户端语言,包括 C#。

在本篇文章中,我们将深入探讨如何在 C# 中使用 RabbitMQ,介绍其基本概念、核心特性以及实际操作。

1. 安装 RabbitMQ

1.1 本地安装 RabbitMQ

首先,确保你已经安装了 RabbitMQ。你可以从 RabbitMQ 官网下载并安装。RabbitMQ 依赖 Erlang,因此在安装 RabbitMQ 前需要先安装 Erlang。

安装完成后,RabbitMQ 会自动启动,管理界面默认运行在 http://localhost:15672,用户名和密码均为 guest


1.2 安装 C# 客户端库

在 C# 项目中使用 RabbitMQ,通常会使用 RabbitMQ.Client 包。你可以通过 NuGet 安装:

Install-Package RabbitMQ.Client

或者直接搜索



2. 基本概念

RabbitMQ 中有几个核心概念,理解这些概念对你使用 RabbitMQ 非常重要:

  • Producer(生产者)
    :发送消息到消息队列的客户端。
  • Consumer(消费者)
    :从消息队列中接收消息的客户端。
  • Queue(队列)
    :消息存储的地方,消费者从队列中获取消息。
  • Exchange(交换机)
    :决定消息如何路由到队列的规则,RabbitMQ 支持四种交换机类型:directtopicfanoutheaders
  • Binding(绑定)
    :交换机与队列之间的关联。
  • Routing Key(路由键)
    :路由消息的键,用来匹配交换机的路由规则。


3. C# 实现 RabbitMQ 消息队列

3.1 发送消息(生产者)

以下代码演示了如何创建一个简单的生产者,它将消息发送到一个队列中:

using RabbitMQ.Client;using System;using System.Text;class Producer{    static void Main(string[] args)    {        // 创建一个连接工厂        var factory = new ConnectionFactory() { HostName = "localhost" };        using (var connection = factory.CreateConnection())        using (var channel = connection.CreateModel())        {            // 声明一个队列            channel.QueueDeclare(queue: "hello",                                 durable: false// 消息队列是否持久化                                 exclusive: false// 队列是否只在连接时存在                                 autoDelete: false// 队列用完后是否自动删除                                 arguments: null);            string message = "Hello, RabbitMQ!";            var body = Encoding.UTF8.GetBytes(message);            // 发送消息到队列            channel.BasicPublish(exchange: "",                                 routingKey: "hello",  // 路由键                                 basicProperties: null,                                 body: body);            Console.WriteLine(" [x] Sent {0}", message);        }        Console.WriteLine(" Press [enter] to exit.");        Console.ReadLine();    }}

3.2 接收消息(消费者)

接下来,我们编写一个简单的消费者,它将从队列中接收并处理消息:

using RabbitMQ.Client;using RabbitMQ.Client.Events;using System;using System.Text;class Consumer{    static void Main(string[] args)    {        // 创建一个连接工厂        var factory = new ConnectionFactory() { HostName = "localhost" };        using (var connection = factory.CreateConnection())        using (var channel = connection.CreateModel())        {            // 声明一个队列            channel.QueueDeclare(queue: "hello",                                 durable: false,                                 exclusive: false,                                 autoDelete: false,                                 arguments: null);            Console.WriteLine(" [*] Waiting for messages. To exit press [Ctrl+C]");            // 创建一个消费者            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: "hello",                                 autoAck: true// 自动确认消息                                 consumer: consumer);            Console.ReadLine();        }    }}

3.3 运行示例

  1. 启动生产者
    :运行 Producer 程序,生产者将消息发送到 RabbitMQ 队列。
  2. 启动消费者
    :运行 Consumer 程序,消费者将从队列中接收并处理消息。


4. 高级特性

4.1 消息确认(Message Acknowledgment)

默认情况下,RabbitMQ 会在消费者接收到消息后自动确认。但是,在某些情况下,你可能希望显式确认消息,以确保消息已被成功处理。

channel.BasicConsume(queue"您好《编程光年》",                     autoAckfalse, // 设置为 false 手动确认                     consumer: consumer);
consumer.Received += (model, ea) =>{    var body = ea.Body.ToArray();    var message = Encoding.UTF8.GetString(body);    Console.WriteLine(" [x] Received {0}", message);
    // 手动确认消息    channel.BasicAck(deliveryTag: ea.DeliveryTag, multiplefalse);};


4.2 消息持久化

如果你希望消息在 RabbitMQ 重启后不丢失,可以设置消息持久化:

channel.QueueDeclare(queue"您好《编程光年》",                     durabletrue, // 消息队列持久化                     exclusivefalse,                     autoDeletefalse,                     argumentsnull);
channel.BasicPublish(exchange"",                     routingKey"hello",                     basicPropertiesnew BasicProperties { DeliveryMode = 2 }, // 消息持久化                     body: body);


4.3 发布/订阅模式(Fanout Exchange)

RabbitMQ 支持多种交换机类型,fanout 交换机会将消息广播到所有绑定的队列,适合实现发布/订阅模式。

channel.ExchangeDeclare(exchange"logs", type: ExchangeType.Fanout);
channel.BasicPublish(exchange"logs",                     routingKey"",                     basicPropertiesnull,                     body: Encoding.UTF8.GetBytes("Hello World!"));



总结

RabbitMQ 是一种强大的消息中间件,广泛应用于分布式系统中异步消息传递。通过它,你可以实现系统解耦、提高可伸缩性、保证消息的可靠传递。使用 C# 与 RabbitMQ 客户端,你可以轻松构建高效的消息队列系统。

  • 生产者
    :发送消息到队列。
  • 消费者
    :从队列中接收并处理消息。
  • 消息确认与持久化
    :保证消息的可靠性和不丢失。
  • 交换机与路由
    :根据路由规则将消息分发到不同的队列。

希望这篇文章能帮助你更好地理解和使用 RabbitMQ。


该文章在 2025/9/20 11:18:12 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2025 ClickSun All Rights Reserved