RabbitMQ-学习笔记(初识 RabbitMQ)

本篇文章学习于 bilibili黑马 的视频 (狗头保命)

同步通讯 & 异步通讯 (RabbitMQ 的前置知识)

  • 同步通讯:类似打电话,只有对方接受了你发起的请求,双方才能进行通讯, 同一时刻你只能跟一个人打视频电话。
  • 异步通讯:类似发信息,不用对方接受,你就可以直接发信息,而且可以多线操作,同时跟多人发信息。

同步调用
在这里插入图片描述

发送方直接把消息传递给接收者, 如果中间有很多环节, 有一步出错, 那么所有操作都要回滚


同步调用的缺点:

  1. 拓展性差
  2. 性能下降
  3. 级联失败

异步调用方式其实就是基于消息通知的方式,一般包含三个角色:
消息发送者:投递消息的人,就是原来的调用方
消息Broker:管理、暂存、转发消息,你可以把它理解成微信服务器
消息接收者:接收和处理消息的人,就是原来的服务提供方
黑马的图

异步调用中, 发送方把消息发送给消息broker, 就算完成发送任务.
接收者从消息 breker 那里订阅消息
这样,发送消息的人和接收消息的人就完全解耦了。

此时, 如果发送方发送消息出错, 不需要全部回滚, 只需要将错误信息重新发布给消息代理
如果接受方接受消息过程出现错误, 那么消息代理重传就好, 发送方还是可以正常进行其他操作


异步调用的优势:

  1. 耦合度更低
  2. 性能更好
  3. 业务拓展性强
  4. 故障隔离,避免级联失败

异步通信的缺点:

  1. 完全依赖于Broker的可靠性、安全性和性能
  2. 架构复杂,后期维护和调试麻烦

消息Broker,目前常见的实现方案就是消息队列(MessageQueue),简称为MQ.
RabbitMQ是基于Erlang语言开发的开源消息通信中间件.


开启 RabbitMQ

打开这个目录(我的电脑是)
C:\Program Files (x86)\RabbitMQ Server\rabbitmq_server-3.7.4\sbin
在这里插入图片描述
双击这个文件

在这里插入图片描述

等待命令框为这个状态

在这里插入图片描述

点击跳转官网地址

RabbitMQ


RabbitMQ对应的架构

黑马的图

  • publisher:生产者,也就是发送消息的一方
  • consumer:消费者,也就是消费消息的一方
  • queue:队列,存储消息。生产者投递的消息会暂存在消息队列中,等待消费者处理
  • exchange:交换机,负责消息路由。生产者发送的消息由交换机决定投递到哪个队列。
  • virtual host:虚拟主机,起到数据隔离的作用。每个虚拟主机相互独立,有各自的exchange、queue

简单的收发消息 (exchange & queue)

1. 添加 exchange

在这里插入图片描述

2. 添加 queue

在这里插入图片描述

3. 绑定 exchange 和 queue

点击之前创建的 exchange
在这里插入图片描述

添加绑定信息
在这里插入图片描述

4. 发送消息

输入信息, 点击发送
在这里插入图片描述

5. 查看接受的消息

点击被绑定的队列
在这里插入图片描述

获取消息
在这里插入图片描述


数据隔离

基于不同用户,将管理权限分离。
基于不同的 virtual host ,将每个项目的数据隔离。

创建用户
在这里插入图片描述

此时用户没有 virtral hosts
在这里插入图片描述

退出, 重新登录
在这里插入图片描述

创建 virtual hosts
在这里插入图片描述

此时用户 zrj 已经拥有 virtual hosts 了
在这里插入图片描述

将 virtual hosts 切换到 /zrj 之后, 查看 queue, 会发现之前创建的 test.queue 已经看不见了, 这就是基于 用户和 virtual hosts 的数据隔离效果
在这里插入图片描述

Spring AMQP

RabbitMQ 基于 AMQP 协议, 因此具有跨语言的特性.
Spring 官方基于 RabbitMQ 提供了一套消息收发管理工具 ---- Spring AMQP

Spring AMQP 提供的功能

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

项目中使用 RabbitMQ

如果你很懒, 不想自己创建, 就去bilibili黑马的课程里, 找资源吧 (毕竟我也是在那里学的)

发送消息

创建项目, 导入依赖

