RabbitMQ详解

RabbitMQ详解

什么是RabbitMQ

使用Erlang语言开发的开源消息队列系统,基于AMQP协议来实现。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。AMQP协议更多用在企业系统内对数据一致性、稳定性和可靠性要求很高的场景,对性能和吞吐量的要求还在其次。

AMQP,即Advanced Message Queuing Protocol(高级消息队列协议),一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计,基于此协议的客户端与消息中间件传递消息,不受客户端/中间件不同产品、不同开发语言等条件的限制

RabbitMQ比Kafka可靠,Kafka更适合IO高吞吐的处理,一般应用在大数据日志处理或对实时性(少量延迟),可靠性(少量丢数据)要求稍低的场景使用,比如ELK日志收集。

RabbitMQ能做什么

RabbitMQ可以帮助开发者构建可靠、高效、可扩展的分布式系统,实现异步通信、任务分发和事件驱动等功能。它被广泛应用于各种场景,包括微服务架构、消息驱动的架构、实时数据处理等。

RabbitMQ核心组件

descript

具体:

descript

RabbitMQ工作机制

生产者

消息的创建者,负责创建和推送消息到消息服务器

消费者

消息的接收方,接受消息并处理消息

消息服务器

RabbitMQ本身,不会产生和消费消息,相当于一个中转站,将生产者的消息路由给消费者

RabbitMQ角色

ConnectionFactory

接管理,应用程序或消费方与RabbitMQ建立连接的管理器

Channel

信道,推送消息的通道

Exchange

交换机,用于接收分配消息到队列中

Queue

保存消息

Routingkey

消息会携带routingKey,决定消息最终的队列

BindingKey

Queue通过bindingKey与交换机绑定

安装

【Windows安装RabbitMQ详细教程】_rabbitmq安装教程_慕之寒的博客-CSDN博客

RabbitMQ控制台介绍

2.1. overview概览

descript

2.2. Admin用户和虚拟主机管理

2.2.1. 添加用户

descript

上面的Tags选项,其实是指定用户的角色,可选的有以下几个:

  • 超级管理员(administrator)
  • 可登陆管理控制台,可查看所有的信息,并且可以对用户,策略(policy)进行操作。监控者(monitoring)
  • 可登陆管理控制台,同时可以查看rabbitmq节点的相关信息(进程数,内存使用情况,磁盘使用情况等)策略制定者(policymaker)
  • 可登陆管理控制台, 同时可以对policy进行管理。但无法查看节点的相关信息(上图红框标识的部分)。普通管理者(management)
  • 仅可登陆管理控制台,无法看到节点信息,也无法对策略进行管理。其他无法登陆管理控制台,通常就是普通的生产者和消费者。

2.2.2. 创建虚拟主机

descript

为了让各个用户可以互不干扰的工作,RabbitMQ添加了虚拟主机(Virtual Hosts)的概念。其实就是一个独立的访问路径,不同用户使用不同路径,各自有自己的队列、交换机,互相不会影响。2.2.3. 支持的消息模型

descript

descript

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 + 控制台应用)分为三步

  1. 创建RabbitMQ链接
  2. 搭建生产者
  3. 搭建消费者

创建RabbitMQ链接

descript

可以先创建帮助类,专门用于RabbitMQ连接(需要安装Nuget包 RabbitMQ.Client)

descript

生产者的搭建

创建一个.Net6项目

在控制器里创建一个生产者控制器

descript

代码:

descript

以下是代码里的主要部分

先引用帮助类、来连接RabbitMQ

连接到RabbitMQ控制台之后,先创建信道

descript

创建交换机的名称

descript

创建交换机的类型--广播(会将消息广播给所有与之绑定的队列。无论有多少个消费者队列,每个队列都会收到完全相同的消息副本。这种模式常用于需要将消息广播给多个订阅者的场景,比如日志记录、通知系统等。

Fanout交换机忽略消息的路由键(routing key),因此消息会被发送到所有与之绑定的队列,而不是根据路由键进行筛选和路由。这使得所有的订阅者都能接收到广播的消息,无论其感兴趣的内容是什么。)如果想要精确传递要用到topic类型交换机

descript

创建队列并绑定交换机,因为是Fanout所以不需要key值

descript

RabbitMQ服务器发生故障或重新启动,持久化的消息也会被保存,以确保不会丢失。

向交换机写消息--可以是异常信息

descript

生产者完毕

消费者的构建

创建控制台应用

descript

descript

该部分代码使用Lambda表达式定义了一个事件处理程序,当消费者接收到消息时,该事件处理程序将执行以下操作:

  1. 将从ea.Body中获取的消息内容转换为字符串形式,并存储在message变量中。
  2. 使用Console.WriteLine方法打印消费者编号、队列名称、消费消息的长度以及消费消息的内容。
  3. 调用channel.BasicAck方法,向RabbitMQ发送ACK确认消息,通知RabbitMQ该条消息已成功处理。
  4. 程序休眠10毫秒,模拟处理消耗一定时间。
  5. 增加计数器i的值。

这段代码主要实现了消费者接收到消息后的处理逻辑,包括打印消息内容、发送ACK确认消息,并进行线程休眠。

posted @ 2024-06-05 09:51  北落师门、  阅读(80)  评论(0编辑  收藏  举报