RabbitMQ 高级功能
RabbitMQ 是一个广泛使用的开源消息代理,它支持多种消息传递协议,可以在分布式系统中用于可靠的消息传递。除了基本的消息队列功能外,RabbitMQ 还提供了一些高级功能,增强了其在高可用性、扩展性和灵活性方面的能力。以下是一些主要的高级功能:
1. 高可用性 (High Availability)
-
镜像队列 (Mirrored Queues):
RabbitMQ 提供镜像队列功能,通过将队列的状态和消息复制到多个节点上,从而实现队列的高可用性。如果主节点出现故障,可以无缝地切换到镜像队列上的副本节点。 -
集群模式 (Cluster Mode):
RabbitMQ 可以运行在集群模式下,在多个节点上分布队列和交换器,从而提高系统的可用性和扩展性。集群中的节点可以互相通信,共享消息和队列的元数据。
2. 消息一致性 (Message Consistency)
-
消息确认 (Message Acknowledgements):
消费者可以确认已处理的消息,以确保消息不丢失。如果消息没有被确认,RabbitMQ 会将其重新放回队列中供其他消费者处理。 -
事务 (Transactions):
RabbitMQ 支持 AMQP 事务模式,允许生产者在事务内发布消息并确认消息,以确保消息的原子性和一致性。
3. 消息持久性 (Message Durability)
-
持久化消息 (Persistent Messages):
RabbitMQ 允许将消息标记为持久化,以确保在代理重启后消息不会丢失。持久化消息会被写入磁盘,而不是只存储在内存中。 -
持久化队列 (Durable Queues):
持久化队列在代理重启后依然存在,确保队列元数据不会丢失。
4. 高吞吐量和并发 (High Throughput and Concurrency)
-
批量确认 (Batch Acknowledgements):
允许消费者批量确认消息,减少网络和 I/O 开销,提高吞吐量。 -
预取计数 (Prefetch Count):
通过设置预取计数,消费者可以在处理完指定数量的消息后再从队列中获取新消息,从而控制消息的并发处理。
5. 插件和扩展 (Plugins and Extensions)
-
插件系统 (Plugin System):
RabbitMQ 提供了一个灵活的插件系统,用户可以加载和卸载插件以增加功能。例如,Shovel 插件用于跨集群转发消息,Federation 插件用于跨地理位置分布的消息传递。 -
管理插件 (Management Plugin):
提供一个基于 Web 的用户界面,用于监控和管理 RabbitMQ 实例,包括查看队列状态、交换器配置、消息速率等。
6. 安全性 (Security)
-
TLS/SSL 加密:
RabbitMQ 支持使用 TLS/SSL 进行消息传输加密,确保消息在传输过程中的安全性。 -
访问控制 (Access Control):
RabbitMQ 提供基于用户、角色和权限的访问控制机制,允许管理员配置细粒度的访问权限。
7. 消息路由和交换 (Message Routing and Exchange)
-
不同类型的交换器 (Exchanges):
RabbitMQ 支持多种类型的交换器,包括 Direct、Topic、Fanout 和 Headers 交换器,满足不同的消息路由需求。 -
绑定 (Bindings):
通过绑定将队列和交换器连接起来,实现复杂的消息路由策略。
8. 监控和管理 (Monitoring and Management)
-
监控指标 (Metrics):
RabbitMQ 提供详细的监控指标,包括消息速率、队列长度、连接数等,帮助管理员了解系统运行状况。 -
告警和通知 (Alarms and Notifications):
RabbitMQ 可以配置告警,当队列长度超过阈值或节点出现故障时,触发通知。
9. 消息重试和死信队列 (Retry and Dead-Letter Queues)
-
死信队列 (Dead-Letter Exchanges and Queues):
当消息无法被消费或超过重试次数时,可以转发到死信队列进行进一步处理。 -
消息重试 (Message Retry):
支持配置消息重试策略,确保在消费失败时可以重试消费。
10. 混合云和跨数据中心 (Hybrid Cloud and Cross-Datacenter)
- 跨数据中心复制 (Cross-Datacenter Replication):
通过插件或手动配置,RabbitMQ 支持在不同数据中心之间复制消息,确保数据的高可用性和灾难恢复能力。
这些高级功能使得 RabbitMQ 成为一个强大而灵活的消息中间件,适用于各种复杂的分布式系统和应用场景。通过合理利用这些功能,可以构建出高性能、高可用、可扩展的消息传递系统。
常见的高级功能在Spring中的实现方法:
1. 安装和配置
首先,确保你已经在项目中引入了Spring AMQP依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
在 application.properties
文件中配置RabbitMQ连接信息:
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
2. 声明队列、交换器和绑定
在Spring中,可以通过@Bean定义队列、交换器和绑定关系:
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.rabbit.annotation.EnableRabbit;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer;
import org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
@EnableRabbit
public class RabbitConfig {static final String queueName = "testQueue";static final String exchangeName = "testExchange";@BeanQueue queue() {return new Queue(queueName, true);}@BeanDirectExchange exchange() {return new DirectExchange(exchangeName);}@BeanBinding binding(Queue queue, DirectExchange exchange) {return BindingBuilder.bind(queue).to(exchange).with("testRoutingKey");}
}
3. 消息确认
手动消息确认
消费者可以手动确认消息,以确保消息处理的可靠性。使用 @RabbitListener
注解时,可以通过配置 acknowledgeMode
为 MANUAL
,并在方法中手动确认消息:
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.rabbit.listener.api.ChannelAwareMessageListener;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.support.Acknowledgment;public class RabbitMQReceiver {@RabbitListener(queues = "testQueue", ackMode = "MANUAL")public void receiveMessage(Message message, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long tag) {try {// 处理消息System.out.println("Received message: " + new String(message.getBody()));// 手动确认消息channel.basicAck(tag, false);} catch (Exception e) {// 拒绝消息channel.basicNack(tag, false, true);}}
}
4. 消息事务
通过RabbitTemplate实现事务支持:
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;@Service
public class RabbitMQService {@Autowiredprivate RabbitTemplate rabbitTemplate;@Transactionalpublic void sendMessage(String message) {// 发送消息rabbitTemplate.convertAndSend("testExchange", "testRoutingKey", message);// 模拟事务回滚if (message.contains("error")) {throw new RuntimeException("Error occurred");}}
}
5. 死信队列
配置死信队列及其绑定:
@Bean
Queue dlq() {return new Queue("dlq", true);
}@Bean
Binding dlqBinding() {return BindingBuilder.bind(dlq()).to(exchange()).with("dlqRoutingKey");
}@Bean
Queue mainQueue() {Map<String, Object> args = new HashMap<>();args.put("x-dead-letter-exchange", exchangeName);args.put("x-dead-letter-routing-key", "dlqRoutingKey");return new Queue("mainQueue", true, false, false, args);
}
6. 延迟队列
使用插件实现延迟队列,可以通过配置消息的TTL(Time To Live)实现消息延迟投递:
@Bean
Queue delayedQueue() {Map<String, Object> args = new HashMap<>();args.put("x-message-ttl", 60000); // 消息的 TTL 为 60 秒args.put("x-dead-letter-exchange", exchangeName);args.put("x-dead-letter-routing-key", "dlqRoutingKey");return new Queue("delayedQueue", true, false, false, args);
}
7. 并发消费者
通过配置 SimpleRabbitListenerContainerFactory
实现并发消费者:
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.listener.SimpleRabbitListenerContainerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class RabbitConfig {@Beanpublic SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory(ConnectionFactory connectionFactory) {SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();factory.setConnectionFactory(connectionFactory);factory.setConcurrentConsumers(3); // 并发消费者数量factory.setMaxConcurrentConsumers(10);return factory;}
}
8. 插件和扩展
利用RabbitMQ的插件功能,例如使用Shovel插件实现跨集群消息转发,或使用Management Plugin进行监控和管理。
相关文章:
RabbitMQ 高级功能
RabbitMQ 是一个广泛使用的开源消息代理,它支持多种消息传递协议,可以在分布式系统中用于可靠的消息传递。除了基本的消息队列功能外,RabbitMQ 还提供了一些高级功能,增强了其在高可用性、扩展性和灵活性方面的能力。以下是一些主…...

软件架构之开发管理
软件架构之开发管理 第 13 章:开发管理13.1 项目的范围、时间与成本13.1.1 项目范围管理13.1.2 项目成本管理13.1.3 项目时间管理 13.2 配置管理与文档管理13.2.1 软件配置管理的概念13.2.2 软件配置管理的解决方案13.2.3 软件文档管理 13.3 软件需求管理13.3.1 需求…...
【Linux 基础】df -h 的输出信息解读
df -h 的输出信息 xxx:~$ df -h Filesystem Size Used Avail Use% Mounted on udev 16G 0 16G 0% /dev tmpfs 3.2G 792K 3.2G 1% /run /dev/sda1 32G 1.7G 30G 6% / tmpfs 16G 0 16G 0% /dev/shm tmp…...

南航秋招指南,线上测评和线下考试
南航秋招简介 南航作为国内一流的航空公司,对人才的需求量非常旺盛,每年也有很多专业对口的工作提供给应届毕业生,对于应届毕业生而言,一定要抓住任何一个应聘机会,并且在规定的范围内进行简历的提交,以便…...

用MATLAB绘制三向应力圆
% 定义主应力值 sigma1 100; % MPa sigma2 50; % MPa sigma3 -33; % MPa sigma_m1(sigma1 sigma3)/2; sigma_m2(sigma1 sigma2)/2; sigma_m3(sigma2 sigma3)/2; % 计算半径 r1 (sigma1 - sigma3) / 2; r2 (sigma1 - sigma2) / 2; r3 (sigma2 - sigma3…...
PyTorch 1-深度学习
深度学习-PyTorch 一: Pytorch1> pytorch简介2> PyTorch 特点&优势3> pytorch简史4> pytorch 库5> PyTorch执行流程6> PyTorch 层次结构二: PyTorch常用的高级API和函数1> 自动求导(Autograd)2> 模型容器(Module)3> 优化器(Optimizer)4&g…...

Hi3861鸿蒙开发环境搭建
1.1 安装配置Visual Studio Code 打开Download Visual Studio Code - Mac, Linux, Windows选择下载安装Windows系统的Visual Studio Code。 下载后进行安装。Visual Studio Code安装完成后,通过内置的插件市场搜索并安装开发所需的插件如图所示: 1.2 安…...
解决RedisTemplate配置JSON序列化后@Cacheable序列化仍然是JDK序列化的问题
问题现象 在参考网上的Redis集成后,配置了RedisTemplate的序列化,配置成功后Cacheable注解的缓存仍然是jdk的序列化,配置无效。 参考配置的类似代码: Bean("redisTemplate") public RedisTemplate<Object, Objec…...
人脸检测+调整分辨率+调整帧率
初始检测:只在视频的前几秒内进行一次人脸检测,以确定主持人的大致位置。计算裁剪框:基于检测到的主持人位置,计算一个以主持人面部为中心的固定裁剪框。视频裁剪:使用计算出的裁剪框对整个视频进行裁剪,将…...

C++相关概念和易错语法(19)(继承规则、继承下的构造和析构、函数隐藏)
1.继承规则 继承的本质是复用,是结构上的继承而不是内容上的继承,近似于在子类中声明了父类的成员变量。 (1)写法:class student : public person 派生类(子类),继承方式&…...
使用GPT-4和ChatGPT构建应用项目
文章目录 项目1:构建新闻稿生成器项目2:YouTube视频摘要项目3:打造《塞尔达传说:旷野之息》专家项目4:语音控制项目1:构建新闻稿生成器 GPT-4和ChatGPT等LLM专用于生成文本。我们可以使用GPT-4和ChatGPT在各种场景中生成文本,举例如下。 电子邮件合同或正式文档创意写作…...

mobx学习笔记
mobx介绍 mobx是一个功能强大,上手容易的状态管理工具。MobX背后的哲学很简单:任何源自应用状态的东西都应该自动地获得。利用getter和setter来收集组件的数据依赖关系,从而在数据发生变化的时候精确知道哪些组件需要重绘。 mobx和redux的区别 mobx更…...
深入理解 Cowboy WebSocket:使用 Erlang/OTP 构建高效的即时通讯(IM)应用
深入理解 Cowboy WebSocket:使用 Erlang/OTP 构建高效的即时通讯(IM)应用 引言 实时通信技术在现代 Web 应用中扮演着核心角色,而 WebSocket 作为其中的关键技术,已成为即时通讯(IM)系统不可或缺的一部分。Cowboy,这个基于 Erla…...

算法的几种常见形式
算法(Algorithm) 算法(Algorithm)是指解决问题或完成任务的一系列明确的步骤或规则。在计算机科学中,算法是程序的核心部分,它定义了如何执行特定的任务或解决特定的问题。算法可以用多种方式来表示和实现…...

SpringBoot新手快速入门系列教程二:MySql5.7.44的免安装版本下载和配置,以及简单的Mysql生存指令指南。
我的教程都是亲自测试可行才发布的,如果有任何问题欢迎留言或者来群里我每天都会解答。 我们要如何选择MySql 目前主流的Mysql有5.0、8.0、9.0 主要区别 MySQL 5.0 发布年份:2005年特性: 基础事务支持存储过程、触发器、视图基础存储引擎…...

Elasticsearch 更新指定字段
Elasticsearch 更新指定字段 准备条件查询数据更新指定字段更新子级字段 准备条件 以下查询操作都基于索引crm_clue来操作,索引已经建过了,本文主要讲Elasticsearch更新指定字段语句,下面开始写更新语句执行更新啦! 查询数据 查…...
Koa.js、Egg.js与Express.js:探析三大Node.js框架的异同
在Node.js的世界里,选择合适的框架对于构建高效、可维护的后端服务至关重要。Express.js、Koa.js 和 Egg.js 是三个备受欢迎的框架,它们各有特色,适用于不同的开发场景。本文旨在深入探讨这三个框架的区别,并通过代码示例帮助开发…...

【MYSQL】如何解决 bin log 与 redo log 的一致性问题
该问题问的其实就是redo log 的两阶段提交 为什么说redo log 具有崩溃恢复的能力 MySQL Server 层拥有的 bin log 只能用于归档,不足以实现崩溃恢复(crash-safe),需要借助 InnoDB 引擎的 redo log 才能拥有崩溃恢复的能力。所谓崩…...

翻译语音识别在线的软件,分享4款实用的软件!
在全球化日益加速的今天,语言沟通已成为人们生活中不可或缺的一部分。无论是商务洽谈、学术交流还是日常交流,翻译语音识别技术都扮演着举足轻重的角色。今天,我们就来揭秘一下,那些能让你在语言沟通中如虎添翼的翻译语音识别软件…...
Qt 的Q_PROPERTY关键字
Qt 的Q_PROPERTY关键字 1. Q_PROPERTY 的由来2. 实现原理3. Q_PROPERTY 的特点4. Q_PROPERTY 的属性5. 应用说明示例代码示例代码连接信号和槽的多种方式处理信号和槽的注意事项 QT的元对象系统1. 元对象系统的由来2. 实现原理3. 元对象系统的特点4. 元对象系统的属性5. 应用说…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...

初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践
在 Kubernetes 集群中,如何在保障应用高可用的同时有效地管理资源,一直是运维人员和开发者关注的重点。随着微服务架构的普及,集群内各个服务的负载波动日趋明显,传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…...
WEB3全栈开发——面试专业技能点P7前端与链上集成
一、Next.js技术栈 ✅ 概念介绍 Next.js 是一个基于 React 的 服务端渲染(SSR)与静态网站生成(SSG) 框架,由 Vercel 开发。它简化了构建生产级 React 应用的过程,并内置了很多特性: ✅ 文件系…...

2025年- H71-Lc179--39.组合总和(回溯,组合)--Java版
1.题目描述 2.思路 当前的元素可以重复使用。 (1)确定回溯算法函数的参数和返回值(一般是void类型) (2)因为是用递归实现的,所以我们要确定终止条件 (3)单层搜索逻辑 二…...