【RabbitMQ(一)】:基本介绍 | 配置安装与快速入门

应该是新年前最后一篇博客了,明天浅浅休息一下,提前祝大家新年快乐捏!😊😊😊

01. 基础理解

1.1 同步调用和异步调用

👉 同步调用 的时候调用者会 阻塞 等待被调用函数或方法执行完成,并且在完成后才继续执行后续代码。

💡 那这样会出现什么问题呢?

回想一下平时充话费的场景,当我们点击支付了之后,当余额被扣减完之后就可以直接退出了,其实是没有等待服务状态更新,和后面进行的很多业务的,比如短信通知服务也是在充值以后一段时间才会通知的,这其实就是一种异步的方式。

👉试想一下如果是同步调用会出现什么场景?

​ 答案是界面会卡住,等到一切短信发送完成才能得到 结果,这就导致了等待时间的延长;将视角再放的深一点,如果将这些业务都做成同步的话,其中一个业务的失败会导致所有业务的 级联失败,也就是如果短信通知业务失效了,钱甚至会被退回来,这就导致了用户体验的问题;再将视角放到程序员身上,如果设计一个同步业务,有新的业务加入进来,要去该原来的代码,这就导致了 耦合性很高 的问题。

不难总结出来同步调用的问题

  • 加需求的问题(耦合性很差)
  • 性能的问题,客户等待时间过长
  • 一个调用的失败导致级联失败

但任何事物都有两面性,同步调用的优势就是: 立即得到响应的结果 时效性非常好,很多业务必须要一次执行完毕且需要结果才能进行,比如银行转账,需要保证双方都成功才能进行。

👉 而异步调用正好是相反,对于一些不是那么急于知道结果的业务,可以在返回给用户结果后再执行,这就引出了它的优势:首先是 解耦合,业务不需要写在一个代码上,而是可以以微服务的形式拆分开;其次,**立即返回 **给 用户结果,用户无需等待;还可以实现 故障的隔离,一个服务的问题不会导致整个业务的级联失败;最后是可以缓存消息,当消息很多的时候可以 错峰执行,达到削峰填谷的作用。

但缺点就是不能立刻得到处理的结果,时效性比较差,同时实现依赖于 Broker(代理),如果 Broker 出现问题会导致严重的后果。

👉 异步调用中会出现三个角色,分别是消息发送者、消息代理、和消息接收者;消息发送者发送消息到消息代理然后就可以继续执行,消息代理负责将消息转发给消息接收者,剩余的部分在消息接收者那里执行。

1.2 什么是 MQ?

👉 MQ(Message Queue),消息队列,字面来看就是存放消息的队列;也就是异步调用中的 Broker;这个命名也就解释了它的实现机制:MQ 提供了一种 异步通信 的方式,允许将消息发送到队列中,并由接收者从队列中获取和处理这些消息。MQ 通常被用于解耦和增强系统的可伸缩性、可靠性和灵活性。

👉 下面来看一下常见的 MQ Broker:

RabbitMQActiveMQRocketMQKafka
公司 / 社区RabbitApache阿里Apache
开发语言ErlangJavaJavaScala & Java
协议支持AMQP, XMPP, SMTP, STOMPOpenWire, STOMP, REST, REST, SMPP, AMQP自定义协议自定义协议
可用性一般
单机吞吐量一般非常高
消息延迟微秒级毫秒级毫秒级毫秒以内
消息可靠性一般一般

💡 协议:是在通信系统中,用于规定数据传输格式、通信规则和通信过程的一组规范。

💡 单机吞吐量:单个计算机或服务器上处理的消息数量或请求数量的度量

选择 RabbitMQ 的原因是因为它的社区生态好,且各方面性能都很优异,很多公司也都在使用。

02. RabbitMQ介绍即安装方式

2.1 RabbitMQ 安装

这里采用 Docker 的安装方式:

💡 虚拟机的安装与配置,参考我的博客 从零开始 Linux(一):基础介绍与常用指令总结

💡 如果没有安装 Docker 的朋友可以看这一部分安装一下

  • 卸载旧版本的 Docker

    sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine
    
  • 安装 yum 工具

    $ sudo yum install -y yum-utils
    
  • 配置 Docker 的 yum 源

    $ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
    
  • 安装 Docker

    $ sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
    
  • 检验是否安装成功

    $ docker -v
    
  • 启动 Docker

    $ sudo systemctl start docker
    
  • 检测是否启动成功

    $ docker images
    

👉 接下来是使用 Docker 安装 RabbitMQ

$ docker pull rabbitmq$ docker images # 检测是否安装成功

👉 启动容器

