2.RabbitMQ常见高级特性

发布时间:2026/7/16 10:20:01

2.RabbitMQ常见高级特性
本文总结RabbitMQ常见的高级特性,希望能每次看到这篇文章都可以快速理清并理解RabbitMQ的高级特性.消息传输大致流程图:一.消息确认机制:包含两部分(生产者→Broker(RabbitMQ服务器)和Broker---消费者这一过程):1.生产者→Broker:发送方确认机制有两种:confrim模式returns模式2.Broker---消费者:消费者 ACK 确认机制有两种:①:自动确认(默认)(配置autoAcktrue)---针对消息可靠性要求不是很高的场景②:手动确认(配置autoAckfalse)---消息可靠性要求较高的场景1.手动确认方法①:basicAck:消息处理成功,确认签收格式:channel.basicAck(long deliveryTag,boolean multiple)参数:1 deliveryTag:消息唯一标识,MQ用来区分消息2 multiple:{ true: 批量确认tag的所有未被确认的消息false: 只确认当前这条消息②:basicNack:消息处理失败,拒绝消息(支持批量拒绝)格式:channel.basicNack(long deliveryTag,boolean multiple,boolean requeue)参数:12同上3 requeue(是否重新入队):{true:消息重新入队false:直接丢弃消息注:由于消息传输可能成功也可能失败,所以建议basicAck basicNack 配套写③:basicReject:拒绝单挑消息(更轻量,和basicNack功能一样,但是只能拒绝单挑消息,不支持批量)格式:channel.basicReject(long deliveryTag,boolean requeue)参数:同上消息确认SpringBoot代码编写简单样例:Component public class Consumer { RabbitListener(queues test_queue) public void receive(String msg, Channel channel, Message message) { long tag message.getMessageProperties().getDeliveryTag(); try { // 1. 业务处理 System.out.println(消费 msg); // 2. 成功确认 channel.basicAck(tag, false); } catch (Exception e) { // 3. 失败拒绝 channel.basicNack(tag, false, true); } } }2.持久化(RabbitMQ可靠性保证机制之一):RabbitMQ持久化分{①:交换机持久化②:队列持久化③:消息持久化SpringBoot代码展示:1交换机持久化2队列持久化Configuration public class RabbitMQConfig { //持久化 Bean(presQueue) public Queue presQueue(){ //队列持久化 return QueueBuilder.durable(Constants.PRES_QUEUE).build(); //队列非持久化 //return QueueBuilder.nonDurable(Constants.PRES_QUEUE).build(); } Bean(presExchange) public DirectExchange presExchange(){ //交换机持久化 return ExchangeBuilder.directExchange(Constants.PRES_EXCHANGE).durable(true).build(); //交换机非持久化 //return ExchangeBuilder.directExchange(Constants.PRES_EXCHANGE).durable(false).build(); } //绑定关系 Bean(presBinding) public Binding presBinding(Qualifier(presQueue) Queue queue,Qualifier(presExchange) DirectExchange directExchange){ return BindingBuilder.bind(queue).to(directExchange).with(pres); } }3消息持久化RequestMapping(/producer) RestController public class ProducerController { //持久化 RequestMapping(/pres) public String pres() { Message message new Message(Presistent test....getBytes(), new MessageProperties()); //消息非持久化 //message.getMessageProperties().setDeliveryMode(MessageDeliveryMode.NON_PERSISTENT); //消息持久化 message.getMessageProperties().setDeliveryMode(MessageDeliveryMode.PERSISTENT); System.out.println(message); rabbitTemplate.convertAndSend(Constants.PRES_EXCHANGE, pres, message); return 消息发送成功; } }⭐因为消息是存在队列中的,所以消息要持久化,则需要保证交换机持久化队列持久化消息持久化.3.发送方确认(publisher confirm)为避免消息在生产者发送后到达服务器之前丢失,解决方案有:a.通过事务机制实现(用的少)b.通过发送方确认机制实现(常用)------①:confirm模式②:returns模式二者可单独使用或者一起配合使用tips: confirm模式是应用在生产者到交换机,而returns模式应用在交换机到队列4.重试机制(需要yml/properties配置)注:重试机制需要再消息确认方式为自动时,才会生效,那么手动确认怎么实现重试机制这样的效果呢?手动确认其实可以通过在basicNack或basicReject方法中设置requeuetrue参数,来将异常消息重新入队,从而实现重试的效果.⭐自动确认的重试机制和手动确认的重新入队实现重试效果的区别:1自动确认的重试是本地反复重试2手动确认的重试是退回队列重发二者不是同一个机制配置代码:spring: rabbitmq: host: localhost port: 5672 username: guest password: guest listener: simple: acknowledge-mode: auto # 消息自动确认 retry: enabled: true # 开启消费者失败重试 max-attempts: 3 # 最大重试次数,这里是最多重试3次 initial-interval: 1000 # 第一次重试间隔1秒5.设置消息TTL(过期时间)TTL概念:是过期时间,消息的寿命,存活时间,当消息到达设置的过期时间还没有被消费掉,就会被消除.设置消息TTL方式有二:①:设置队列的TTl(存在该队列的所有消息的TTl与队列一致)②:设置消息TTL(消息可单独设置TTL)注:当队列和消息同时设置了同一TTL时,实际TTL取较小值二者区别:①:在设置队列TTL的方法时,一旦消息过期,就会从队列中删除②:设置消息TTL的方法时,即使消息过期,也不会马上从队列中删除,而是在该消息即将被消费者消费之前进行判定后再进行删除.与redis中的key的过期机制的惰性删除一样,6.死信队列(处理消息异常的情况)概念:死信:正常队列里无法被正常消费的消息死信队列:用来存死信的队列消息变成死信一般有以下几种情况:①:消息被消费者拒绝②:消息过期③:队列中的消息数量超出了队列设置的最大长度8.延迟队列由于RabbitMQ本身不直接支持延迟队列的实现,所以可以通过TTL死信队列的方式来间接实现延迟队列延迟队列通过TTL死信队列的实现方式:①设置队列的TTL死信队列----没问题,统一了队列中所有的消息的TTL②设置消息的TTL死信队列----可能有问题当后来的消息的过期时间早于先到的消息时,延迟功能可能会出问题,不生效.如:先发送30s的TTL消息,再发送10s的TTL消息,而10s的TTL消息会在30s的消息过期之后,才进行处理,这明显不合理.需要使用官方提供的延迟插件来专门解决这个问题,从而顺利实现延迟功能⭐引入延迟插件步骤:1需要在RabbitMQ服务端进行安装2下载 .ez插件文件要和 RabbitMQ 版本一致GitHub下载链接https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases/tag/v4.2.03放到 RabbitMQ 的plugins目录4执行启用命令rabbitmq-plugins enable rabbitmq_delayed_message_exchange5重启 RabbitMQ6使用SpringBoot实现代码时,需要添加依赖dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-amqp/artifactId /dependency9.事务RabbitMQ是基于AMQP协议实现的,由于AMQP协议实现了事务的机制,所以RabbitMQ也支持事务机制.RabbitMQ事务允许开发者确保消息的发送和接收是原子性的,要么全部成功,要么全部失败.实现事务三步走(三条都不可少)①:自定义RabbitMQTemplateConfiguration public class RabbitTemplateConfig { Bean(transRabbitTemplate) public RabbitTemplate transRabbitTemplate(ConnectionFactory connectionFactory) { RabbitTemplate rabbitTemplate new RabbitTemplate(connectionFactory); rabbitTemplate.setChannelTransacted(true); return rabbitTemplate; } }②:生产者发送消息③:自定义RabbitTemplate中定义RabbitTransactionMannagerConfiguration public class RabbitTemplateConfig { Bean public RabbitTransactionManager rabbitTransactionManager(ConnectionFactory connectionFactory) { return new RabbitTransactionManager(connectionFactory); } }采用事务后,两条消息中间无异常---同时成功成功执行第一条消息后,在执行第二条消息之前有异常---同时失败,第一条成功执行的也认为失败RequestMapping(/producer) RestController public class ProducerController { Resource(name transRabbitTemplate) private RabbitTemplate transRabbitTemplate; //不采用事务的方式,第一条消息成功,第二条失败 RequestMapping(/trans) public String trans() { System.out.println(trans test...); rabbitTemplate.convertAndSend(,Constants.TRANS_QUEUE,trans test1...); int num5/0; rabbitTemplate.convertAndSend(,Constants.TRANS_QUEUE,trans test2...); return 消息发送成功; } //采用事务的方式,要么期间无异常同时成功,要么期间有异常同时失败 Transactional RequestMapping(/trans2) public String trans2() { System.out.println(trans test...); transRabbitTemplate.convertAndSend(,Constants.TRANS_QUEUE,trans test1...); //int num5/0; transRabbitTemplate.convertAndSend(,Constants.TRANS_QUEUE,trans test2...); return 消息发送成功; } }10.消息分发是什么:将消息分发给多个同时监听同一个队列的不同消费者分发方式:①:限流②非公平分发(负载均衡)代码实现:1(全局)限流(本质:限制单个消费者持有的最大未确认消息数)1配置yml/properties:spring: application: name: rabbit-extensions-demo rabbitmq: addresses: amqp://guest:guestlocalhost:8889/extension listener: simple: acknowledge-mode: manual # 手动确认 prefetch: 1 # 限流核心每次只处理1条消息2负载均衡(本质:设置多个消费者监听同一个队列时,消息默认轮询分发)

相关新闻

Claude Code技能系统架构与开发实践

Claude Code技能系统架构与开发实践

2026/7/16 10:20:01

1. Claude Code技能系统架构解析Claude Code的技能系统是一个模块化扩展框架,允许用户通过创建、管理和共享技能来增强Claude的能力。这套系统由四个核心组件构成:CLAUDE.md:项目级配置文件,定义基础行为准则Hooks:事件…

电子工程师必备:总线分类、特性与选型实战指南

电子工程师必备:总线分类、特性与选型实战指南

2026/7/16 10:20:01

1. 电子工程师必知的总线分类与特性解析 作为一名在嵌入式系统领域摸爬滚打多年的工程师,我见过太多同行在项目初期因为总线选型不当而导致的"返工灾难"。记得去年有个智能家居项目,团队将温湿度传感器通过I2C总线连接主控,结果在3…

Qt Creator的下载、安装与配置(Windows):从零到一的完整避坑指南

Qt Creator的下载、安装与配置(Windows):从零到一的完整避坑指南

2026/7/16 10:20:01

1. Qt Creator简介与开发优势Qt Creator是Qt官方推出的跨平台集成开发环境(IDE),专为Qt应用程序开发设计。我第一次接触Qt Creator是在2013年,当时就被它强大的代码补全和可视化设计功能惊艳到了。经过这些年的发展,Qt…

Claude Code CLI 工具安装与终端实战指南

Claude Code CLI 工具安装与终端实战指南

2026/7/16 11:40:05

1. 先说清楚:Claude Code 不是官方产品,而是社区驱动的 CLI 工具很多人点进这篇教程时,第一反应是:“Claude 官方终于出命令行工具了?”——这是个非常典型的误解,也是我最初踩的第一个坑。去年底在 GitHub…

STM32 继电器驱动电路实战:从三极管选型到PCB布局的避坑指南

STM32 继电器驱动电路实战:从三极管选型到PCB布局的避坑指南

2026/7/16 11:40:04

1. 继电器驱动电路基础:为什么需要三极管? 第一次用STM32驱动继电器时,我直接拿IO口接继电器线圈,结果芯片发烫到能煎鸡蛋——后来才知道,STM32的IO口驱动电流通常只有20mA,而普通继电器吸合需要50mA以上。…

四类用户画像对应不同Agent平台,你是哪一种?——2026企业级AI Agent选型全攻略

四类用户画像对应不同Agent平台,你是哪一种?——2026企业级AI Agent选型全攻略

2026/7/16 11:40:04

在AI Agent技术全面爆发的2026年,智能体已不再仅仅是简单的聊天机器人,而是演变为能够拆解任务、调用工具、进行多步推理并深入复杂业务场景的“数字员工”。随着技术的成熟,市场已形成差异化的Agent平台服务体系。企业在面对纷繁复杂的选项时…

易语言多线程实战:从API封装到线程生命周期管理

易语言多线程实战:从API封装到线程生命周期管理

2026/7/16 11:40:04

1. 为什么需要手动管理线程生命周期? 很多易语言开发者刚开始接触多线程时,可能会直接用支持库的 启动线程 命令。这个命令确实方便,但它隐藏了太多底层细节。就像开自动挡汽车虽然轻松,但要真正掌控性能,还得学会手…

Mac OS快捷键全解析:从基础到高阶应用

Mac OS快捷键全解析:从基础到高阶应用

2026/7/16 11:40:04

1. Mac OS 快捷键基础:修饰键与符号解读刚接触Mac的新用户最困惑的往往是键盘上那些陌生的符号。与Windows系统不同,Mac的快捷键组合大量使用独特的修饰键符号。这些符号在菜单栏和官方文档中频繁出现,理解它们是掌握Mac快捷键的第一步。Mac键…

UnrealPakViewer:虚幻引擎Pak文件深度分析与资源优化终极解决方案

UnrealPakViewer:虚幻引擎Pak文件深度分析与资源优化终极解决方案

2026/7/16 11:30:04

UnrealPakViewer:虚幻引擎Pak文件深度分析与资源优化终极解决方案 【免费下载链接】UnrealPakViewer 查看 UE4 Pak 文件的图形化工具,支持 UE4 pak/ucas 文件 项目地址: https://gitcode.com/gh_mirrors/un/UnrealPakViewer 在虚幻引擎项目开发中…

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践

2026/7/16 0:35:09

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator XUnity.AutoTranslator作为Unity游戏社区中最成熟的文本翻译解决方…

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持

2026/7/13 20:43:19

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持 【免费下载链接】raspberrypi-kernel It provides openEuler kernel source for Raspberry Pi 项目地址: https://gitcode.com/openeuler/raspberrypi-kernel 前往项目官网免费下载&…

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧

2026/7/15 0:26:43

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧 【免费下载链接】integration-test The repo contains test suits for system integration test 项目地址: https://gitcode.com/openeuler/integration-test 前往项目官网免费下载:…

Python实现跨境电商商品图批量翻译教程

Python实现跨境电商商品图批量翻译教程

2026/7/16 0:09:31

一、问题引入做跨境电商的卖家朋友,你是否遇到过这样的困扰?每次上架新品到亚马逊、Shopee或Lazada等平台,都需要处理大量商品图片的多语言版本。比如上架200款衣服,每款需要翻译成英语、日语、韩语等5种语言,这意味着…

跨境电商多语言商品图翻译方案实现

跨境电商多语言商品图翻译方案实现

2026/7/16 0:09:31

一、问题引入对于做跨境电商的卖家来说,多语言商品图的制作一直是令人头疼的环节。当你准备在亚马逊、Shopee、Lazada等多个平台同步上架新品时,首先遇到的就是图片翻译问题。以一位做家居用品的卖家为例,他需要将200张商品图片中的英文文案全…

Windows系统文件d3dx9_36.dll丢失找不到问题解决

Windows系统文件d3dx9_36.dll丢失找不到问题解决

2026/7/16 0:09:31

在使用电脑系统时经常会出现丢失找不到某些文件的情况,由于很多常用软件都是采用 Microsoft Visual Studio 编写的,所以这类软件的运行需要依赖微软Visual C运行库,比如像 QQ、迅雷、Adobe 软件等等,如果没有安装VC运行库或者安装…