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.mzph.cn/news/205889.shtml

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

相关文章

【mysql】下一行减去上一行数据、自增序列场景应用

背景 想获取if_yc为1连续账期数据 思路 获取所有if_yc为1的账期数据下一行减去上一行账期&#xff0c;如果为1则为连续&#xff0c;不等于1就为断档获取不等于1的最小账期&#xff0c;就是离当前账期最近连续账期 代码 以下为mysql语法&#xff1a; select acct_month f…

查看Linux的Ubuntu的版本

我的Ubuntu版本是 Jammy x86_64&#xff0c;即 Ubuntu 22.04.3 LTS&#xff0c;代号为"Jammy Jellyfish"&#xff0c;架构是 x86_64&#xff08;64位&#xff09;。

NLP自然语言处理学习笔记

参考&#xff1a;NLP&#xff08;自然语言处理&#xff09;介绍 - 知乎 (zhihu.com) 一、NLP是什么 自然语言处理( Natural Language Processing, NLP)是计算机科学领域与人工智能领域中的一个重要方向。它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。自…

最新版本——Hadoop3.3.6单机版完全部署指南

大家好&#xff0c;我是独孤风&#xff0c;大数据流动的作者。 本文基于最新的 Hadoop 3.3.6 的版本编写&#xff0c;带大家通过单机版充分了解 Apache Hadoop 的使用。本文更强调实践&#xff0c;实践是大数据学习的重要环节&#xff0c;也能在实践中对该技术有更深的理解&…

105.长度最小的子数组(力扣)|滑动窗口

代码演示 class Solution { public:int minSubArrayLen(int target, vector<int>& nums) {int result INT_MAX; // 用于存储最小子数组的长度int sum 0; // 滑动窗口的长度int i 0; // 滑动窗口的起始位置int sumlength 0; // 当前子数…

深度学习与逻辑回归模型的融合--TensorFlow多元分类的高级应用

手写数字识别 文章目录 手写数字识别1、线性回归VS逻辑回归Sigmoid函数 2、逻辑回归的基本模型-神经网络模型3、多元分类基本模型4、TensorFlow实战解决手写数字识别问题准备数据集数据集划分 特征数据归一化归一化方法归一化场景 标签数据独热编码One-Hot编码构建模型损失函数…

探索人工智能领域——每日20个名词详解【day11】

目录 前言 正文 总结 &#x1f308;嗨&#xff01;我是Filotimo__&#x1f308;。很高兴与大家相识&#xff0c;希望我的博客能对你有所帮助。 &#x1f4a1;本文由Filotimo__✍️原创&#xff0c;首发于CSDN&#x1f4da;。 &#x1f4e3;如需转载&#xff0c;请事先与我联系以…

uni-app 微信小程序之好看的ui登录页面(四)

文章目录 1. 页面效果2. 页面样式代码 更多登录ui页面 uni-app 微信小程序之好看的ui登录页面&#xff08;一&#xff09; uni-app 微信小程序之好看的ui登录页面&#xff08;二&#xff09; uni-app 微信小程序之好看的ui登录页面&#xff08;三&#xff09; uni-app 微信小程…

论文阅读:LSeg: LANGUAGE-DRIVEN SEMANTIC SEGMENTATION

可以直接bryanyzhu的讲解&#xff1a;CLIP 改进工作串讲&#xff08;上&#xff09;【论文精读42】_哔哩哔哩_bilibili 这里是详细的翻译工作 原文链接 https://arxiv.org/pdf/2201.03546.pdf ICLR 2022 0、ABSTRACT 我们提出了一种新的语言驱动的语义图像分割模型LSeg。…

【webpack】应用篇

基础应用 代码分离常用的代码分离方法方法一&#xff1a;配置入口节点方法二&#xff1a;防止重复方法三&#xff1a;动态导入 缓存原因解决思路 缓存第三方库原因解决思路 将所有js文件单独存放文件夹拆分开发环境和生产环境配置公共路径环境变量和区分环境代码压缩 拆分配置文…

【Python】np.save()和np.load()函数详解和示例

本文通过函数原理和运行示例&#xff0c;对np.save()和np.load()函数进行详解&#xff0c;以帮助大家理解和使用。 更多Numpy函数详解和示例&#xff0c;可参考 【Python】Numpy库近50个常用函数详解和示例&#xff0c;可作为工具手册使用 目录 np.save &#xff08;&#xff…

Go--协程

协程 协程是Go语言最大的特色之一。 1、协程的概念 协程并不是Go发明的概念&#xff0c;支持协程的变成语言有很多。Go在语言层面直接提供对协程的支持称为goroutine。 1.1 基本概念 进程 进程是应用程序启动的实例&#xff0c;每个进程都有独立的内存空间&#xff0c;不同…

nodejs微信小程序+python+PHP的智能停车系统-计算机毕业设计推荐django

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

解决思维题的一些自我总结

目录 常见思维题类型 排序 区间问题 01串串 字符串串 位运算 gcd 与 lcm 质数相关 二元组 常见思维题类型 思维题很多都可以说是贪心、但贪心种类很多&#xff0c;具体怎么贪&#xff0c;重要的还是在于积累经验吧...有些东西也很难总结&#xff0c;以下算是我的碎碎念…

Thymeleaf生成pdf表格合并单元格描边不显示

生成pdf后左侧第一列的右描边不显示&#xff0c;但是html显示正常 显示异常时描边的写法 cellpadding“0” cellspacing“0” &#xff0c;td,th描边 .self-table{border:1px solid #000;border-collapse: collapse;width:100%}.self-table th{font-size:12px;border:1px sol…

el-select的多选multible带全选组件二次封装(vue2,elementUI)

1.需求 Select 选择器 多选需要增加 全选 和 取消全选 功能&#xff0c;前端框架为vue2&#xff0c;UI组件为elementUI。 2. 代码 html部分 <template><el-tooltip effect"dark" :disabled"defaultValue.length < 0" :content"defaul…

dockerfile简单实践部署(jenkins,wordpress)

实现部署jenkins的流程 配置java环境&#xff0c;导入jenkins包&#xff0c;运行命令 java -jar jenkins包&#xff0c;这里为了减少进入jenkins的web端安装插件&#xff0c;将插件提前部署到容器内。 制作dockerfile 创建镜像所在的文件夹和Dockerfile文件 mkdir /test cd …

如何优雅使用 vue-html2pdf 插件生成pdf报表

使用 vue-html2pdf 插件 业务背景&#xff0c;老板想要一份能征服客户的pdf报表&#xff0c;传统的pdf要手撕&#xff0c;企业中确实有点耗费时间&#xff0c;于是github上面看到开源的这个插件就…废话不多说&#xff0c;直接上教程 1.使用下面命令安装 vue-html2pdf npm i…

Vue3项目调用腾讯地图服务(地址解析 地址转坐标)及使用axios的跨域问题

一,需求 根据传入的文本地址 将其转换为坐标 显示地图点位在腾讯地图上 二,使用axios发送请求 import axios from axios; //引入axiosaxios({url:https://apis.map.qq.com/ws/geocoder/v1,method:get//参数 地址和key值}).then((data)>{console.log(data)});但是使用完报跨…

第二十一章总结博客

网络程序设计基础 局域网与互联网 为了实现两台计算机的通信&#xff0c;必须用一个网络线路连接两台计算机。如下图所示 网络协议 1.IP协议 IP是Internet Protocol的简称&#xff0c;是一种网络协议。Internet 网络采用的协议是TCP/IP协议&#xff0c;其全称是Transmission …