RabbitMQ 消息队列编程

安装与配置

安装 RabbitMQ

读者可以在 RabbitMQ 官方文档中找到完整的安装教程:Downloading and Installing RabbitMQ --- RabbitMQ

本文使用 Docker 的方式部署。

RabbitMQ 社区镜像列表:https://hub.docker.com/_/rabbitmq

创建目录用于映射存储卷:

复制代码
mkdir -p /opt/lib/rabbitmq

部署容器:

复制代码
docker run -itd --name rabbitmq -p 5672:5672 -p 15672:15672 \
-v /opt/lib/rabbitmq:/var/lib/rabbitmq \
rabbitmq:3.12.8-management

部署时占用两个端口。5672 是 MQ 通讯端口,15672 是 Management UI 工具端口。

打开 15672 端口,会进入 Web 登录页面,默认账号密码都是 guest。

关于 RabbitMQ Management UI 的使用方法,后续再介绍。

打开管理界面后会,在 Exchanges 菜单中,可以看到如下图表格。这些是默认的交换器。现在可以不需要了解这些东西,后面会有介绍。

Virtual host Name Type Features
/ (AMQP default) direct D
/ amq.direct direct D
/ amq.fanout fanout D
/ amq.headers headers D
/ amq.match headers D
/ amq.rabbitmq.trace topic D I
/ amq.topic topic D

发布与订阅模型

使用 C# 开发 RabbitMQ,需要使用 nuget 引入 RabbitMQ.Client,官网文档地址:.NET/C# RabbitMQ Client Library --- RabbitMQ

在继续阅读文章之前,请先创建一个控制台程序。

生产者、消费者、交换器、队列

为了便于理解,本文制作了几十张图片,约定一些图形表示的含义:

对应生产者,使用如下图表示:

对于消费者,使用如下图表示:

对于消息队列,使用如下图表示:

对于交换器,使用如下图表示:

在 RabbitMQ 中,生产者发布的消息是不会直接进入到队列中,而是经过交换器(Exchange) 分发到各个队列中。前面提到,部署 RabbitMQ 后,默认有 七个交换器,如 (AMQP default)amq.direct 等。

当然,对于现在来说,我们不需要了解交换器,所以,在本节的教程中,会使用默认交换器完成实验。

忽略交换器存在的情况下,我们可以将生产和消费的流程简化如下图所示:

请一定要注意,图中省略了交换器的存在,因为使用的是默认的交换器。但是生产者推送消息必须是推送到交换器,而不是队列,这一句一定要弄清楚。

对于消费者来说,要使用队列,必须确保队列已经存在。

复制代码
ConnectionFactory factory = new ConnectionFactory
{
	HostName = "localhost"
};

// 连接
using IConnection connection = factory.CreateConnection();

// 通道
using IModel channel = connection.CreateModel();

channel.QueueDeclare(
	// 队列名称
	queue: "myqueue",

	// 持久化配置,队列是否能够在 broker 重启后存活
	durable: false,

	// 连接关闭时被删除该队列
	exclusive: false,

	// 当最后一个消费者(如果有的话)退订时,是否应该自动删除这个队列
	autoDelete: false,

	// 额外的参数配置
	arguments: null
	);

编写一个消费者,消费该队列中的消息,其完整代码如下:

复制代码
using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System.Text;

ConnectionFactory factory = new ConnectionFactory
{
	HostName = "localhost"
};

using IConnection connection = factory.CreateConnection();
using IModel channel = connection.CreateModel();

channel.QueueDeclare(
	// 队列名称
	queue: "myqueue",

	// 持久化配置,队列是否能够在 broker 重启后存活
	durable: false,

	// 连接关闭时被删除该队列
	exclusive: false,

	// 当最后一个消费者(如果有的话)退订时,是否应该自动删除这个队列
	autoDelete: false,

	// 额外的参数配置
	arguments: null
	);

// 定义消费者
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
	var message = Encoding.UTF8.GetString(ea.Body.Span);
	Console.WriteLine($" [x] Received {message}");
};

// 开始消费
channel.BasicConsume(queue: "myqueue",
					 autoAck: true,
					 consumer: consumer);

Console.ReadLine();
相关推荐
小熊美家熊猫系统7 小时前
电子合同技术实现与合规实践
java·开发语言·分布式
齐穗穗7 小时前
Windows下安装rabbitmq
rabbitmq
AI 小老六9 小时前
Google AX 控制面拆解:分布式 Agent 如何把断点恢复、审计策略和执行调度收进同一条链路
人工智能·分布式·后端·ai·架构·ai编程
functionflux10 小时前
kafka-python:Python 生态中最成熟的 Kafka 客户端
分布式·python·其他·kafka
kyle~14 小时前
DDS分布式实时系统---自省机制
开发语言·分布式·机器人·c#·接口·ros2
q210306337215 小时前
kafka启动几秒后挂了,重启多次无果
分布式·kafka
凯源智能15 小时前
工商业分布式光伏箱变智能监控落地实战
分布式·箱变测控·光伏箱变测控装置·箱变监控系统·箱式变测控装置
沂水弦音15 小时前
软控 EI 系列模块优势与竞品对比分析:面向 EtherCAT 分布式 I/O 的工程选型视角
分布式·制造·工业自动化·ethercat·io模块
木心术116 小时前
在NVIDIA DGX Spark上部署NemoClaw的实际操作方案以及实际应用便利性。
大数据·分布式·spark
kuokay16 小时前
MLOps 与 AIOps 的核心概
人工智能·分布式·大模型·agent·llama