$ docker run -d \
--name mq \
-e RABBITMQ_DEFAULT_USER=root \
-e RABBITMQ_DEFAULT_PASS=123456 \
-v mq-plugins:/plugins \
-p 15672:15672 \
-p 5672:5672 \
rabbitmq

💡 这里来简单讲解一下这部分的指令:

  • \ 是换行符,用于多行输入
  • -e:environment,配置环境变量,上面是配置了管理员的用户名和密码,可以自行配置
  • -p:port,配置端口,rabbitmq 有两个提供服务的端口,一个是图形化界面 15672 和实际的业务端口 5672,可以通过 主机名:15672 的方式在浏览器访问界面。
  • --name:配置容器名
  • rabbitmq:是使用的镜像,就是上面拉取下来的镜像,如果不写版本号的话,默认是 @latest

❗ 如果图形化界面无法打开的话很有可能是没开启图形化服务:

$ docker exec -it fb7a78201d31 /bin/bash # 进入镜像内部
$ rabbitmq-plugins enable rabbitmq_management # 开启图形化服务

2.2 整体架构

除去上面提到的 publisherconsumer 这里来具体看一下其内部的部分

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

发送者发送信息给 交换机(exchange),交换机转发路由消息给 queueconsumer 监听队列变化并从队列中取出和处理消息。

💡 为什么需要 exchange,通过后续的学习,是可以将消息直接放到队列中的,但如果要向所有的队列(n 个)中发送消息,就要写 n 次调用代码;如果向固定的队列发送消息又要去定义新的方法,所以交换机就可以通过配置实现路由的效果,将消息按照规定的方式转发到队列。

💡 其中的 Virtual Host 是一种数据隔离手段,很多的消息都可以在同一台 RabbitMQ 服务器上执行,但为了不同模块的区分,需要一个类似命名空间的隔离效果。

2.3 快速入门

💡 任务:通过图形化界面来初步体会消息队列

👉 在这里输入上面配置中设置的账号和密码(镜像启动的配置)

👉 基本界面

👉 首先去 Queues 中创造两个队列

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

💡 先按照我的配置来创造 hello.queue1hello.queue2

👉 关联交换机与队列:交换机肯定不会服务到所有的队列,需要设置交换机与队列之间的 binding

在这里插入图片描述

💡 使用系统默认的交换机,配置关联


👉 发送信息

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

👉 在队列中查看信息

2.4 Virtual Host 体验

👉 找到 Admin 界面下的 Virtual Hosts 可以配置新的 Virtual Host

同时在 Users 界面下可以新增用户,用户如果有创建 Virtual Host 的权利的话,他创建的主机就默认有权限访问,反之则需要 Admin 去手动配置权限

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

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

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

相关文章

《Java 简易速速上手小册》第9章:Java 开发工具和框架 (2024 最新版)

文章目录 9.1 Maven 和 Gradle - 构建与依赖管理的神兵利器9.1.1 基础知识9.1.2 重点案例:使用 Maven 构建 Spring Boot 应用9.1.3 拓展案例 1:使用 Gradle 构建多模块项目9.1.4 拓展案例 2:利用 Gradle Wrapper 确保构建的一致性 9.2 Spring…

InstantBox:开箱即用的临时 Linux 环境

在云计算和虚拟化技术日益成熟的今天,我们有时需要一个快速、简单、临时的 Linux 环境来进行各种任务。这就是 InstantBox 的用武之地。 什么是 InstantBox? InstantBox 是一个开源项目,它可以快速启动临时的 Linux 系统,并提供…

Vue-自定义属性和插槽(五)

目录 自定义指令 基本语法 (全局&局部注册) 指令的值 练习:v-loading 指令封装 总结: 插槽(slot) 默认插槽 插槽 - 后备内容(默认值) 具名插槽 具名插槽基本语法: 具名插槽简化语法: 作…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之StepperItem组件

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之StepperItem组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、StepperItem组件 用作Stepper组件的页面子组件。 子组件 无。 接口 St…

浅谈进制的转换

