RabbitMQ-基础篇

前言:

今天开始学RabbitMQ,还是跟着黑马的课程。

今日所学:

  • RabbitMQ介绍
  • RabbitMQ入门
  • Java客户端中的MQ

1.RabbitMQ介绍

1.1 什么是RabbitMQ

RabbitMQ 是一个开源的消息代理软件(消息队列中间件),实现了高级消息队列协议(AMQP)。它由 Erlang 语言编写,以高性能、高可靠性和可扩展性著称,广泛应用于分布式系统中处理异步消息通信。

1.2 RabbitMQ的核心组件

1.生产者(Producer):发送消息的应用程序

2.消费者(Consumer): 接收消息的应用程序

3.队列(Queue): 储存数据的缓冲区

4.交换机(Exchange): 接受生产者发送的消息并根据规则路由到队列

5.RabbitMQ server Broker : 由队列和交换机组成

6. 虚拟主机:一个broker可以分为多个虚拟主机,起到一个数据隔离的效果。不同虚拟主机中队列和交换机名称可以相同,互相之间没有关系。

其中还设计到两个核心概念:

1.绑定(binging): 连接交换机和队列的规则

2.消息(Message): 包含有效载荷和可选属性的数据

1.3 常见的交换机类型

1.直连交换机(Direct)​​:精确匹配路由键,也就是只能匹配路由键完全一样的

​2.扇出交换机(Fanout)​​:广播到所有绑定队列,也就是给所有绑定了的队列发送消息

​3.主题交换机(Topic)​​:基于模式匹配路由键,也就是支持模糊匹配,范围作用在直联和扇出之间

​4.头交换机(Headers)​​:基于消息头属性路由

注意:

交换机只负责路由和转发消息,没有储存消息的能力

队列和交换机之间存在动态绑定,只有当交换机绑定队列的时候,才可以传输消息。

2. RabbitMQ入门

2.1 RabbitMQ安装

我这里用的docker容器安装的RabbitMQ,先下载了一个windows的docker desktop,再根据系统弹出的提示下载了一个WSL

最后重启电脑,打开看到左下角Engine running就代表着docker安装成功了

如果不放心的也可以去cmd中确认下

确认无误后,接下来是下载rabbitMQ,由于一些原有我这国内的镜像网站用不了,我这开的科学上网,拉取的官方网站。

如果没有科学上网工具的,可以去b站上搜下载docker教程,有关镜像加速的视频。会教其他的下载方法。

下载完成后,启动容器(第一次启动):

docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:management

后续再启动使用以下指令即可:

使用docker ps查看状态

如果rabbitMQ容器状态是up,代表着启动成功

访问端口:localhost:15672

默认的账号,密码都是guest

成功进入RabbitMQ操作页面

2.2 RabbitMQ图形界面使用

2.2.1 创建队列

2.2.2 创建交换机

在type下可以选择虚拟机的类型

2.2.3 设置绑定关系

首先选择进入一个交换机

选择队列进行绑定,如果不是广播的话要设定绑定关系(Rounting key)

2.2.4 发送消息

使用交换机发送消息,需要注意:

交换机没有储存消息的能力,只有先绑定了相应的队列,才能进行消息发送

2.2.5 队列中查看接收的消息

注意只是查看不是消费

2.2.6 切换虚拟主机(virtual host)

对于小型企业而言,出于成本考虑,我们通常只会搭建一套MQ集群,公司内的多个不同项目同时使用。这个时候为了避免互相干扰, 我们会利用`virtual host`的隔离特性,将不同项目隔离。一般会做两件事情:

- 给每个项目创建独立的运维账号,将管理权限分离。

- 给每个项目创建不同的`virtual host`,将每个项目的数据隔离。

3 Java客户端中的MQ

3.1 SpringAMQP

将来我们开发业务功能的时候,肯定不会在控制台收发消息,而是应该基于编程的方式。由于`RabbitMQ`采用了AMQP协议,因此它具备跨语言的特性。任何语言只要遵循AMQP协议收发消息,都可以与`RabbitMQ`交互。并且`RabbitMQ`官方也提供了各种不同语言的客户端。

