RabbitMQ知识点总结和复习

news2024/11/20 11:19:31

      之前项目中用到RabbitMQ的场景主要是订单信息的传递,还有就是利用RabbitMQ的死信队列属性设置,实现延迟队列效果,实现超时支付取消功能,以及在两个不同项目中传递数据等场景。

最近几年的工作中都是一直用的RabbitMQ,几年前简单的写过一些实践的总结。现在再做个稍微全面一点的总结。算是复习。

     浏览器的收藏夹里边保留的有RabbitMQ的管理控制台。之前在2019年写的博客中有讲到安装部署RabbitMQ的教程:消息队列RabbitMQ的使用-CSDN博客

RabbitMQ是一个高级的消息代理(也称为消息队列)。它支持多种消息协议,提供可靠的消息传递服务,并具有易于使用的管理界面。

目录

1.RabbitMQ基本概念

2. RabbitMQ 消息模式

3. RabbitMQ交换机类型

 4.RabbitMQ 消息传递保障

 5.RabbitMQ消息持久化

 6.RabbitMQ 集群与高可用性

 7.RabbitMQ 性能优化

8. RabbitMQ 安全性

9. RabbitMQ 管理与监控

10. RabbitMQ 消息协议支持

 11.RabbitMQ 消息确认与拒绝

12. RabbitMQ 死信队列

 13.RabbitMQ 延迟队列

 14.RabbitMQ 集群搭建

15.RabbitMQ 消息追踪

16. RabbitMQ 消息序列化

 17.RabbitMQ 与微服务

18.RabbitMQ,RocketMQ与Kafka特点对比 

19.Spring Boot整合RabbitMQ


1.RabbitMQ基本概念
概念描述
消息代理RabbitMQ是一个消息代理,用于在分布式系统中传递消息。
消息队列消息队列是消息的集合,按照它们被发送的顺序排列。
交换机交换机将消息路由到队列。
绑定绑定是交换机和队列之间的关联,定义了消息如何从交换机路由到队列。
连接连接是客户端和RabbitMQ服务器之间的网络连接。
通道通道是连接中的一个虚拟通道,用于消息传递。
消费者消费者是一个从队列中接收消息的客户端。
生产者生产者是一个向队列发送消息的客户端。
2. RabbitMQ 消息模式
模式描述
简单模式生产者发送消息,消费者接收消息,无需复杂的路由。
工作模式多个消费者可以公平地接收同一条消息进行处理。
发布/订阅模式消息可以被多个订阅者接收,但每个订阅者只接收一次。
路由模式消息根据路由键(routing key)发送到特定的队列。
拓扑模式结合了路由模式的特点,可以定义更复杂的路由逻辑。
3. RabbitMQ交换机类型
交换机类型描述使用场景
Direct根据消息的路由键将消息发送到与之完全匹配的队列。当需要精确匹配路由键时使用。
Fanout将消息广播到与之绑定的所有队列,忽略路由键。当需要将消息发送到多个队列时使用。
Topic根据消息的路由键与队列绑定时指定的路由键模式匹配程度,将消息路由到一个或多个队列。当需要根据模式匹配路由键时使用。
Headers根据消息的标头信息来决定消息的路由。当需要根据消息的标头信息来路由消息时使用。
 4.RabbitMQ 消息传递保障
保障级别描述
无保障消息可能会丢失。
持久性消息被存储在磁盘上,提高消息的持久性。
确认消息确认机制确保消息被正确处理。
死信队列消息在无法被消费时,会被发送到死信队列。
优先级队列消息根据优先级进行排序,高优先级的消息先被消费。
 5.RabbitMQ消息持久化
持久化项描述
队列持久化当队列被声明为持久化时,即使RabbitMQ服务器重启,队列也不会丢失。
消息持久化当消息被标记为持久化时,即使RabbitMQ服务器重启,消息也不会丢失。但请注意,持久化消息会降低性能。
交换机持久化交换机本身通常不需要持久化,因为交换机只定义了消息路由的逻辑,而不是存储消息。但某些交换机类型(如topic交换机)的绑定可能需要持久化。
持久化策略可以设置持久化策略来指定哪些队列应该被持久化,以及何时将内存中的消息持久化到磁盘。
事务使用事务机制保证消息传递的原子性。在channel上开启。
 6.RabbitMQ 集群与高可用性
