RabbitMQ详解
RabbitMQ详解
什么是RabbitMQ
使用Erlang语言开发的开源消息队列系统,基于AMQP协议来实现。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。AMQP协议更多用在企业系统内对数据一致性、稳定性和可靠性要求很高的场景,对性能和吞吐量的要求还在其次。
AMQP,即Advanced Message Queuing Protocol(高级消息队列协议),一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计,基于此协议的客户端与消息中间件传递消息,不受客户端/中间件不同产品、不同开发语言等条件的限制
RabbitMQ比Kafka可靠,Kafka更适合IO高吞吐的处理,一般应用在大数据日志处理或对实时性(少量延迟),可靠性(少量丢数据)要求稍低的场景使用,比如ELK日志收集。
RabbitMQ能做什么
RabbitMQ可以帮助开发者构建可靠、高效、可扩展的分布式系统,实现异步通信、任务分发和事件驱动等功能。它被广泛应用于各种场景,包括微服务架构、消息驱动的架构、实时数据处理等。
RabbitMQ核心组件
具体:
RabbitMQ工作机制
生产者
消息的创建者,负责创建和推送消息到消息服务器
消费者
消息的接收方,接受消息并处理消息
消息服务器
RabbitMQ本身,不会产生和消费消息,相当于一个中转站,将生产者的消息路由给消费者
RabbitMQ角色
ConnectionFactory
接管理,应用程序或消费方与RabbitMQ建立连接的管理器
Channel
信道,推送消息的通道
Exchange
交换机,用于接收分配消息到队列中
Queue
保存消息
Routingkey
消息会携带routingKey,决定消息最终的队列
BindingKey
Queue通过bindingKey与交换机绑定
安装
【Windows安装RabbitMQ详细教程】_rabbitmq安装教程_慕之寒的博客-CSDN博客
RabbitMQ控制台介绍
2.1. overview概览
2.2. Admin用户和虚拟主机管理
2.2.1. 添加用户
上面的Tags选项,其实是指定用户的角色,可选的有以下几个:
- 超级管理员(administrator)
- 可登陆管理控制台,可查看所有的信息,并且可以对用户,策略(policy)进行操作。监控者(monitoring)
- 可登陆管理控制台,同时可以查看rabbitmq节点的相关信息(进程数,内存使用情况,磁盘使用情况等)策略制定者(policymaker)
- 可登陆管理控制台, 同时可以对policy进行管理。但无法查看节点的相关信息(上图红框标识的部分)。普通管理者(management)
- 仅可登陆管理控制台,无法看到节点信息,也无法对策略进行管理。其他无法登陆管理控制台,通常就是普通的生产者和消费者。
2.2.2. 创建虚拟主机
为了让各个用户可以互不干扰的工作,RabbitMQ添加了虚拟主机(Virtual Hosts)的概念。其实就是一个独立的访问路径,不同用户使用不同路径,各自有自己的队列、交换机,互相不会影响。2.2.3. 支持的消息模型
5种消息模式
1、简单模式 HelloWorld
一个生产者、一个消费者,不需要设置交换机(使用 默认的交换机)
2、工作队列模式 Work Queue
一个生产者、多个消费者(竞争关系),不需要设置交换机(使用默认 的交换机)
3、发布订阅模式 Publish/subscribe
需要设置类型为fanout的交换机,并且交换机和队列进行绑定, 当发送消息到交换机后,交换机会将消息发送到绑定的队列
4、路由模式 Routing
需要设置类型为direct的交换机,交换机和队列进行绑定,并且指定routing key,当发送消息到交换机后,交换机会根据routing key将消息发送到对应的队列
5、通配符模式 Topic
需要设置类型为topic的交换机,交换机和队列进行绑定,并且指定通配符方式的 routing key,当发送消息到交换机后,交换机会根据routing key将消息发送到对应的队列
五种消息模式详解:RabbitMQ五大模式轻松理解_rabbitmq模式_风影浪子的博客-CSDN博客
.Net6快速搭建RabbitMQ发布订阅模式
(使用Asp.Net Core + 控制台应用)分为三步
- 创建RabbitMQ链接
- 搭建生产者
- 搭建消费者
创建RabbitMQ链接
可以先创建帮助类,专门用于RabbitMQ连接(需要安装Nuget包 RabbitMQ.Client)
生产者的搭建
创建一个.Net6项目
在控制器里创建一个生产者控制器
代码:
以下是代码里的主要部分
先引用帮助类、来连接RabbitMQ
连接到RabbitMQ控制台之后,先创建信道
创建交换机的名称
创建交换机的类型--广播(会将消息广播给所有与之绑定的队列。无论有多少个消费者队列,每个队列都会收到完全相同的消息副本。这种模式常用于需要将消息广播给多个订阅者的场景,比如日志记录、通知系统等。
Fanout交换机忽略消息的路由键(routing key),因此消息会被发送到所有与之绑定的队列,而不是根据路由键进行筛选和路由。这使得所有的订阅者都能接收到广播的消息,无论其感兴趣的内容是什么。)如果想要精确传递要用到topic类型交换机
创建队列并绑定交换机,因为是Fanout所以不需要key值
RabbitMQ服务器发生故障或重新启动,持久化的消息也会被保存,以确保不会丢失。
向交换机写消息--可以是异常信息
生产者完毕
消费者的构建
创建控制台应用
该部分代码使用Lambda表达式定义了一个事件处理程序,当消费者接收到消息时,该事件处理程序将执行以下操作:
- 将从ea.Body中获取的消息内容转换为字符串形式,并存储在message变量中。
- 使用Console.WriteLine方法打印消费者编号、队列名称、消费消息的长度以及消费消息的内容。
- 调用channel.BasicAck方法,向RabbitMQ发送ACK确认消息,通知RabbitMQ该条消息已成功处理。
- 程序休眠10毫秒,模拟处理消耗一定时间。
- 增加计数器i的值。
这段代码主要实现了消费者接收到消息后的处理逻辑,包括打印消息内容、发送ACK确认消息,并进行线程休眠。