但是,RabbitMQ官方提供的Java客户端编码相对复杂,一般生产环境下我们更多会结合Spring来使用。而Spring的官方刚好基于RabbitMQ提供了这样一套消息收发的模板工具:SpringAMQP。并且还基于SpringBoot对其实现了自动装配,使用起来非常方便。

SpringAMQP提供了三个功能:

  •  自动声明队列、交换机及其绑定关系
  •  基于注解的监听器模式,异步接收消息
  •  封装了RabbitTemplate工具,用于发送消息

这里我们使用黑马资源里提供的Demo工程来学习SpringAMQP的使用

demo包括三部分:

- mq-demo:父工程,管理项目依赖

- publisher:消息的发送者

- consumer:消息的消费者

导入ideal中,更改项目JDK

更改rabbitmq连接配置

然后使用maven进行编译后遇到了如下问题:

最后是将maven中settings配置文件改了下,将私服的访问路径注释掉,然后重启下项目就正常了

3.2  work模型

前要:

在之前的案例中,我们都是经过交换机发送消息到队列,不过有时候为了测试方便,我们也可以直接向队列发送消息,跳过交换机。

在入门案例中,我们就演示这样的简单模型:

暂时跳过交换机那一部分。

Work queues,任务模型。简单来说就是**让多个消费者绑定到一个队列,共同消费队列中的消息

当消息处理比较耗时的时候,可能生产消息的速度会远远大于消息的消费速度。长此以往,消息就会堆积越来越多,无法及时处理。

此时就可以使用work 模型,多个消费者共同处理消息处理,消息处理的速度就能大大提高了。

首先在图形化界面创建好work.queue这个队列

在Test测试类中模拟发送50条消息给队列

使用两个消费者消费queue中的消息:

测试结果:

可以看到,队列将消息平均的分给了两个消费者(这也是默认配置)

增大消费者2的睡眠时间,发现还是队列还是将消息均匀分配给消费者,这容易导致一个消费者早就空间但是却造成了消息堆积。

能者多劳

在spring中有一个简单的配置,可以解决这个问题。我们修改consumer服务的application.yml文件,添加配置:

这表示每次只能获取一条消息,处理完成才能获取下一个消息。

重新测试:

发现由于消费者1因为睡眠时间短,效率较高,消费了更多消息

3.3 交换机模型

在之前的两个测试案例中,都没有交换机,生产者直接发送消息到队列。而一旦引入交换机,消息发送的模式会有很大变化,可以看到,在订阅模型中,多了一个exchange角色,而且过程略有变化:

交换机的类型有四种:

  •  Fanout:广播,将消息交给所有绑定到交换机的队列。我们最早在控制台使用的正是Fanout交换机
  •  Direct:订阅,基于RoutingKey(路由key)发送给订阅了消息的队列
  •  Topic:通配符订阅,与Direct类似,只不过RoutingKey可以使用通配符
  •  Headers:头匹配,基于MQ的消息头匹配,用的较少。

这里我们只学前三种。

3.4 Fanout交换机

Fanout,英文翻译是扇出,我觉得在MQ中叫广播更合适。在广播模式下,消息发送流程是这样的:

特点如下:

 1)  可以有多个队列

- 2)  每个队列都要绑定到Exchange(交换机)

- 3)  生产者发送的消息,只能发送到交换机

- 4)  交换机把消息发送给绑定过的所有队列

- 5)  订阅队列的消费者都能拿到消息

在这我们分两步走:

- 创建一个名为` hmall.fanout`的交换机,类型是`Fanout`

- 创建两个队列`fanout.queue1`和`fanout.queue2`,绑定到交换机`hmall.fanout`

首先在图形化界面中创建交换机和queue1,queue2两个队列,并将两个队列绑定到交换机中

消息发送:

因为Fanout具有广播特性,所以路由键(routingKey,决定交换机发送消息到哪些队列)传null值就行

消息接收

还是从queue接收消息

3.5 Direct交换机

在Fanout模式中,一条消息,会被所有订阅的队列都消费。但是,在某些场景下,我们希望不同的消息被不同的队列消费。这时就要用到Direct类型的Exchange。

在Direct模型下:

- 队列与交换机的绑定,不能是任意绑定了,而是要指定一个`RoutingKey`(路由key)