概念描述
集群多个RabbitMQ节点协同工作,提供负载均衡和故障转移。
镜像队列队列在多个节点上镜像,提高消息的可用性。
故障转移当一个节点失败时,其他节点可以接管其工作。
持久化队列队列和消息都被持久化存储,确保在节点故障时消息不会丢失。
 7.RabbitMQ 性能优化
优化策略描述
预取限制控制消费者一次从队列中获取的消息数量。
消息批处理批量处理消息以减少网络开销。
索引对队列中的消息进行索引,加快消息检索速度。
负载均衡通过集群和镜像队列实现负载均衡。
资源监控监控节点和队列的资源使用情况,及时调整配置。
8. RabbitMQ 安全性
安全特性描述
用户认证使用用户名和密码进行认证。
访问控制根据用户权限控制对资源的访问。
传输层安全使用TLS加密客户端和服务器之间的通信。
网络隔离将RabbitMQ部署在受保护的网络区域中。
审计日志记录重要的安全事件和系统操作。
9. RabbitMQ 管理与监控
管理工具描述
管理界面提供一个Web界面用于管理RabbitMQ节点和队列。
命令行工具使用RabbitMQ提供的命令行工具进行管理。
监控插件安装监控插件,如Prometheus,进行性能监控。
日志文件查看RabbitMQ的日志文件以了解系统状态和问题诊断。
10. RabbitMQ 消息协议支持
协议描述
AMQP高级消息队列协议,RabbitMQ的核心协议。
STOMP一个简单的文本协议,用于客户端消息传递。
MQTT轻量级的消息传输协议,适用于物联网场景。
HTTP通过HTTP协议进行消息传递。
 11.RabbitMQ 消息确认与拒绝
机制描述
手动确认消费者在处理完消息后手动确认。
自动确认消费者接收到消息后自动确认。
消息拒绝消费者无法处理消息时,可以选择拒绝该消息。
幂等性确保消息即使重复传递也不会被多次处理。
12. RabbitMQ 死信队列
死信队列配置描述
死信队列当消息无法被消费时,会被发送到死信队列。
死信路由定义消息成为死信的条件,如TTL(生存时间)过期。
死信交换机死信队列可以绑定到特定的交换机。
 13.RabbitMQ 延迟队列
延迟队列配置描述
延迟消息消息在指定的延迟时间后才会变为可用。
延迟插件使用延迟插件来实现延迟队列。或者利用死信队列属性特点,实现延迟队列的效果
定时任务使用外部定时任务触发延迟消息的可用性。
 14.RabbitMQ 集群搭建
集群组件描述
节点RabbitMQ集群中的一个独立服务器。
集群形成通过特定的协议和端口使节点相互发现和通信。
集群形成通过特定的协议和端口使节点相互发现和通信。
镜像队列队列在多个节点上进行镜像,以提高可用性和负载均衡。
故障转移集群中的节点可以自动接管失败节点的任务。
元数据同步集群中的节点会同步元数据,以保持一致性。
15.RabbitMQ 消息追踪
追踪机制描述
消息ID每条消息都有一个唯一的ID,用于追踪。
插件使用如rabbitmq_tracing插件来追踪消息。
日志文件查看RabbitMQ的日志文件,了解消息的传递过程。
管理界面通过RabbitMQ的管理界面查看消息状态。
16. RabbitMQ 消息序列化
序列化格式描述
JSON轻量级的数据交换格式,易于人阅读和编写。
XML标记语言,用于存储和传输数据。
MessagePack高效的二进制格式,比JSON更紧凑。
Protobuf由Google开发的高性能序列化框架。
 17.RabbitMQ 与微服务