本文创作灵感来自CSDN咸鱼WCY 的 咸鱼小白学嵌入式之C语言(2.进制) 博主更完就没更了,决定书接上回(喜 进制是个啥 要理解进制,首先哈,咱得知道不同进制的含义 说到底,各个进制其实有点像在…

双活工作关于nacos注册中心的数据迁移

最近在做一个双活的项目,在纠结一个注册中心是在双活机房都准备一个,那主机房的数据如果传过去呢,查了一些资料,最终在官网查到了一个NacosSync 的组件,主要用来做数据传输的,并且支持在线替换注册中心的&a…

java SSM新闻管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM新闻管理系统是一套完善的web设计系统(系统采用SSM框架进行设计开发,springspringMVCmybatis),对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S…

springsecurity6使用

spring security 中的类 : AuthenticationManager : 实现类:ProviderManager 管理很多的 provider ,,, 经常使用的,DaoAuthenticationProvider , 这个要设置一个 UserDetailService , 查找数据库&#xff…

生存类游戏《幻兽帕鲁》从部署服务器到开始体验全过程

SteamDB数据显示,《幻兽帕鲁》上线24小时内,在线人数峰值便突破200万,跻身Steam历史排行榜第二位。随着热度进一步发酵,《幻兽帕鲁》官方发布推文称,游戏发售不到6天,销量已经突破了 800万份。欢迎大家在阿…

‘vue-cli-service‘ 不是内部或外部命令,也不是可运行的程序

遇到 vue-cli-service 不是内部或外部命令,也不是可运行的程序或批处理文件。 的错误时,通常意味着Vue CLI没有被正确安装或配置在项目中。这可能是因为node_modules目录缺失了必要的包,或者局部安装的Vue CLI没有被正确设置到系统的PATH环境…

消息中间件面试篇

目录 消息中间件 RabbitMQ 消息不丢失 生产者确认机制 消息持久化 交换机持久化 队列持久化 消息持久化 消费者确认 消息重复消费 出现的场景 解决方案 每条消息设置一个唯一的标识id 幂等方案:【 分布式锁、数据库锁(悲观锁、乐观锁&#…

【教学类-48-04】202402013“天干地支 六十一甲子”.

背景需求: 2024年是甲辰龙年。 “辛亥革命”“甲午海战”"戊戌变法”都有天干地支的身影。 参观历史建筑,不少书法碑刻上都是用天干地支进行年代记名 所以我用Python来制作60一甲子的所有天干地支组合 60一甲子 天干地支的排序 作者:阿…

JavaScript中有哪些不同的数据类型

在 JavaScript 中,数据类型是一种用来表示数据的分类,它决定了我们可以对这个数据类型执行哪些操作。在 JavaScript 中有以下几种不同的数据类型: 基本数据类型 字符串 (String):表示一组字符,可以使用引号&#xff08…

理解JAVA EE设计模式

理解JAVA EE设计模式 在Web应用程序的设计和开发阶段,开发人员在开发类似的项目时可能会遇到相似的问题。每名开发人员可能会遇到的问题找出不同或相似的解决方案。但是,这导致一些时间和精力浪费在为相似的问题寻找解决方案上。因此,要啊节省时间和精力,需要记录常见问题…

VMware清理拖拽缓存 Ubuntu硬盘情况占用分析

这两天在尝试编译Linux源码,我在win上将源码下载下来然后复制到ubuntu上,这一步我粗略看到了三种方法:安装VM tools,就可以使文件正常的在win和ubuntu中复制剪切;使用scp命令将win和linux系统链接起来;使用…

柚见(伙伴匹配系统)第三期

后端整合SwaggerKnife4j 什么是接口文档 什么是接口文档? 写接口信息的文档, 每条接口包括: 请求参数响应参数错误码接口地址接口名称请求类型请求格式备注 who 谁用? 一般是后端或者负责人来提供,后端和前端都要使用…

Android---PermissionX实现动态权限申请

Google 在 Android 6.0 开始引入了权限申请机制,将所有权限分成了正常权限和危险权限。App 每次在使用危险权限时需要动态的申请并得到用户的授权才能使用。 PermissionX是一个扩展Android库,使Android运行时权限请求变得极其容易。你可以将它用于基本的…

ONLYOFFICE文档8.0新功能浅探

ONLYOFFICE文档8.0新功能浅探 上个月末这个月初的几天,ONLYOFFICE版本更新了!更新到了一个比较整的大的版本号,8.0版本,看来这个生产力工具的升级速度基本上能保持每年两个版本号的速度,还是很快的,一般来…

JavaScript 的点击劫持(Clickjacking)

🧑‍🎓 个人主页:《爱蹦跶的大A阿》 🔥当前正在更新专栏:《VUE》 、《JavaScript保姆级教程》、《krpano》、《krpano中文文档》 ​ ​ ✨ 前言 点击劫持是一种恶意攻击,攻击者会在用户不知情的情况下诱…

在面试中如何回复擅长vue还是react

当面试官问及这个问题的时候,我们需要思考面试官是否是在乎你是掌握vue还是react吗??? 在大前端的一个环境下,当前又有AI人工智能的加持辅助,我们是不是要去思考企业在进行前端岗位人员需求的时候&#xf…