- 消息的发送方在 向 Exchange发送消息时,也必须指定消息的 `RoutingKey`。

- Exchange不再把消息交给每一个绑定的队列,而是根据消息的`Routing Key`进行判断,只有队列的`Routingkey`与消息的 `Routing key`完全一致,才会接收到消息

在这个案例中,我们分五步走:

1.  声明一个名为`hmall.direct`的交换机

2. 声明队列`direct.queue1`,绑定`hmall.direct`,`bindingKey`为`blud`和`red`

3. 声明队列`direct.queue2`,绑定`hmall.direct`,`bindingKey`为`yellow`和`red`

4.  在`consumer`服务中,编写两个消费者方法,分别监听direct.queue1和direct.queue2

5.  在publisher中编写测试方法,向`hmall.direct`发送消息

首先,我们创建一个hamll.direct的交换机,声明两个队列,分别绑定不同的bingingkey

消息发送:

消息接收:

因为两个消费者都绑定了red rountingKey,所以都收到了消息:

如果传入的是yellow或者blue,那么只有一个可以收到消息

3.6 Topic交换机

`Topic`类型的`Exchange`与`Direct`相比,都是可以根据`RoutingKey`把消息路由到不同的队列。

只不过`Topic`类型`Exchange`可以让队列在绑定`BindingKey` 的时候使用通配符! 

`BindingKey` 一般都是有一个或多个单词组成,多个单词之间以`.`分割,例如: `item.insert`

通配符规则:

- `#`:匹配一个或多个词

- `*`:匹配不多不少恰好1个词

举例:

- `item.#`:能够匹配`item.spu.insert` 或者 `item.spu`

- `item.*`:只能匹配`item.spu`

接下来,我们就按照上图所示,来演示一下Topic交换机的用法。

首先,在控制台按照图示例子创建队列、交换机,并利用通配符绑定队列和交换机。此处步骤略。最终结果如下:

发送消息:

接收消息:

因为传入的routingkey是china.weawher,匹配的是queue1的china.#,所以只有queue1收到消息。

3.7 声明队列和交换机

在之前我们都是基于RabbitMQ控制台来创建队列、交换机。但是在实际开发时,队列和交换机是程序员定义的,将来项目上线,又要交给运维去创建。那么程序员就需要把程序中运行的所有队列和交换机都写下来,交给运维。在这个过程中是很容易出现错误的。

因此推荐的做法是由程序启动时检查队列和交换机是否存在,如果不存在自动创建

3.7.1 基于bean方法声明

基本APi如下:

1.SpringAMQP提供了一个Queue类,用来创建队列:

2.SpringAMQP提供了一个Exchange接口,来表示所有不同类型的交换机:

3.ExchangeBuilder可以简化这个过程:

4.在绑定队列和交换机时,需要使用BindingBuilder来创建Binding对象:

下面使用Fanout交换机做一个举例;

1.创建一个fanout的configuration类

2.创建一个交换机方法(FanoutExchange类型)

3.创建一个队列(返回queue类型)

4.创建一个绑定关系方法(返回binging,绑定创建的队列和交换机)

但是这有一个缺点,就是绑定方法只能一个一个创建,如果绑定的是direct交换机,就拿之前的例子进行举例,每个队列都要绑定一个red方法,一个yellow方法,也就是说,一个交换机和两个队列进行绑定就要创建四个方法。

@Configuration

public class DirectConfig {

    /**

     * 声明交换机

     * @return Direct类型交换机

     */

    @Bean

    public DirectExchange directExchange(){

        return ExchangeBuilder.directExchange("hmall.direct").build();

    }

    /**

     * 第1个队列

     */

    @Bean

    public Queue directQueue1(){

        return new Queue("direct.queue1");

    }

    /**

     * 绑定队列和交换机

     */

    @Bean

    public Binding bindingQueue1WithRed(Queue directQueue1, DirectExchange directExchange){

        return BindingBuilder.bind(directQueue1).to(directExchange).with("red");

    }

    /**

     * 绑定队列和交换机

     */

    @Bean

    public Binding bindingQueue1WithBlue(Queue directQueue1, DirectExchange directExchange){

        return BindingBuilder.bind(directQueue1).to(directExchange).with("blue");

    }

    /**

     * 第2个队列

     */