微服务应用描述
服务解耦微服务之间通过RabbitMQ传递消息,实现解耦。
异步处理服务通过RabbitMQ异步处理任务,提高效率。
流量削峰使用RabbitMQ缓存消息,平滑处理高流量。
服务发现服务通过RabbitMQ实现发现和通信。
18.RabbitMQ,RocketMQ与Kafka特点对比 
特性/中间件RabbitMQRocketMQKafka
官网rabbitmq.comrocketmq.apache.orgkafka.apache.org
开发语言ErlangJavaScala/Java
消息模型队列、发布/订阅队列、发布/订阅、事务、顺序消息队列、发布/订阅、流处理
持久性支持支持支持
路由功能支持支持有限支持
集群支持支持支持支持
事务支持支持不支持
消息确认支持支持支持
死信队列支持支持支持
优先级队列支持支持支持
消息追踪插件支持支持社区插件支持
消息大小限制约2MB4~8MB约1MB
性能高吞吐量,低延迟高吞吐量,低延迟极高吞吐量,延迟较高
使用场景通用消息队列金融级消息队列大数据实时处理
社区活跃度非常高
事务性消息支持支持不支持
顺序消息不原生支持支持不原生支持
批处理能力一般一般优秀
数据倾斜处理一般优秀优秀
跨机房同步支持支持支持

 注意,上表中提到的“消息大小限制”是一个大致的数字,具体限制可能会因配置和中间件的版本不同而有所变化。此外,每个中间件的具体特性和最佳实践可能随时间而发展,因此建议查阅最新的官方文档以获得最准确的信息。

19.Spring Boot整合RabbitMQ

下边用一个示例,演示利用死信队列的特性实现延迟队列的效果;

   19.1 添加RabbitMQ依赖

首先,确保你的Spring Boot项目中已经添加了RabbitMQ的依赖。如果你使用Maven,可以在pom.xml文件中添加如下依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

19.2 配置RabbitMQ连接信息

application.propertiesapplication.yml中配置RabbitMQ连接信息:

spring.rabbitmq.addresses=your_rabbitmq_server_address
spring.rabbitmq.username=your_username
spring.rabbitmq.password=your_password
spring.rabbitmq.virtual-host=your_virtual_host

19.3 定义死信队列和延迟队列

其实没有专门的queue类型是死信队列,都是普通的queue类型,只是在普通的queue中设置了x-dead-letter-exchange,然后指定另一个队列来接收这个队列超时未消费的消息,接收的那个队列就称作死信队列,这个设置了超时的队列,可以暂且叫它延迟队列吧。死信队列(DLQ)是用于存储无法被正常消费的消息。可以创建一个普通的队列作为延迟队列,然后配置其TTL(生存时间)和死信交换机,使得当消息在延迟队列中生存时间超过TTL后,消息会被发送到死信队列。

@Bean
public Queue delayQueue() {
    Map<String, Object> arguments = new HashMap<>();
    arguments.put("x-dead-letter-exchange", "deadLetterExchange");
    arguments.put("x-dead-letter-routing-key", "deadLetterRoutingKey");
    arguments.put("x-message-ttl", 5000); // 设置消息的TTL为5000毫秒
    return new Queue("delayQueue", true, false, false, arguments);
}

@Bean
public Queue deadLetterQueue() {
    return new Queue("deadLetterQueue", true, false, false);
}

@Bean
public Exchange deadLetterExchange() {
    return new DirectExchange("deadLetterExchange", true, false);
}

19.4绑定死信队列

将死信队列绑定到死信交换机,并指定路由键:

@Bean
public Binding deadLetterBinding(Queue deadLetterQueue, Exchange deadLetterExchange) {
    return BindingBuilder.bind(deadLetterQueue).to(deadLetterExchange).with("deadLetterRoutingKey");
}

19.5 发送消息到延迟队列

 发送消息到delayQueue,消息将被存储直到TTL过期:

@Autowired
private RabbitTemplate rabbitTemplate;

public void sendDelayedMessage(String message) {
    rabbitTemplate.convertAndSend("delayQueue", message);
}

19.6 消费死信队列中的消息

创建一个消费者监听死信队列,以处理过期的消息:

@Component
public class DeadLetterConsumer {

    @RabbitListener(queues = "deadLetterQueue")
    public void receiveDeadLetter(String message) {
        // 处理死信消息
        System.out.println("Received dead letter message: " + message);
    }
}

