【MQ】RabbitMq的可靠性保证

消息队列中的可靠性主要是分为三部分:

  • 消息不丢失:确保消息从生产者发送到消费者消息不丢失
  • 消息不重复:确保消息不被重复消费
  • 消息顺序性:确保消费的顺序性

解决方案主要有以下几部分:

  • 消息不丢失
    • 生产者确认机制
    • 持久化机制
    • 消费者确认机制
    • 高可用
  • 消息不重复:
    • 消费者确认机制
    • 消息重试机制
    • 幂等性设计
  • 消息顺序性
    • 单消费者模式
    • 消息编号

生产者确认机制

作用

确保生产者发送的消息成功到达mq,避免消息在传输过程中丢失

实现原理
  1. 生产者会发送消息之后,mq会向生产者返回确认(ack)或未确认(nack)信号
  2. 如果生产者收到ack,说明消息已经成功发送
配置方式
  • 开启生产者确认模式
Channel channel = connection.createChannel();
channel.confirmSelect(); // 开启确认模式
  • 处理确认和未确认
channel.addConfirmListener((sequenceNumber, multiple) -> {// 消息确认System.out.println("Message confirmed: " + sequenceNumber);
}, (sequenceNumber, multiple) -> {// 消息未确认System.out.println("Message not confirmed: " + sequenceNumber);
});
适用场景

对消息可靠性要求高的场景,如金融交易、订单处理等

持久化机制

作用

将消息和队列持久化到磁盘,防止mq重启或者崩溃时消息丢失

实现原理
  1. 队列持久化:将队列中的数据保存在磁盘
  2. 消息持久化:将消息内容保存到磁盘
配置方式
  • 队列持久化
boolean durable = true;
channel.queueDeclare("my_queue", durable, false, false, null);
  • 消息持久化
AMQP.BasicProperties properties = new AMQP.BasicProperties.Builder().deliveryMode(2) // 2 表示持久化消息.build();
channel.basicPublish("", "my_queue", properties, message.getBytes());
适用场景

需要保证消息不丢失的场景,如日志存储、重要数据同步

消费者确认机制

作用

确保消费者成功处理消息之后,mq才会将消息从消息队列中删除,避免消息丢失

实现原理
  1. 消费者处理完成消息后,手动发送ack信号
  2. 如果消费者未发送ack,mq会将消息重新投递给其他消费者
配置方式
  • 开启消费者确认
