RabbitMQ初入门
1、RabbitMQ是什么
RabbitMQ是“实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,而集群和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均有与代理接口通讯的客户端库。”(引自百度百科)
常用的消息队列有RabbitMQ、RocketMQ等等,下面是它们的对比图:

图片来源:https://www.cnblogs.com/fanBlog/p/12201472.html
换句话说,RabbitMQ是一个开源的消息队列中间件,它实现了高级消息队列协议(AMQP),可以在分布式系统中进行消息传递、异步通信和解耦。RabbitMQ是一个可靠、高效、可扩展的消息代理,可以用于构建高可用、高性能、可伸缩的应用程序。
官网地址:RabbitMQ: easy to use, flexible messaging and streaming — RabbitMQ
2、RabbitMQ的核心概念
-
消息:RabbitMQ中的消息是指要传递的数据,通常是一个字符串或者二进制数据。消息可以包含一些元数据,例如消息ID、时间戳、优先级等。
-
队列:队列是RabbitMQ中存储消息的地方。生产者将消息发送到队列中,消费者从队列中获取消息并进行处理。
-
消息队列(Message Queue):是将需要传输的数据(消息)与队列进行绑定,用队列先进先出机制来实现消息传递。消息队列由 生产者 和 消费者 两部分构成:
-
生产者主要负责产生消息并把消息放入队列中,再由消费者去处理。
-
消费者可以到指定队列中获取消息,或者订阅相应的队列,最后由MQ服务端进行消息推送。
-
-
交换机:交换机是消息的路由中心,它接收从生产者发来的消息,并根据路由规则将消息发送到一个或多个队列中。RabbitMQ支持多种类型的交换机,例如直连交换机、主题交换机、头交换机和扇形交换机。
-
绑定:绑定是交换机和队列之间的关系,它定义了消息从交换机路由到哪个队列中。一个交换机可以绑定多个队列,一个队列也可以被多个交换机绑定。
-
生产者:生产者是消息的发送方,它将消息发送到交换机或者队列中。
-
消费者:消费者是消息的接收方,它从队列中获取消息并进行处理。
生产者、消费者模型-mq的原理,举例

3、RabbitMQ的工作模型

图片来源:【精选】RabbitMQ(一)、基础篇_rabbitmq 5.7.3_普通人zzz~的博客-CSDN博客
4、RabbitMQ的优缺点
优点:
-
可靠性高:RabbitMQ支持持久化消息,即使在消息代理宕机时也能保证消息不会丢失。
-
灵活的路由:RabbitMQ支持多种类型的交换机和路由规则,可以根据业务需求进行灵活配置。
-
高可用性:RabbitMQ支持集群部署,可以实现高可用性和负载均衡。
-
多语言支持:RabbitMQ提供了多种客户端库,支持多种编程语言,例如Java、Python、Ruby等。
-
易于扩展:RabbitMQ可以通过添加节点和集群扩展来满足不同规模的应用需求。
缺点:
-
性能限制:RabbitMQ虽然支持高并发和高吞吐量的消息传递,但是在处理大量消息时,性能会受到限制。这是因为RabbitMQ需要频繁地进行磁盘IO操作,而磁盘IO是相对较慢的,会影响消息传递的速度。
-
配置复杂:RabbitMQ的配置相对来说比较复杂,需要了解交换机、队列、绑定等多个概念,并进行相应的配置。这对于初学者来说可能会增加一定的学习成本。
-
存储占用空间:由于RabbitMQ支持持久化消息,所以它需要占用一定的存储空间来存储消息。如果消息量很大,存储空间的占用也会相应增加。
-
不支持动态扩容:在RabbitMQ集群中,节点的数量是固定的,无法动态扩容。如果需要扩容,需要手动添加新节点,并进行相应的配置。
-
数据处理一致性问题
5、RabbitMQ的应用场景
-
异步任务处理:当系统需要处理一些耗时的任务时,可以使用RabbitMQ来实现异步任务处理。生产者将任务消息发送到RabbitMQ中,消费者从队列中获取任务消息并进行处理,这样可以避免任务阻塞主线程,提高系统的响应速度和并发能力。
-
分布式系统解耦:在一个复杂的分布式系统中,不同的模块之间可能存在依赖关系,使用RabbitMQ可以实现模块之间的解耦。模块之间通过发送和接收消息进行通信,不直接调用对方的接口,从而降低模块之间的耦合性,提高系统的可维护性和扩展性。
-
日志收集和分发:在分布式系统中,日志的收集和分发是一个重要的任务。通过将日志消息发送到RabbitMQ中,可以实现日志的集中存储和分发。消费者可以订阅感兴趣的日志消息,并将其存储到数据库或者发送到其他系统进行进一步处理。
-
消息通知和推送:当系统需要向用户发送通知或者推送消息时,可以使用RabbitMQ来实现消息的异步发送。生产者将消息发送到RabbitMQ中,消费者从队列中获取消息并进行推送,可以实现高效、可靠的消息通知和推送功能。
-
应用解耦和水平扩展:当系统需要进行水平扩展时,可以使用RabbitMQ来实现应用的解耦和负载均衡。多个相同的消费者可以同时从队列中获取消息进行处理,从而提高系统的吞吐量和可伸缩性。
6、⭐RabbitMQ的作用
6.1 削峰
在高并发场景下,流量突然增加会导致系统负载过高,甚至出现宕机等问题。使用RabbitMQ可以将请求分散到不同的消息队列中,通过设置队列的最大长度、超时时间等参数,实现流量控制和削峰的效果。
6.2 解耦
在分布式系统中,各个模块之间需要进行通信,但是直接依赖会导致系统的耦合度过高。使用RabbitMQ可以将不同模块之间的通信通过消息队列进行解耦,每个模块只需要关注自己需要的消息即可,从而提高了系统的灵活性和可维护性。
6.3 异步
在某些场景下,处理某些任务需要较长的时间,如果采用同步方式,会导致请求阻塞,降低系统的性能。使用RabbitMQ可以将任务放入消息队列中,异步地进行处理,从而提高了系统的并发性和吞吐量。
7、⭐安装RabbitMQ的docker容器
7.1 查询并拉取rabbitmq镜像
docker search rabbitmq
docker pull rabbitmq
7.2 创建rabbitmq数据存储文件夹data