通过以上步骤,在Spring Boot应用中整合RabbitMQ,并通过死信队列特性实现延迟队列的效果。消息在延迟队列中超过预设的TTL后,将自动成为死信,并被发送到配置的死信队列中,从而实现了延迟处理消息的需求。

个人感觉RabbitMQ比RocketMQ和Kafka要简单,而且管理起来也方便,而且RabbitMQ性能也不错,而且功能也能满足绝大部分企业项目要求,可以作为首选。

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

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

相关文章

谈谈Tcpserver开启多线程并发处理遇到的问题!

最近在学习最基础的socket网络编程&#xff0c;在Tcpserver开启多线程并发处理时遇到了一些问题&#xff01; 说明 在linux以及Windows的共享文件夹进行编写的&#xff0c;所以代码中有的部分使用 #ifdef WIN64 ... #else ... #endif 进入正题&#xff01;&#xff01;&…

Word文件后缀

Word文件后缀 .docx文件为Microsoft Word文档后缀名&#xff0c;基于XML文件格式 .dotm为Word启用了宏的模板 .dotx为Word模板 .doc为Word97-2003文档&#xff0c;二进制文件格式 参考链接 Word、Excel 和 PowerPoint 的文件格式参考 Learn Microsoft

基于OpenCv的图像特征点检测

⚠申明&#xff1a; 未经许可&#xff0c;禁止以任何形式转载&#xff0c;若要引用&#xff0c;请标注链接地址。 全文共计3077字&#xff0c;阅读大概需要3分钟 &#x1f308;更多学习内容&#xff0c; 欢迎&#x1f44f;关注&#x1f440;【文末】我的个人微信公众号&#xf…

蓝桥杯练习系统(算法训练)ALGO-947 贫穷的城市

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述 某城市有n个小镇&#xff0c;编号是1~n。由于贫穷和缺乏城市规划的人才&#xff0c;每个小镇有且仅有一段单向的公路通往别…

Activiti7 开发快速入门【2024版】

记录开发最核心的部分&#xff0c;理论结合业务实操减少废话&#xff0c;从未接触工作流快速带入开发。假设你是后端的同学学过JAVA和流程图&#xff0c;则可以继续向后看&#xff0c;否则先把基础课程书准备好先翻翻。 为什么要工作流 比起直接使用状态字段&#xff0c;工作…

上海计算机学会2021年1月月赛C++丙组T2康托表

题目背景 康托是一名数学家&#xff0c;他证明了一个重要的定理&#xff0c;需要使用一张表&#xff1a; 这个表的规律是&#xff1a; 从上到下&#xff1a;每一行的分子依次增大&#xff1b;从左到右&#xff1a;每一列的分母依次增大。 康托以一种不重复、不遗漏的方式&am…

旅游系列之:庐山美景

旅游系列之&#xff1a;庐山美景 一、路线二、住宿二、庐山美景 一、路线 庐山北门乘坐大巴上山&#xff0c;住在上山的酒店东线大巴游览三叠泉&#xff0c;不需要乘坐缆车&#xff0c;步行上下三叠泉即可&#xff0c;线路很短 二、住宿 长江宾馆庐山分部 二、庐山美景

基于ZYNQ7020的ARM+FPGA模块化仪器

模块化仪器平台基于 FPGA控制器&#xff0c; 搭配丰富灵活的仪器模块&#xff0c;如万⽤表、⽰波器、信 号发⽣器、数据记录仪、⾳频分析仪等&#xff0c;涵盖了⾼精度信号、⾼速与射频信号测试测量与处理&#xff0c;提供了从验证到试产到量产的全过程测试测量技术与解决⽅案&…

实景AI自动直播系统引领直播新时代,争做行业销量领跑者。

实景AI自动直播系统引领直播新时代&#xff0c;争做行业销量领跑者&#xff01; 在当今时代&#xff0c;随着科技的飞速发展&#xff0c;AI技术正逐渐渗透到各个行业中。马云曾明确指出&#xff0c;新兴事物经历着从“看不见”、“看不起”、“看不懂”到“来不及”的四个阶段。…

C语言案例04 -流程控制-逻辑符的正确使用

