RabbitMQ的特点和消息可靠性保障

掌握RabbitMQ的核心知识,需从其特点和消息可靠性保障(尤其是消息丢失解决方案)两方面入手,以下是详细说明:

一、RabbitMQ的核心特点

RabbitMQ是基于AMQP(Advanced Message Queuing Protocol)协议的开源消息中间件,其核心特点如下:

  1. 灵活的消息路由模型
    采用“交换机(Exchange)-队列(Queue)-绑定(Binding)”的三层结构,支持多种交换机类型(Direct、Topic、Fanout、Headers),可根据路由键(Routing Key)或消息属性灵活路由消息,满足复杂业务场景(如广播、按规则过滤消息等)。

  2. 高可靠性
    支持消息持久化(通过设置delivery_mode=2)、队列持久化(durable=true)、交换机持久化,确保RabbitMQ重启后消息不丢失;同时提供消息确认机制(生产者确认、消费者确认),保障消息传递的可靠性。

  3. 高可用性
    支持集群部署和镜像队列(Mirror Queue),镜像队列可将队列数据同步到多个节点,避免单节点故障导致消息丢失,提高系统可用性。

  4. 流量控制与限流
    支持消费者限流(通过basic.qos设置prefetch_count,控制消费者一次接收的消息数量),避免消费者因处理能力不足导致消息堆积或丢失;同时可通过TTL(消息过期时间)和死信队列处理无效消息。

  5. 丰富的附加功能
    支持消息优先级(通过priority属性设置)、延迟消息(通过死信队列+TTL实现,或安装rabbitmq_delayed_message_exchange插件)、消息回溯(通过日志或备份)等,满足多样化业务需求。

二、消息丢失的解决方案

消息在传递过程中可能因生产者发送失败、RabbitMQ服务器故障、消费者处理失败三个环节丢失,需针对性解决:

1. 生产者发送消息时丢失(未到达RabbitMQ)

原因:网络波动、生产者未确认消息是否被RabbitMQ接收,导致消息在传输中丢失。

解决方案

  • 开启生产者确认机制(Publisher Confirm)
    生产者通过channel.confirmSelect()开启确认模式,RabbitMQ在成功接收消息并持久化后,会向生产者返回确认通知(basic.ack);若失败则返回否定通知(basic.nack)。生产者通过监听确认结果,可重试未确认的消息。

    channel.confirmSelect(); // 开启确认模式
    channel.basicPublish(exchange, routingKey, msg);
    if (channel.waitForConfirms()) { // 等待确认// 消息发送成功
    } else {// 消息发送失败,重试
    }
    
  • 处理消息路由失败场景(Publisher Return)
    若消息无法路由到队列(如交换机未绑定队列、路由键不匹配),RabbitMQ默认会丢弃消息。可通过channel.addReturnListener()监听路由失败的消息,将其转发到备份队列或重试。

    channel.addReturnListener((replyCode, replyText, exchange, routingKey, properties, body) -> {// 处理路由失败的消息(如转发到备份交换机)
    });
    // 发送消息时设置mandatory=true,强制返回路由失败的消息
    channel.basicPublish(exchange, routingKey, true, properties, body);
    
  • 使用备份交换机(Alternate Exchange)
    为交换机设置备份交换机(AE),当消息无法路由到目标队列时,会自动转发到AE绑定的备份队列,避免消息被丢弃。

2. RabbitMQ服务器存储时丢失(已接收但未持久化)

原因:RabbitMQ宕机时,未持久化的消息(内存中)会丢失;或队列/交换机未持久化,重启后队列消失导致消息丢失。

解决方案

  • 全链路持久化

    • 交换机持久化:创建交换机时设置durable=true,确保重启后交换机不丢失。
    • 队列持久化:创建队列时设置durable=true,确保重启后队列不丢失。
    • 消息持久化:发送消息时设置delivery_mode=2(AMQP协议中持久化标识),确保消息被写入磁盘(而非仅存于内存)。
  • 开启镜像队列(集群环境)
    在集群中配置镜像队列,将队列数据同步到多个节点(如ha-mode=all表示同步到所有节点),避免单节点故障导致消息丢失。

3. 消费者接收消息后丢失(未处理完成)