7.3 创建运行容器

7.4 开放防火墙端口

7.5 进入rabbitmq容器
输入以下命令:

7.6 重启rabbitmq容器

7.7 访问浏览器管理页面

7.8 浏览器channel的异常和解决方案


测试,可正常访问

小结
总之,RabbitMQ是一款功能强大、可靠性高、易于使用和扩展的消息队列中间件,适合用于构建分布式系统中的异步通信和解耦。
参考:
https://baijiahao.baidu.com/s?id=1697221448518195951&wfr=spider&for=pc
绝对详细的 RabbitMQ入门,看完本系列就够了(一) - 知乎【精选】RabbitMQ(一)、基础篇_rabbitmq 5.7.3_普通人zzz~的博客-CSDN博客绝对详细的 RabbitMQ入门,看完本系列就够了(一) - 知乎
https://www.cnblogs.com/fanBlog/p/12201472.html
感谢阅读,码字不易,多谢点赞!如有不当之处,欢迎反馈指出,感谢!

相关文章:
RabbitMQ初入门
1、RabbitMQ是什么 RabbitMQ是“实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,而集群和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均…...
电脑定时关机
电脑定时关机 1.右键 管理 2. 3. 4. 5. shutdown.exe/s /f /t 06.点击完成就好了 7.这里面可以 看到定时任务和启动 右键有运行 结束 禁用...
【算法】滑动窗口题单——4.不定长滑动窗口(求子数组个数)
文章目录 前言2799. 统计完全子数组的数目解法1——枚举右端点,移动左端点解法2——枚举左端点,扩展右端点 713. 乘积小于 K 的子数组1358. 包含所有三种字符的子字符串数目2302. 统计得分小于 K 的子数组数目2537. 统计好子数组的数目2762. 不间断子数组…...
CMake aux_source_directory 学习
如下,prj是空文件夹; add.h; #include <iostream>using namespace std;int add1(int a, int b); num.h; int num1100; int num2301; add.cpp; #include "add.h"int add1(int i, int j) {return i j; } main.cpp&#x…...
Mybatis中延迟加载~
延迟加载: 等一会加载,在多表关联查询操作的时候可以使用到的一种方案,如果是单表操作就完全没有延迟加载的概念。 多表查询例如,查询用户和部门信息,如果我们仅仅只是需要用户的信息,而不需要用户对应的…...
【C语言】memmove()函数(拷贝重叠内存块函数详解)
🦄个人主页:修修修也 🎏所属专栏:C语言 ⚙️操作环境:Visual Studio 2022 目录 一.memmove()函数简介 1.函数功能 2.函数参数 1>.void * destination 2>.onst void * source 3>.size_t num 3.函数返回值 4.函数头文件 二.memmove()函数…...
04-流媒体-ffmpeg.c源码分析
ffmpeg.c是一个使用ffmpeg库的参考代码,实现了视频格式转换的功能,类似于我们常用的格式工产,源代码的的目录是: ffmpeg-4.2.2/fftools/ffmpeg.c 和前面的ffplay一样,我们分析其源代码,主要只是为了让读者了解ffmpeg.c此文件的大概流程,并且熟悉常用的ffmpeg库的API。 下…...
迭代器 Iterator
迭代器是一种设计模式,它用于遍历集合或容器中的元素,能够访问集合的元素而无需关心集合的内部结构: 特点: 封装集合访问:迭代器封装了对集合元素的访问,通过迭代器访问集合中的元素,而无需了…...
掌握CSS Flexbox,打造完美响应式布局,适配各种设备!
🎬 江城开朗的豌豆:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 📝 个人网站 :《 江城开朗的豌豆🫛 》 ⛺️ 生活的理想,就是为了理想的生活 ! 目录 ⭐ 专栏简介 📘 文章引言 基…...
FlutterUnit 周边 | 收录排序算法可视化
theme: cyanosis 1. FlutterUnit 更新:排序算法可视化 排序算法可视化是用视图层表现出算法执行过程中排序的过程,感谢 编程的平行世界 在 《十几种排序算法的可视化效果,快来看看!👀》》 一文中提供的算法支持。我进行…...
代码随想录Day30 贪心05 LeetCode T435无重叠区间 T763划分字母区间 T56 合并区间
LeetCode T435 无重叠区间 题目链接:435. 无重叠区间 - 力扣(LeetCode) 题目思路: 这题思路和昨天的打气球类似,我们需要按照左区间或者右区间进行排序,然后哦判断第i个区间的左端点和第i-1个区间的右端点的大小关系,,如果大于等于,那么就无需操作,一旦…...
发展高质量存储力,中国高科技力量聚浪成潮
中国信息通信研究院指出,在全球数字化转型与产业变革的浪潮下,算力正在成为改变全球竞争格局的关键力量。而根据最新的《算力基础设施高质量发展行动计划》,算力是集信息计算力、数据存储力和网络运载力于一体的新型生产力。当前,…...
修改svc的LoadBalancer的IP引发的惨案
文章目录 背景修改externalIPs的操作api-server报错日志挽救教训 背景 k8s集群没有接外部负载均衡,部署istio的时候ingressgateway一直pending。 于是手动修改了这个lb svc的externalIP,于是k8s就崩了,如何崩的,且听我还道来。 …...
2520. 统计能整除数字的位数
2520. 统计能整除数字的位数 class Solution {public int countDigits(int num) {int res 0;int o num;while (num > 0) {if (o % (num % 10) 0) {res 1;}num num / 10;}return res;} }...
BeanUtils.copyProperties的用法
常见场景 我们如果有两个具有很多相同属性名的JavaBean对象a和b,想把a中的属性赋值到b,例如 接口中将接收到的前端请求参数XxxReqVo,我们想把这个入参转化为XxxQuery对象作为数据库的查询条件对象 传统做法是手动set,即 XxxQuery xxxQuer…...
【RabbitMQ 实战】12 镜像队列
一、镜像队列的概念 RabbitMQ的镜像队列是将消息副本存储在一组节点上,以提高可用性和可靠性。镜像队列将队列中的消息复制到一个或多个其他节点上,并使这些节点上的队列保持同步。当一个节点失败时,其他节点上的队列不受影响,因…...
PyCharm社区版安装
PyCharm社区版安装 到中国官网下载 https://www.jetbrains.com/zh-cn/pycharm/download/?sectionwindows 首次创建项目,会自动下载安装Python 3.9 社区版的区别 社区版的区别...
【LeetCode每日一题合集】2023.10.16-2023.10.22(只出现一次的数字Ⅲ)
文章目录 260. 只出现一次的数字 III⭐(异或)🐂2652. 倍数求和解法1——枚举模拟解法2—— O ( 1 ) O(1) O(1)容斥原理相似题目——1201. 丑数 III(二分查找容斥原理) 2530. 执行 K 次操作后的最大分数解法1——贪心优…...
尚硅谷大数据项目《在线教育之实时数仓》笔记003
视频地址:尚硅谷大数据项目《在线教育之实时数仓》_哔哩哔哩_bilibili 目录 第7章 数仓开发之ODS层 P015 第8章 数仓开发之DIM层 P016 P017 P018 P019 01、node001节点Linux命令 02、KafkaUtil.java 03、DimSinkApp.java P020 P021 P022 P023 第7章 数…...
【Linux】部署单体项目以及前后端分离项目(项目部署)
一、简介 以下就是Linux部署单机项目和前后端分离项目的优缺点,希望对你有所帮助。 1、Linux部署单机项目: 优点: 1.简化了系统管理:由于所有服务都在同一台机器上运行,因此可以简化系统管理和维护。 2.提高了性能&a…...
【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