boolean autoAck = false; // 关闭自动确认
channel.basicConsume("my_queue", autoAck, new DefaultConsumer(channel) {@Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {// 处理消息System.out.println("Received: " + new String(body));// 手动发送 ackchannel.basicAck(envelope.getDeliveryTag(), false);}
});
适用场景

需要确保消息成功处理的场景,如订单处理、消息通知等

死信队列

作用

处理无法正常消费的消息(被拒绝或者过期),避免消息丢失

实现原理
  1. 当消息无法被正常消费时,mq将其转发到死信队列中
  2. 死信队列可以配置独立的交换机和路由规则
配置方式
  • 配置死信队列
Map<String, Object> args = new HashMap<>();
args.put("x-dead-letter-exchange", "my_dlx_exchange"); // 设置死信交换机
args.put("x-dead-letter-routing-key", "my_dlx_routing_key"); // 设置死信路由键
channel.queueDeclare("my_queue", true, false, false, args);
适用场景

需要处理异常消息的场景,如消息重试,失败信息分析等

消息重试机制

作用

当消息处理失败的时候,通过重试机制重新投递消息,确保消息最终被成功处理

实现原理
  1. 消费者捕获异常,并拒绝消息,同时设置requeue=true
  2. 使用死信队列和TTL实现延迟重试
配置方式
  • 拒绝消息,重新入队
channel.basicConsume("my_queue", false, new DefaultConsumer(channel) {@Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {try {// 处理消息System.out.println("Received: " + new String(body));channel.basicAck(envelope.getDeliveryTag(), false);} catch (Exception e) {// 处理失败,拒绝消息并重新入队channel.basicNack(envelope.getDeliveryTag(), false, true);}}
});
适用场景

需要重试机制的场景,如网络抖动、依赖服务不可用等

高可用性

作用

通过集群和经销队里额,确保mq在节点出现故障仍然可以要运行,避免消息丢失。

镜像队列结构是一主多从,所有操作都是主节点完成,然后同步给镜像节 点,如果主节点宕机后,镜像节点会替代成新的主节点

实现原理
  1. 集群:多个mq节点组成的集群,共享数据和队列状态
  2. 镜像队列:将队列镜像到多个节点,确保队列的高可用性
配置方式
  • 集群配置
rabbitmqctl join_cluster rabbit@node1
  • 镜像队列配置
Map<String, Object> args = new HashMap<>();
args.put("x-ha-policy", "all"); // 镜像到所有节点
channel.queueDeclare("my_queue", true, false, false, args);
适用场景

适用于高可用的场景,如分布式系统、关键业务系统等

高可用性数据丢失怎么解决

在镜像队列主从同步的过程中,会出现在主从同步完成前,主节点就已经宕机,可能出现数据丢失。

我们可以通过仲裁队列来进行解决,和镜像队列一样,都是主从模式,支持主从数据同步但是不一样的点就是主从同步基于Raft协议,强一致性

并且使用起来也非常简单,不需要额外的配置,在声明队列的时候只要指定 这个是仲裁队列即可

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

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

相关文章

Jason配置环境变量

jason官网 https://jason-lang.github.io/ https://github.com/jason-lang/jason/releases 步骤 安装 Java 21 或更高版本 安装 Visual Studio Code 根据操作系统&#xff0c;请按照以下具体步骤操作 视窗 下载 Jason 的最新版本&#xff0c;选择“jason-bin-3.3.0.zip”…

SpringBoot 日志与配置文件

SpringBoot 配置文件格式 Properties 格式 Component ConfigurationProperties(prefix "person") //和配置文件person前缀的所有配置进行绑定 Data public class Person {private String name;private Integer age;private Date birthDay;private Boolean like;pr…

【Elasticsearch】 Intervals Query

Elasticsearch Intervals Query 返回基于匹配术语的顺序和接近度的文档。 intervals 查询使用 匹配规则&#xff0c;这些规则由一小组定义构建而成。这些规则然后应用于指定 field 中的术语。 这些定义生成覆盖文本中术语的最小间隔序列。这些间隔可以进一步由父源组合和过滤…

HarmonyOS DevEco Studio模拟器点击运行没有反应的解决方法

HarmonyOS DevEco Studio模拟器点击运行没有反应的解决方法 翻遍了CSDN&#xff0c;试了所有办法都没办法&#xff0c;最后偶然间竟然解决了 解决方法其实很简单&#xff1a;本地模拟器下载路径下面不能有中文。。。。。 切换正确路径以后&#xff0c;成功运行&#xff0c;哦…

删除数组中的重复项(leetcode刷题)

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

网站快速收录:优化图片与视频的SEO策略

本文转自&#xff1a;百万收录网 原文链接&#xff1a;https://www.baiwanshoulu.com/29.html 优化图片与视频的SEO策略对于网站快速收录至关重要。以下是一些具体的策略&#xff0c;旨在提高图片与视频在搜索引擎中的可见性和收录率&#xff1a; 一、图片SEO优化策略 选择合…

虚幻基础16:locomotion direction

locomotion locomotion&#xff1a;角色运动系统的总称&#xff1a;包含移动、奔跑、跳跃、转向等。 locomotion direction 玩家输入 玩家输入&#xff1a;通常代表玩家想要的移动方向。 direction 可以计算当前朝向与移动方向的Δ。从而实现朝向与移动(玩家输入)方向的分…

单片机基础模块学习——超声波传感器

一、超声波原理 左边发射超声波信号&#xff0c;右边接收超声波信号 左边的芯片用来处理超声波发射信号&#xff0c;中间的芯片用来处理接收的超声波信号 二、超声波原理图 T——transmit 发送R——Recieve 接收 U18芯片对输入的N_A1信号进行放大&#xff0c;然后输入给超声…

基于 NodeJs 一个后端接口的创建过程及其规范 -- 【elpis全栈项目】

基于 NodeJs 一个后端接口的创建过程及其规范 一个接口的诞生&#xff1a; #mermaid-svg-46HXZKI3fdnO0rKV {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-46HXZKI3fdnO0rKV .error-icon{fill:#552222;}#mermaid-sv…

MySQL(高级特性篇) 14 章——MySQL事务日志

事务有4种特性&#xff1a;原子性、一致性、隔离性和持久性 事务的隔离性由锁机制实现事务的原子性、一致性和持久性由事务的redo日志和undo日志来保证&#xff08;1&#xff09;REDO LOG称为重做日志&#xff0c;用来保证事务的持久性&#xff08;2&#xff09;UNDO LOG称为回…

【设计模式-行为型】备忘录模式

一、什么是备忘录模式 来到备忘录模式了&#xff0c;这个模式我感觉相对简单一些&#xff0c;就是备份&#xff0c;或者快照。跟前面一样为了加深理解&#xff0c;我们引入一个电影情结来说明啥是备忘录模式&#xff0c;以来加深大家对备忘录模式的认识。那么&#xff0c;在电影…

C# 与.NET 日志变革:JSON 让程序“开口说清话”

一、引言&#xff1a;日志新时代的开启 在软件开发的漫长旅程中&#xff0c;日志一直是我们不可或缺的伙伴。它就像是应用程序的 “黑匣子”&#xff0c;默默地记录着程序运行过程中的点点滴滴&#xff0c;为我们在调试、排查问题以及性能优化时提供关键线索。在早期&#xff…

AI在自动化测试中的伦理挑战

在软件测试领域&#xff0c;人工智能&#xff08;AI&#xff09;已经不再是遥不可及的未来技术&#xff0c;而是正在深刻影响着测试过程的现实力量。尤其是在自动化测试领域&#xff0c;AI通过加速测试脚本生成、自动化缺陷检测、测试数据生成等功能&#xff0c;极大提升了测试…

实验一---典型环节及其阶跃响应---自动控制原理实验课

一 实验目的 1.掌握典型环节阶跃响应分析的基本原理和一般方法。 2. 掌握MATLAB编程分析阶跃响应方法。 二 实验仪器 1. 计算机 2. MATLAB软件 三 实验内容及步骤 利用MATLAB中Simulink模块构建下述典型一阶系统的模拟电路并测量其在阶跃响应。 1.比例环节的模拟电路 提…

C++小病毒-1.0勒索(更新次数:2)

内容供学习使用,不得转卖,代码复制后请1小时内删除,此代码会危害计算机安全,谨慎操作 在C20环境下,并在虚拟机里运行此代码!&#xff0c;病毒带来后果自负! 使用时请删除在main()里的注释,并修改位置至C:\\(看我代码注释)//可以改成WIN Main() #include <iostream> #i…

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.25 视觉风暴:NumPy驱动数据可视化

1.25 视觉风暴&#xff1a;NumPy驱动数据可视化 目录 #mermaid-svg-i3nKPm64ZuQ9UcNI {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-i3nKPm64ZuQ9UcNI .error-icon{fill:#552222;}#mermaid-svg-i3nKPm64ZuQ9UcNI …

小南每日 AI 资讯 | AI模型扩展的快速增长时代正在放缓 | 25/01/30

AI模型扩展的挑战&#xff1a;随着研究人员发现单纯通过增加规模和计算能力难以获得更大回报&#xff0c;AI模型扩展的快速增长时代正在放缓。 GPT-5开发延迟&#xff1a;OpenAI雄心勃勃的GPT-5项目&#xff08;代号&#xff1a;Orion&#xff09;面临着显著的障碍&#xff0c…

指针(C语言)从0到1掌握指针,为后续学习c++打下基础

目录 一&#xff0c;指针 二&#xff0c;内存地址和指针 1&#xff0c;什么是内存地址 2&#xff0c;指针在不同系统下所占内存 三&#xff0c;指针的声明和初始化以及类型 1,指针的声明 2,指针 的初始化 1&#xff0c; 初始化方式优点及适用场景 4,指针的声明初始化类型…

备赛蓝桥杯之第十五届职业院校组省赛第三题:产品360度展示

提示&#xff1a;本篇文章仅仅是作者自己目前在备赛蓝桥杯中&#xff0c;自己学习与刷题的学习笔记&#xff0c;写的不好&#xff0c;欢迎大家批评与建议 由于个别题目代码量与题目量偏大&#xff0c;请大家自己去蓝桥杯官网【连接高校和企业 - 蓝桥云课】去寻找原题&#xff0…

如何构建树状的思维棱镜认知框架

在思维与知识管理中&#xff0c;“树状思维棱镜”通常指一种层级式、可多维度展开和不断深入&#xff08;下钻&#xff09;的认知框架。它不仅仅是普通的树状结构&#xff08;如传统思维导图&#xff09;&#xff0c;更强调“棱镜”所体现的多视角、多维度切换与综合分析的能力…