    @Bean

    public Queue directQueue2(){

        return new Queue("direct.queue2");

    }

    /**

     * 绑定队列和交换机

     */

    @Bean

    public Binding bindingQueue2WithRed(Queue directQueue2, DirectExchange directExchange){

        return BindingBuilder.bind(directQueue2).to(directExchange).with("red");

    }

    /**

     * 绑定队列和交换机

     */

    @Bean

    public Binding bindingQueue2WithYellow(Queue directQueue2, DirectExchange directExchange){

        return BindingBuilder.bind(directQueue2).to(directExchange).with("yellow");

    }

}

3.7.2 基于注解方法声明

基于@Bean的方式声明队列和交换机比较麻烦,Spring还提供了基于注解方式来声明。

例如,我们同样声明Direct模式的交换机和队列:

bingings规定交绑定规则,value规定队列类型,exchange规定绑定规则。在项目启动时如果没有相应的队列交换机,会自动创建好。

最后:

今天的分享就到这里。如果我的内容对你有帮助,请点赞评论收藏。创作不易,大家的支持就是我坚持下去的动力!(๑`・ᴗ・´๑)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/912735.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/912735.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker-compose配置redis哨兵详细步骤和配置文件

docker-compose配置redis哨兵详细步骤和配置文件 目录结构调整 redis-cluster/ ├── config/ │ ├── master.conf # 主节点配置 │ ├── slave1.conf # 从节点1配置 │ ├── slave2.conf # 从节点2配置 │ ├── sentinel1.…

多模态大语言模型arxiv论文略读(146)

Exploring Response Uncertainty in MLLMs: An Empirical Evaluation under Misleading Scenarios ➡️ 论文标题:Exploring Response Uncertainty in MLLMs: An Empirical Evaluation under Misleading Scenarios ➡️ 论文作者:Yunkai Dang, Mengxi G…

【教程】Linux中限制用户可以使用的GPU数量 | 附脚本

转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 目录 背景说明 设置方法 管理脚本 进阶限制 恢复默认组 注意事项 背景说明 比较简单的方式是使用group来管理权限,这种方式能限制哪些…

90.xilinx复位低电平(一般使用低电平复位)

Xilinx FPGA 中的寄存器(Flip-Flop)**确实支持异步复位**,但具体实现方式取决于你使用的设计方法(HDL 代码风格或原语实例化)。以下是详细说明: --- ### 1. **Xilinx 寄存器的复位特性** - **同步复位…

NVMe高速传输之摆脱XDMA设计10: DMA 控制单元设计

DMA 控制单元负责控制 DMA 传输事务, 该单元承担了 DMA 事务到 NVMe 事务的转换任务, 使用户对数据传输事务的控制更加简单快捷。 DMA 控制功能由 DMA寄存器组实现。 DMA 寄存器组包含 DMA 操作寄存器、 DMA 长度寄存器、 DMA 源目的地址寄存器和 DMA 状…

如何设置电脑定时休眠?操作指南详解

长时间运行电脑会导致硬件过热,缩短其使用寿命。定时关机有助于让硬件得到休息,降低因长时间高负荷工作导致损坏的风险。 它的界面简洁直观,功能却十分实用,涵盖了定时关机、重启、注销、休眠、待机以及锁定等多种操作。 以设置“…

LeetCode[617]合并二叉树

思路: 我们合并左右子树,在递归左右子树的时候,一定要保证左右子树不为空,如果左子树为空,那么直接返回右子树就行了,即使右子树为空。如果右子树为空那么直接返回左子树就行了,这样判断完就正常…

Redis 常用五大数据类型

1、Redis 关键字(Key) keys * 查看当前库所有keyexists [key] 判断某个key是否存在type [key] 查看当前key的数据类型del [key] 删除指定的key数据unlink [key] 根据value选择非阻塞删除,仅将keys从keyspace元数据中删除,真正的删…

大语言模型(LLM)专业术语汇总

1. 训练与部署 1.1 预训练 专业:在海量无标注文本(如Common Crawl、Wikipedia)上通过自监督学习训练基础语言模型,学习通用语言表征(如GPT-3训练数据达45TB)。通俗:AI的“通识教育阶段”&…

【Java Swing 图形界面编程】JList 列表组件 ① ( JList 组件简介 | 核心作用 | 关键特性 | 基础用法示例 )

文章目录 一、JList 组件简介1、JList 概念简介2、JList 核心作用3、JList 关键特性 二、JList 组件基础用法示例1、使用 String 数组构建列表项2、使用 Vector 集合构建列表项3、使用 DefaultListModel 构建列表项 一、JList 组件简介 1、JList 概念简介 基本概念 : JList 组件…

【小技巧】Python+PyCharm IDE 配置解释器出错,环境配置不完整或不兼容。(小智AI、MCP、聚合数据、实时新闻查询、NBA赛事查询)

报错信息如下: [unsupported] Python 3.1 (mcp-calculator-main) (3) C:\Users(xsshu\AppData\Local\Programs\Python\Python313\python.exe [unsupported] Python 3.1 C:\Users\xsshu\AppData\Local\Programs\Python\Python311\python.exe 这条输出显示了两个 Pyth…

Ragflow 前后端登录逻辑

前端登录逻辑 路由配置: /login 路由指向 /pages/login 组件。登录表单使用 Ant Design 的 Form, Input, 和 Button 组件。 登录表单处理: 使用 useLogin钩子来处理登录请求。密码通过 RSA 加密后再发送到服务器。成功登录后导航至 /knowledge 页面。 …

基于图神经网络的ALS候选药物预测模型设计与实现

基于图神经网络的ALS候选药物预测模型设计与实现 一、任务背景与意义 肌萎缩侧索硬化症(ALS)是一种致命的神经退行性疾病,目前尚无有效治愈方法。传统药物发现流程耗时长、成本高,而人工智能技术为加速药物发现提供了新途径。本文设计并实现了一个基于图神经网络(GNN)的…

运维打铁: 数据加密与备份恢复策略制定

文章目录 思维导图一、数据加密1. 加密算法选择AES 加密示例(Python)RSA 加密示例(Python) 2. 密钥管理3. 加密范围 二、数据备份1. 备份类型全量备份增量备份差异备份 2. 备份频率3. 备份存储位置 三、数据恢复1. 恢复测试2. 恢复…

AIbase MCP服务库上线:集成服务器、客户端、案例教程等服务

在当今数字化时代,人工智能技术正以前所未有的速度发展,深刻地改变着我们的生活和工作方式。而要充分发挥AI的强大能力,离不开高效的工具和服务支持。今天,就让我们来了解一下一个专注于MCP(Model Context Protocol&am…

QGIS+CesiumIon

前言 QGIS 3.44中,新增了3D 场景新增地球视图模式,通过Cesium ion插件,支持谷歌全球倾斜模型的加载显示。 目录 1 CesiumIon插件安装 2 加载谷歌全球倾斜模型 1、CesiumIon插件安装 点击菜单【Plugins】->【Manage and Install Plugins】…

TEXT Introduction

我们是谁 美国计算机奥林匹克竞赛通过培训、竞赛和国际比赛来促进大学前的计算机学习。 数个教练将会组织、领导、陪伴代表美国参加国际性奥林匹克竞赛的学生。 你可以在 USACO 官网了解更多。 USACO 的目标 USACO 的具体目标包括: 训练美国的队伍并且在下一届奥…

Fluent许可服务器设置教程

Fluent作为一款广泛使用的流体动力学模拟软件,其高效的许可管理系统是确保顺畅运行的关键。为了帮助您更好地掌握Fluent许可服务器的设置方法,本文将为您提供一份详细的设置教程,让您轻松配置,高效运行Fluent软件。 一、Fluent许可…

vue3中实现高德地图POI搜索(附源码)

引言 上一篇文章详细讲解了vue3中实现高德地图地址搜索自动提示(附源码)🔗,本文将重点介绍POI搜索功能的实现。 1. 功能介绍 POI(Point of Interest) 搜索用于查找特定位置或区域内的兴趣点,如餐馆、商场、景点等。…

机器学习在计算机视觉中的应用

引言 计算机视觉(Computer Vision)是人工智能的重要分支,旨在让计算机像人类一样“看懂”图像和视频。近年来,随着深度学习(Deep Learning)的快速发展,计算机视觉在多个领域取得了突破性进展。…