项目目录结构
在这里插入图片描述

<dependencies>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
    <!--AMQP依赖,包含RabbitMQ-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-amqp</artifactId>
    </dependency>
    <!--单元测试-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
    </dependency>
</dependencies>

添加一下配置
在这里插入图片描述

Spring 中发送消息在这里插入图片描述

RabbitMQ 接收到消息
在这里插入图片描述

上面是使用管道简单的发送消息, 结构大概是这样
在这里插入图片描述

我们查看 的 convertAndSend 方法可以看到, 由于多态, 参数的选择有很多方案, 上面使用的是
convertAndSend(String routingKey, Object object)
因为所有的数据发送都是 Object , 因此我们接收方那里收到的, 也是 Object 类型, 如果想取出使用, 记得转换类型
在这里插入图片描述

接收消息

增加配置
在这里插入图片描述

编写监听代码
在这里插入图片描述

启动 consumer 类
在这里插入图片描述

publisher 中进行消息发送, 此时 consumer 中可以接收到消息
在这里插入图片描述

WorkQueues模型

简单的说就是多个消费者消费同一个队列中的消息

在这里插入图片描述

通常情况下, 队列会采用轮询的方式, 每个消费者均分 队列中的消息

两个消费者共同消费同一个队列
在这里插入图片描述

连续发送 50 条消息
在这里插入图片描述

查看结果会发现, 两个消费者虽然消费速率不同, 但是最终都消费了同样数量 (25条) 的消息
在这里插入图片描述

如何才能使得能者多劳, 不会浪费效率呐?

修改配置信息, 设定么个消费者每次获取消息的最大数量 (原先是 几个消费者 平均分掉 所有消息), 消费完成获取的消息之后才能获取下一条消息
在这里插入图片描述

引入交换机之后的 生产者消费者模型

在这里插入图片描述

注意: Exchange(交换机)只负责转发消息,不具备存储消息的能力,因此如果没有任何队列与Exchange绑定,或者没有符合路由规则的队列,那么消息会丢失!

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

Fanout 交换机

交换机把消息发送给 所有 绑定该交换机的队列
在这里插入图片描述

创建交换机
在这里插入图片描述

创建两个队列并绑定
在这里插入图片描述
在这里插入图片描述

发送消息, 并接收处理

消息发送方
在这里插入图片描述

消息接收方
在这里插入图片描述

消息处理
在这里插入图片描述

可以看到, Fanout 交换机把消息 广播 给了绑定它的所有队列

Direct 交换机

Direct 模型下, 队列与交换机的绑定会指定一个 RoutingKey(路由key)
消息的发送方在向 Exchange 发送消息时吗也必须指定消息的 RoutingKey
Exchange 会将消息交给具有相同 RoutingKey 的队列

在这里插入图片描述

创建交换机
在这里插入图片描述

创建队列
在这里插入图片描述

将交换机和队列进行绑定 (填写 RoutingKey)
在这里插入图片描述

消息接收
在这里插入图片描述

此时会发现, 对于不同的消息发送, 会有不同的处理

当 RoutingKey 为 red 时, 两个消费者都会进行消息处理
在这里插入图片描述
在这里插入图片描述

当 RoutingKey 为 green / blue 时, 只有绑定对应的 RoutingKey 的消费者都会进行消息处理
在这里插入图片描述
在这里插入图片描述

Tocpic 交换机

和 Direct 交换机基本类似, 但是绑定的 RoutingKey 可以使用通配符

通配符规则:

  • #:匹配一个或多个词
  • *:匹配不多不少恰好1个词

在这里插入图片描述

创建 tocpic 交换机
在这里插入图片描述

创建队列
在这里插入图片描述

将 topic 交换机与 队列 进行路由绑定
在这里插入图片描述

消息发送
在这里插入图片描述

消息接收
在这里插入图片描述

消息处理
在这里插入图片描述

声明队列和交换机

使用 Spring AMQP 提供的 API 来声明队列和交换机, 而不是使用 RabbitMQ 控制台来操作

使用 ExchangeBuilder 来创建队列和交换机
在这里插入图片描述

绑定队列和交换机
在这里插入图片描述

Fanout 实例

写一个类声明交换机和队列
在这里插入图片描述

