当前位置: 首页 > news >正文

RabbitMQ怎么保障消息的可靠性

RabbitMQ消息可靠性是系统中确保消息不丢失、无重复的重要手段。对于RabbitMQ的消息而言,我们主要从三部分讨论,分别是生产者,broker端,消费者这三大模块来进行讲解


一、生产者端的消息可靠性

1. 消息确认机制(Publisher Confirms)

在生产者端,RabbitMQ提供了消息确认机制(Publisher Confirms)。这个机制可以确保生产者的消息成功发送至Broker端的交换机,避免了生产者发布消息丢失的问题。RabbitMQ会在消息抵达交换机后,返回一个ACK确认,表示消息成功发送至交换机。工作原理如下:

  1. 生产者开启Confirm模式,使用channel.confirmSelect()方法。
  2. 生产者每次发送消息后都会等待RabbitMQ返回的ACK确认。
  3. 如果RabbitMQ返回NACK或超时未返回,则生产者可以重新发送消息,确保消息成功发送。

这种确认机制底层依赖RabbitMQ的内部队列,保持发送顺序,且在性能上优于传统的事务机制。

2. 事务机制

RabbitMQ提供了事务机制,使得生产者可以通过channel.txSelect()开启事务,发送消息后使用channel.txCommit()进行提交。如果提交失败,则会进行回滚。事务机制的可靠性高,但会显著降低系统的吞吐量,因此在实践中更多采用Publisher Confirms代替事务。

二、Broker端的消息可靠性

在消息代理Broker端,RabbitMQ从交换机的路由、消息持久化、队列备份等方面进行可靠性保证。

1. Mandatory参数确保消息路由

在发送消息时,RabbitMQ允许生产者设置mandatory参数为true。此时,如果交换机找不到符合条件的队列,无法将消息路由到任何队列,消息会返回给生产者。这种设计确保了消息不会被误丢弃,有助于消息的可靠性管理。

2. 消息持久化

为了保证消息在RabbitMQ重启后不丢失,可以将消息和队列都设置为持久化。具体方式如下:

  1. 持久化队列:在声明队列时设置durable属性为true
  2. 持久化消息:发送消息时设置deliveryMode=2(2代表持久化)。

在底层实现上,RabbitMQ使用Erlang内存管理和文件存储系统,将持久化消息写入磁盘,并根据磁盘I/O负载进行批量写入优化。持久化虽然会增加一点延迟,但确保了重启时消息依然存在。

3. 镜像队列(Mirrored Queues)

RabbitMQ提供了镜像队列,即HA(高可用)队列。通过将队列在不同的节点上复制,镜像队列可以在单个节点故障时保持消息的完整性和可用性。镜像队列的实现原理如下:

  1. RabbitMQ在集群的多个节点上复制队列及消息。
  2. 当主节点发生故障时,从镜像中选出一个新的主节点继续处理消息。
  3. 客户端在每次连接时会自动与新主节点重新建立连接,继续收发消息。

镜像队列的优势在于数据的高可用性,但会消耗额外的网络资源。

三、消费者端的消息可靠性

消费者在处理消息时,RabbitMQ支持手动ACK确认模式和重发机制。

1. 消费者ACK确认模式

消费者接收消息后,可以选择手动发送ACK确认,表明消息已被成功处理。手动确认的工作机制如下:

  1. 消息被消费后,RabbitMQ等待消费者的ACK确认。
  2. 如果消费者在确认前发生异常或断开连接,消息会被重新加入队列,确保其他消费者可以继续处理。
  3. 在ACK未完成时,RabbitMQ会在内存中保留该消息副本。

这种手动确认模式确保了消息不会因消费者故障而丢失,适用于较为关键的数据流转场景。

2. 死信队列(Dead Letter Queue,DLQ)

当消息由于反复处理失败或到达最大重试次数后,可以被转移到死信队列,供后续分析和处理。RabbitMQ允许配置死信交换机(DLX),在消息达到阈值后自动将其路由至DLQ。这种方式可以有效避免消息丢失。

四、消息传输过程的可靠性保障

在消息传输过程中,RabbitMQ的可靠性保障主要体现在网络传输协议和连接机制上。

1. AMQP协议和传输保障

RabbitMQ基于AMQP协议,提供了面向连接的传输,确保消息在传输中不丢失。AMQP协议包含了数据确认、握手机制,确保在网络传输过程中消息的完整性和可靠性。

2. TLS/SSL加密传输

为了防止数据在传输过程中被篡改或拦截,RabbitMQ支持通过TLS/SSL加密的方式保护消息传输的安全性。SSL加密不仅保障了消息数据安全性,还提供了高可靠性,避免由于网络攻击导致消息被修改或丢失。

3. 心跳机制与连接恢复

RabbitMQ在底层实现了心跳检测机制,以监控客户端连接的状态。在客户端连接断开时,可以通过重试机制恢复连接。尤其在网络不稳定的场景下,心跳机制确保了消费者与Broker的连接可靠性。


五、总结

RabbitMQ通过生产者确认机制、消息持久化、镜像队列、消费者手动确认、死信队列等多层机制,从生产者、Broker、消费者和传输过程四个角度入手,建立了消息可靠性保障体系。RabbitMQ在底层实现上充分考虑了I/O优化、协议可靠性、连接恢复等因素,确保了消息在高并发和网络波动环境下的高可靠性。


http://www.mrgr.cn/news/62818.html

相关文章:

  • 【笔记】数据结构与算法
  • C#之WebView2实现cookie登录,免登操作。
  • 硬盘的管理
  • 不动产自动化填报工具——农村土地确权档案数据生成工具——未来之窗行业应用跨平台架构
  • 网络编程基础-Reactor线程模型-原理剖析
  • 视频智能分析平台LiteAIServer烟火识别软件智能视频分析的新里程碑
  • aab上架谷歌市场流程(apk)
  • python爬取旅游攻略(1)
  • 强化学习数学基础学习(三)
  • 【随笔】为什么transformer的FFN先升维后降维FFN的作用
  • 搜维尔科技:Manus数据手套在水下捕捉精确的手指动作, 可以在有水的条件下使用
  • 全面解析云渲染:定义、优势、分类与发展历程
  • java-参数传递与接收
  • 基于SSM+小程序的宿舍管理系统(宿舍1)
  • 【VM实战】VMware迁移到VirtualBox
  • 【c++篇】:模拟实现string类--探索字符串操作的底层逻辑
  • vite构建Vue3项目:封装公共组件,发布npm包,自定义组件库
  • 利用GATK对RNA-seq数据做call SNP 或 INDEL分析
  • VScode + PlatformIO 了解
  • 案例精选 | 石家庄学院大日志场景下的实名审计实践
  • Rust: 加密算法库 ring 如何用于 RSA 数字签名?
  • 罗马仕、西圣、安克充电宝哪款品牌更好?综合测评对比谁是TOP.1
  • 为Meta Spark准备3D模型
  • vue简介
  • 从0开始学习shell脚本
  • JS面试八股文(四)