****一.C语言逻辑运算符详解&#xff1a;逻辑与&&与逻辑或||的运用及其短路特性 你知道吗&#xff1f;逻辑运算符&&和||可是C语言世界的“流量担当”&#xff0c;它们不仅实力强大&#xff0c;还自带神秘光环——短路效应 &#x1f4dd;短路法则揭秘&#xf…

短视频矩阵系统ai剪辑 矩阵 文案 无人直播四合一功能核心独家源头saas开发

抖去推矩阵AI小程序是一款针对短视频平台的智能创作和运营工具&#xff0c;它具有以下功能特点&#xff1a; 1.批量视频生成&#xff1a;抖去推可以在短时间内生成大量视频&#xff0c;帮助商家快速制作出适合在短视频平台上推广的内容 2.全行业覆盖&#xff1a;适用于多个行业…

【前端学习——防抖和节流+案例】

定义 【前端八股文】节流和防抖 防抖 连续触发事件但是在设定的一段时间内只执行最后一次 代码实现思路【定时器】 大概意思就是&#xff1a; 每次按起键盘后&#xff0c;都将之前的定时器删除&#xff0c;重新开始计时。 节流 连续触发事件&#xff0c;只执行一次 …

分享一份物联网 SAAS 平台架构设计

一、架构图**** 二、Nginx**** 用于做服务的反向代理。 三、网关**** PaaS平台所有服务统一入口&#xff0c;包含token鉴权功能。 四、开放平台**** 对第三方平台开放的服务入口。 五、MQTT**** MQTT用于设备消息通信、内部服务消息通信。 六、Netty**** Socket通信设…

docker mysql更新升级版本

一、环境说明 操作系统&#xff1a;Centos7 数据库版本&#xff1a;MySql 8.0.22 数据库中数据量不大&#xff0c;处于开发/测试环境&#xff0c;风险较低 二、升级原因 升级是因为测评漏洞&#xff0c;在进行国家三级等级保护测评过程中&#xff0c;漏扫发现多个MySql漏洞…

[论文阅读] 测试时间自适应TTA

最初接触 CVPR2024 TEA: Test-time Energy Adaptation [B站]&#xff08;1:35:00-1:53:00&#xff09;https://www.bilibili.com/video/BV1wx4y1v7Jb/?spm_id_from333.788&vd_source145b0308ef7fee4449f12e1adb7b9de2 实现&#xff1a; 读取预训练好的模型参数设计需要更…

数字化战略|数字化建设总体规划蓝图PPT(建议收藏)

摘要 这份头部咨询公司关于数字化转型的报告为企业管理者和技术人员提供了一份详尽的数字化转型指南。报告从战略出发&#xff0c;详细阐述了数字生态体系建设、数字化核心方案构建、管理协同能力提升以及数据集中管理和应用能力增强等关键环节。对于从业者而言&#xff0c;报…

JAVA语言开发的智慧城管系统源码:技术架构Vue+后端框架Spring boot+数据库MySQL

通过综合应用计算机技术、网络技术、现代通信技术等多种信息技术&#xff0c;充分融合RS遥感技术、GPS全球定位技术、GIS地理信息系统&#xff0c;开始建设一个动态可视的、实时更新的、精细量化的城市管理系统。智慧城管将采用云平台架构方式进行建设&#xff0c;基于现有数字…

protobuf在配置文件管理上的应用

TextFormat::ParseFromString 是 Google Protocol Buffers&#xff08;通常简称为 Protobuf&#xff09;库中的一个函数&#xff0c;用于从文本格式解析消息。Protobuf 是一种用于序列化结构化数据的库&#xff0c;它允许你定义数据的结构&#xff0c;然后自动生成源代码来处理…

neo4j 的插入速度为什么越来越慢,可能是使用了过多图谱查询操作

文章目录 背景描述分析解决代码参考neo4j 工具类Neo4jDriver知识图谱构建效果GuihuaNeo4jClass 背景描述 使用 tqdm 显示&#xff0c;处理的速度&#xff1b; 笔者使用 py2neo库&#xff0c;调用 neo4j 的API 完成节点插入&#xff1b; 有80万条数据需要插入到neo4j图数据中&am…

基于SSM的校园短期闲置资源置换平台(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的校园短期闲置资源置换平台&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过…