运行 publisher 后, 可以在控制台看到 队列, 交换机, 绑定 都已完成
在这里插入图片描述
在这里插入图片描述

Direct示例 (Topic 与其几乎完全相同)

写一个类声明交换机和队列
在这里插入图片描述

运行 publisher 后, 可以在控制台看到 队列, 交换机, 绑定 都已完成
在这里插入图片描述

基于注解声明

由于要绑定多个 key 的情况, 基于 @Bean 的方式声明队列和交换机会很麻烦, 因此 Spring AMQP 提供了注解的方式来声明 交换机和队列

Fanout 示例

在消费的同时声明 Fanout 交换机和队列
在这里插入图片描述

运行 publisher 后查看 RabbitMQ 控制台
在这里插入图片描述

Direct示例 (Topic 与其几乎完全相同)

在消费的同时声明 Fanout 交换机和队列
在这里插入图片描述

运行 publisher 后查看 RabbitMQ 控制台
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

根据既定数组创建数组的方法汇总 (第3讲)

根据既定数组创建数组的方法 &#xff08;第3讲&#xff09;         &#x1f379;博主 侯小啾 感谢您的支持与信赖。☀️ &#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&#x1f339;꧔…

2021年第十届数学建模国际赛小美赛A题气道阻力的评估解题全过程文档及程序

2021年第十届数学建模国际赛小美赛 A题 气道阻力的评估 原题再现&#xff1a; 气道阻力的定义是通过肺气道产生单位气流所需的经肺压力的变化。更简单地说&#xff0c;它是嘴和肺泡之间的压力差&#xff0c;除以气流。影响气道阻力的因素是多方面的&#xff0c;我们需要探讨这…

python 数据分析

数据分析 数据分析是指用适当的方法对收集的数据进行分析,提取有用信息并且形成结论. 广义的数据分析包括狭义的数据分析和数据挖掘.狭义的数据分析是指根据目的,采用对比分析,分组分析,交叉分析,回归分析等分析方法,对数据进行分析和处理,得到特征统计量的过程.数据挖掘是指…

20231207给NanoPC-T4(RK3399)开发板刷Android12的挖掘机方案的LOG

20231207给NanoPC-T4(RK3399)开发板刷Android12的挖掘机方案的LOG 2023/12/7 23:50 SDK&#xff1a;rk356x_android12_220722.tgz 只修改DTS的DTC部分就【直接】可以跑NanoPC-T4 参考资料&#xff1a; http://www.friendlyelec.com.cn/agent.asp http://www.friendlyelec.com.c…

[FPGA 学习记录] 快速开发的法宝——IP核

快速开发的法宝——IP核 文章目录 1 IP 核是什么2 为什么要使用 IP 核3 IP 核的存在形式4 IP 核的缺点5 Quartus II 软件下 IP 核的调用6 Altera IP 核的分类 在本小节当中&#xff0c;我们来学习一下 IP 核的相关知识。 IP 核在 FPGA 开发当中应用十分广泛&#xff0c;它被称为…

Spark RDD惰性计算的自主优化

原创/朱季谦 RDD&#xff08;弹性分布式数据集&#xff09;中的数据就如final定义一般&#xff0c;只可读而无法修改&#xff0c;若要对RDD进行转换或操作&#xff0c;那就需要创建一个新的RDD来保存结果。故而就需要用到转换和行动的算子。 Spark运行是惰性的&#xff0c;在…

UE Http笔记

c参考链接 UE4 开发如何使用 Http 请求_wx61ae2f5191643的技术博客_51CTO博客 虚幻引擎:UEC如何对JSON文件进行读写?-CSDN博客 UE4 HTTP使用 官方免费插件 VaRest 在代码插件创建的VaRest - 虚幻引擎商城 UE5在蓝图中使用Varest插件Get&#xff0c;Post两种常见请求方式…

C# Solidworks二次开发:三种获取SW设计结构树的方法-第二讲

今天这篇文章是接上一篇文章的&#xff0c;主要讲述的是获取SW设计结构树节点的第二种方法。 这个方法获取节点的逻辑是先获取最顶层节点&#xff0c;然后再通过获取顶层节点的子节点一层一层的把所有节点都找出来&#xff0c;也就是需要递归。想要用这个方法就要了解下面几个…

常见的校验码

