浅谈C# RabbitMQ

一、基本介绍

RabbitMQ------Rabbit Message Queue的简写,但不能仅仅理解其为消息队列,消息代理更合适。

RabbitMQ 是一个由 Erlang 语言开发的AMQP(高级消息队列协议)的开源实现,其内部结构如下:

RabbitMQ作为一个消息代理,主要和消息打交道,负责接收并转发消息。

RabbitMQ提供了可靠的消息机制、跟踪机制和灵活的消息路由,支持消息集群和分布式部署。

适用于排队算法、秒杀活动、消息分发、异步处理、数据同步、处理耗时任务、CQRS等应用场景。

下面我们就来学习下RabbitMQ。

二、简单应用

在C#中使用RabbitMQ通常涉及到RabbitMQ.Client这个库,它是RabbitMQ的官方.NET客户端,允许开发者通过C#代码与RabbitMQ服务器进行交互。以下是一些基本的代码示例,展示了如何在C#应用程序中使用RabbitMQ。

1. 创建ConnectionFactory和Connection

cs 复制代码
using RabbitMQ.Client;
using RabbitMQ.Client.Events;

var factory = new ConnectionFactory() { HostName = "localhost" };
using(var connection = factory.CreateConnection())
{
    // 后续操作
}

2. 创建Channel

cs 复制代码
using(var channel = connection.CreateModel())
{
    // 使用channel进行队列声明、消息发布等操作
}

3. 声明队列

cs 复制代码
channel.QueueDeclare(queue: "myqueue",
                     durable: false, // 队列是否持久化
                     exclusive: false, // 是否排他
                     autoDelete: false, // 无消费者时是否自动删除
                     arguments: null);

4. 发布消息

cs 复制代码
string message = "Hello World!";
var body = Encoding.UTF8.GetBytes(message);
channel.BasicPublish(exchange: "",
                     routingKey: "myqueue", // 队列名作为路由键
                     basicProperties: null,
                     body: body);

5. 订阅消息

cs 复制代码
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
    var body = ea.Body.ToArray();
    var receivedMessage = Encoding.UTF8.GetString(body);
    Console.WriteLine($"Received: {receivedMessage}");
    // 确认消息
    channel.BasicAck(ea.DeliveryTag, false);
};

channel.BasicConsume(queue: "myqueue",
                     autoAck: false,
                     consumer: consumer);

6. 消息确认

在消费者中,可以通过调用BasicAck方法来手动确认消息,告知RabbitMQ消息已被成功处理。

7. 异常处理

在使用RabbitMQ时,需要考虑异常处理机制,确保在出现网络问题或其他异常时,能够正确地关闭连接和通道。

8. 连接和通道的关闭

使用完连接和通道后,应该关闭它们以释放资源。

cs 复制代码
channel.Close();
connection.Close();

在实际应用中,可能还需要考虑更复杂的场景,比如消息的持久化、事务、发送方确认机制、消费者取消订阅等。以上代码提供了在C#中使用RabbitMQ的基本框架,可以根据具体需求进行扩展和优化。

相关推荐
Java程序之猿1 小时前
微服务分布式(一、项目初始化)
分布式·微服务·架构
来一杯龙舌兰2 小时前
【RabbitMQ】RabbitMQ保证消息不丢失的N种策略的思想总结
分布式·rabbitmq·ruby·持久化·ack·消息确认
向宇it2 小时前
【从零开始入门unity游戏开发之——C#篇25】C#面向对象动态多态——virtual、override 和 base 关键字、抽象类和抽象方法
java·开发语言·unity·c#·游戏引擎
节点。csn3 小时前
Hadoop yarn安装
大数据·hadoop·分布式
向宇it4 小时前
【从零开始入门unity游戏开发之——C#篇24】C#面向对象继承——万物之父(object)、装箱和拆箱、sealed 密封类
java·开发语言·unity·c#·游戏引擎
NiNg_1_2345 小时前
基于Hadoop的数据清洗
大数据·hadoop·分布式
隔着天花板看星星6 小时前
Spark-Streaming集成Kafka
大数据·分布式·中间件·spark·kafka
坐井观老天8 小时前
在C#中使用资源保存图像和文本和其他数据并在运行时加载
开发语言·c#
技术路上的苦行僧10 小时前
分布式专题(8)之MongoDB存储原理&多文档事务详解
数据库·分布式·mongodb
龙哥·三年风水10 小时前
workman服务端开发模式-应用开发-后端api推送修改二
分布式·gateway·php