原因:消费者接收到消息后,未处理完成就宕机,而RabbitMQ默认自动确认(autoAck=true),会删除消息,导致消息丢失。

解决方案

  • 关闭自动确认,开启手动确认(Consumer ACK)
    消费者设置autoAck=false,处理完消息后手动调用basicAck确认;若处理失败,调用basicNackbasicReject拒绝(可设置requeue=true让消息重新入队,避免丢失)。

    // 消费者接收消息时关闭自动确认
    channel.basicConsume(queueName, false, (consumerTag, delivery) -> {try {// 处理消息processMessage(delivery.getBody());// 处理完成,手动确认channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);} catch (Exception e) {// 处理失败,拒绝并重新入队channel.basicNack(delivery.getEnvelope().getDeliveryTag(), false, true);}
    }, consumerTag -> {});
    
  • 消费者限流(避免过载)
    通过basic.qos设置prefetch_count(如prefetch_count=1),控制消费者一次仅接收1条消息,处理完成并确认后再接收下一条,避免因消息堆积导致处理失败。

总结

RabbitMQ的消息可靠性需通过生产者确认+全链路持久化+消费者手动确认三环节协同保障,同时结合镜像队列(集群)和备份交换机等机制,可最大程度避免消息丢失。实际应用中需根据业务场景(如一致性要求、性能需求)调整配置,平衡可靠性与效率。

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

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

相关文章

项目升级啦

公司要新做一个医疗行业的业务,经过业务端和产品端的评估该业务与公司已有的产品线关联不大,用户后续也不想在老系统那台老爷车上继续使用,话说老系统到现在差不多10年了,中间经历过的前后端开发者形形色色,维护者换了…

Android中页面生命周期变化

一、Activity切换的生命周期变化(A启动B)1. 标准流程(B完全覆盖A)完整生命周期路径:Activity A:onPause():失去焦点,仍部分可见onStop():完全不可见(当B完全覆…

自动驾驶控制算法——PID算法

自动驾驶控制算法——PID算法 文章目录自动驾驶控制算法——PID算法一、PID 是什么?二、PID 原理2.1 **比例环节(P)**2.2 **积分环节(I)**2.3 **微分环节(D)**2.4 特点总结2.5 案例分析 —— 小…

Spring Boot 异步执行方式全解析:@Async、CompletableFuture 与 TaskExecutor 对比

在 Spring Boot 开发中,异步执行是提升系统性能的重要手段,尤其适用于处理耗时操作(如日志记录、邮件发送、数据同步等)。本文将深入对比 Spring Boot 中三种主流的异步实现方式 ——Async注解、手动CompletableFuture和直接使用T…

高效微调2:Prompt-Tuning原理与实战

高效微调2:Prompt-Tuning原理与实战 Prompt-Tuning原理介绍 代码 Prompt-Tuning原理介绍 Prompt-Tuning Prompt-Tuning的思想:冻结主模型全部参数,在训练数据前加入一小段Prompt,只训练Prompt的表示层,即一个Embedding模块。其中,Prompt.又存在两种形式,一种是hard promp…

使用BART模型和T5模型实现文本改写

BART模型BART(Bidirectional and Auto-Regressive Transformers)是由 Facebook AI Research(FAIR)在 2019 年提出的序列到序列(seq2seq)预训练模型,论文发表于《BART: Denoising Sequence-to-Se…

电商前端Nginx访问日志收集分析实战

使用FileBeatLogstashES实现分布式日志收集 在大型项目中 ,往往服务都是分布在非常多不同的机器上 ,每个机器都会打印自己的log日志 但是 ,这样分散的日志 ,本来就无法进行整体分析。再加上微服务的负载均衡体系 ,甚至…

TwinCAT3示例项目1

目录一、需求分析二、程序编写1.实现1盏灯的自控(IF、TOF)2. 添加模式控制(Case、枚举)3. 添加多盏灯(FOR、数组)4. 添加多组灯(二维数组)END项目结合了,FB,I…

如何在 VMware Workstation 虚拟机中利用 Nvidia 显卡的硬件加速功能

这篇文章详细介绍了如何在 VMware Workstation 虚拟机中利用 Nvidia 显卡的硬件加速功能,通过 PCI 设备直通(Pass-Through)技术将显卡分配给虚拟机使用: 在 VMware Workstation 虚拟机中利用 Nvidia 显卡的硬件加速功能 1. 检查…

设计模式(二十二)行为型:策略模式详解

设计模式(二十二)行为型:策略模式详解策略模式(Strategy Pattern)是 GoF 23 种设计模式中最具实用性和广泛影响力的行为型模式之一,其核心价值在于定义一系列算法或行为,并将每个算法封装到独立…

AI+向量化

要理解 Java 如何结合 AI 与向量化,我们需要从向量化的核心概念、AI 中向量化的作用、Java 生态中的实现工具以及具体实践案例四个维度展开。以下是详细解析:一、核心概念:向量化与 AI 的关系向量化(Vectorization)是将…

Bootstap Vue 之b-form-radio-group 不显示选中状态问题

代码类似&#xff1a;<b-form-radio-groupclass"mt-2"required:disabled"dfrmDisabled"v-model"childDikeForm.SafetyAppraisalRank":options"[一, 二, 三, 四]"name"rankradioopt"></b-form-radio-group>经过测…

Shell 脚本实战:基于 for 循环的批量操作三例(账户创建、网络检测与密码管理)

一、编写脚本for1.sh,使用for循环创建20账户&#xff0c;账户名前缀由用户从键盘输入&#xff0c;账户初始密码由用户输入&#xff0c;例如:test1、test2、test3、......、test10实现思路通过read命令获取用户输入的账户前缀和初始密码&#xff1b;加入非空校验&#xff1a;若前…

PBR技术

一 、PBR的概述1.定义策略路由&#xff1a; PBR 是一种覆盖路由器默认路由决策机制的技术。它允许管理员根据策略&#xff08;而不仅仅是目标地址&#xff09;来设置数据包的下一跳 IP 地址、出站接口、IP 优先级/DSCP 值等。路由策略&#xff1a;是指在路由器或三层设备上&…

STM32-ESP8266Wi-Fi模块使用USART实现通信/创建AP和STA模式配置教程(寄存器版)

本章思维导图&#xff1a;ESP8266WIFI模块简介ESP8266 是一款由乐鑫科技推出的低成本、高性能 Wi-Fi 模块&#xff0c;广泛应用于物联网和嵌入式开发领域。WIFI的频段5G和2.4G2.4G Wi-Fi与5G Wi-Fi最本质的区别即工作频段&#xff08;无线电波的频率&#xff09;不一样&#xf…

算法26. 删除有序数组中的重复项

给你一个 非严格递增排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯一元素的数量为 k &#xff0c;你…

ROS2中传输样条曲线

在ROS2中传输样条曲线需要解决两个核心问题&#xff1a;**如何结构化表示曲线数据**和**如何高效传输**。以下是一套完整方案&#xff0c;结合自定义消息设计、序列化优化和QoS配置实现可靠传输&#xff1a;---### &#x1f4d0; 一、定义样条曲线的自定义消息 样条曲线通常由控…

Win11怎样安装DirectX 9

通过微软官方下载安装&#xff1a;确认系统兼容性并准备&#xff1a;确保显卡驱动为最新版本&#xff0c;因为 DirectX 与显卡驱动程序紧密相关。同时&#xff0c;可暂时关闭防病毒软件和防火墙&#xff0c;防止其干扰安装过程。下载安装程序&#xff1a;访问微软官方网站下载 …

RAGFLOW~Enable RAPTOR

Enable RAPTOR 一种递归抽象方法&#xff0c;用于长上下文知识检索和摘要&#xff0c;在广泛语义理解和细微细节之间取得平衡。 RAPTOR&#xff08;递归抽象处理用于树状组织检索&#xff09;是一种在2024年论文中引入的增强文档预处理技术。它旨在解决多跳问答问题&#xff0c…

【机器人+相机通讯】宇树科技相机通信

https://github.com/unitreerobotics/xr_teleoperate/blob/main/README_zh-CN.md 相机驱动与服务端 https://github.com/unitreerobotics/xr_teleoperate/blob/main/teleop/image_server/image_server.py 其中相机如果是realsense, 安装好驱动后&#xff0c;可以使用命令查看…