在计算机领域中&#xff0c;校验码是一种用于检测或纠正数据传输或存储中错误的技术。校验码通常通过在数据中添加一些冗余信息来实现。其主要目的是确保数据的完整性和准确性。 奇偶校验码&#xff08;Parity Check&#xff09; 奇校验&#xff1a; 确保数据中二进制位中的1的…

JWT安全及WebGoat靶场

JWT 安全 cookie(放在浏览器) cookie 是一个非常具体的东西&#xff0c;指的就是浏览器里面能永久存储的一种数据&#xff0c;仅仅是浏览器实现的一种数据存储功能。 cookie 由服务器生成&#xff0c;发送给浏览器&#xff0c;浏览器把 cookie 以 kv 形式保存到某个目录下的…

文件同步及实现简单监控

1. 软件简介 rsync rsync 是一款开源的、快速的、多功能的、可实现全量及增量的本地或远程 数据同步备份的优秀工具。在同步备份数据时&#xff0c;默认情况下&#xff0c;Rsync 通过其 独特的“quick check”算法&#xff0c;它仅同步大小或者最后修改时间发生变化的文 件或…

CentOS上配置和管理HTTP服务器的工具和实用程序

在CentOS系统上&#xff0c;有多个工具和实用程序可以帮助你配置和管理HTTP服务器。以下是一些常用的工具和实用程序&#xff1a; Apache HTTP服务器&#xff1a; Apache是CentOS上最常用的HTTP服务器之一。它是一个开源的Web服务器软件&#xff0c;具有高度的可配置性和可扩…

在jupyter notebook中修改其他文件的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

dell服务器安装PERCCLI

因在linux 系统中无法查看系统磁盘的raid级别&#xff0c;也无法得知raid状态&#xff0c;需要安装额外的包来监控&#xff0c;因是dell服务器&#xff0c;就在dell网站中下载并安装 1、下载链接&#xff1a;驱动程序和下载 | Dell 中国https://www.dell.com/support/home/zh-…

ELK(四)—els基本操作

目录 elasticsearch基本概念RESTful API创建非结构化索引&#xff08;增&#xff09;创建空索引&#xff08;删&#xff09;删除索引&#xff08;改&#xff09;插入数据&#xff08;改&#xff09;数据更新&#xff08;查&#xff09;搜索数据&#xff08;id&#xff09;&…

查看端口号是否被占用

windows10查看端口号是否被占用及解除占用的常用命令 netstat -ano&#xff1a;查看所有端口号占用情况 netstat -ano |findstr “XXX”&#xff1a;查看端口号为XXX的占用情况&#xff0c;如下&#xff1a; 得到进程号为12160的进程正在占用本地的9090端口号&#xff08;如果只…

Python+requests+unittest+excel实现接口自动化测试框架

在刚刚进入测试行业的时候&#xff0c;最开始也是做功能测试&#xff0c;我想很多伙伴和我一样&#xff0c;觉得自动化测试都很高端&#xff0c;很神秘。迫不及待的想去学习作自动化测试。 以前比较常用数据库python做自动化&#xff0c;后面发现excel个人觉得更加适合&#x…

flex布局的flex为1到底是什么

参考博客&#xff1a;flex:1什么意思_公孙元二的博客-CSDN博客 flex&#xff1a;1即为flex-grow&#xff1a;1&#xff0c;经常用作自适应布局&#xff0c;将父容器的display&#xff1a;flex&#xff0c;侧边栏大小固定后&#xff0c;将内容区flex&#xff1a;1&#xff0c;内…

算术运算(这么简单?进来坐坐?)

先热热身 算术运算&#xff0c;也称为四则运算&#xff0c;包括加法、减法、乘法和除法。此外&#xff0c;算术运算还包括乘方和开方。 在算术中&#xff0c;加减被视为一级运算&#xff0c;乘除被视为二级运算&#xff0c;乘方和开方被视为三级运算。在一道算式中&#xff0c;…

GDPU 数据结构 天码行空13

文章目录 一、【实验目的】二、【实验内容】三、实验源代码四、实验结果五、实验总结 一、【实验目的】 (1) 理解插入排序算法的实现过程&#xff1b; &#xff08;2&#xff09;理解不同排序算法的时间复杂度及适用环境&#xff1b; &#xff08;3&#xff09;了解算法性能…
最新文章