05 | 如何保证消息不丢失

MQ是如何保证消息不丢失的,你这样回答面试官一定说I Want U 目录 序言 RocketMQ RabbitMQ Kafka 序言 又到了金三银四的找工作阶段,你一定被问过MQ是如何保证消息可靠性的或者MQ是如何保证消息不丢失的。我们都知道MQ发送消息一般分为三个阶段分别是生产者发送消息到MQ、MQ存储消息到内存或者硬盘,消费者消费消息。但是这三个过程都有可能因为种种原因导致消息丢失。例如在生产者发送阶段,这个阶段可能由于网络延迟导致mq消息丢失;存储阶段,Broker将消息先放到内存,然后再根据刷盘策略持久化到硬盘上,但是刚收到消息,还没持久化. 阅读详情

对大部分业务系统来说,丢消息意味着数据丢失,是不可接受的。丢消息也成为大部分用消息队列的同学最头痛的问题。

目前主流消息队列产品都提供了完善的消息可靠性机制,保证消息的不丢。

检测消息丢失的方法

丢消息还不知道,是用消息队列的最尴尬情况。一般而言,新系统刚上线,各方面不稳定,需要磨合期,这个时候特别要监控系统中是否有消息丢失的情况。

IT基础设施较完善的公司,都有分布式的链路追踪系统,使用类似追踪系统可以很方便地追踪每条消息。而没有,则可以利用消息的有序性进行验证。

在Producer端,给每个发出的消息附加一个连续递增的序号,然后在consumer端检查这个序号的连续性。

若没有消息丢失,Consumer 收到消息的序号必然是连续递增,或者收到消息,其序号必然是上一条消息的序号+1。如果检测到序号不连续,那就是丢消息了。

大多数消息队列的客户端都支持拦截器机制,可以利用这个拦截器机制,在producer发消息之前的拦截器中将序号注入到消息中,在consumer收到消息的拦截器中检测序号的连续性,这样实现的好处是消息检测的代码不会侵入业务,待系统稳定后,也方便将这部分检测的逻辑关闭或删除。

如果是在一个分布式系统中实现这个检测方法,有几个问题需要注意。

Topic内只能保证分区内有序。因此必须发指定分区的消息,在单分区上检测丢失。

对于Producer多实例,不好协调发送顺序。因此由每个Producer分别生成各自序号,附加上Producer的标识,Consumer端分Producer进行序号有序检测。

对于Consumer多实例,最好保证一个分区被一个consumer检测消息序号的连续性有序性。数量最好和分区数量一致,做到consumer和分区一一对应??

确保消息可靠传递

检测消息丢失不能解决消息丢失。

确保消息的可靠传递,需要找到消息会发生丢失的环节,并找到策略去避免。

首先明确一条消息从产生到被消费的过程

     

             |   生产阶段  | 存储阶段 |   消费阶段   |

Producer  —Send—>  Broker     —Pull—>  Consumer

                <—Ack——                   <—Ack—

  • 生产阶段:消息从Producer通过网络发送到Broker端
  • 存储阶段:消息在Broker端存储,若是集群,消息会在这个阶段被复制到其它的副本上
  • 消费阶段:Consumer从Broker上拉取消息,通过网络传输发送到Consumer上

1. 生产阶段:网络传输导致丢数据。请求-确认机制确保。有些消息队列在一段时间没收到确认会自动重试,重试再不行会抛出异常, 此时业务代码需要重试发送,若使用异步发送则需要在异步回调中捕获异常重试。

2. 存储阶段:Broker宕机导致丢数据。单节点配置写入磁盘后再发送确认,RMQ需要配置同步刷盘。磁盘的损坏导致丢数据。集群多节点配置至少写入两个节点后返回确认

3. 消费阶段:请求-确认机制确保。消费逻辑结束后返回确认。

小结

一条消息从发送到消费的整个流程中,消息队列如何确保可靠性。分为三个阶段,生产,存储,消费。

生产阶段,需要捕获发送错误,并重发消息。

存储阶段,需要配置刷盘和复制相关的参数,让消息写到多个副本的磁盘上,确保不因为某个broker宕机或者磁盘损坏而丢失。

消费阶段,需要处理完业务逻辑再确认。

思考

Broker和Consumer都会收到重复的消息,如何避免重复消费带来的问题?

RocketMQ 如何保证消息不丢失? 在消费者端,需要确保在消息拉取并消费成功之后再给 Broker 返回 ACK,就可以保证消息不丢失了,如果这个过程中 Broker 一直没收到 ACK,那么就可以重试。默认 16 次。 阅读详情

相关推荐

05:消息队列篇(8)

目录 一、MQ有什么用?有哪些具体的使用场景? 二、如何进行产品选型? 三、如何保证消息不丢失? 四、如何保证消息消费的幂等性? 五、如何保证消息的顺序? 六、如何保证消息的高效读写? 七、使用MQ如何保证分布式事务的最终一致性? 八、让你设计一个MQ,你会如何设计? 一、MQ有什么用?有哪些具体的使用场景? MQ: MessageQueue,消息队列。 队列是一种FIFO先进先出的数据结构。消息由生产者发送到MQ进行排队,然后由消费者对消息进行处理。QQ、 微信 就是典型的M

Java 后端|Python|AI 实战博主。专注微服务、分布式、大模型应用开发,输出可落地项目、源码剖析与面试总结。用通俗文字拆解技术难点,记录开发路上的学习与踩坑,期待和大家一起交流成长。 6763

RabbitMQ 保证消息不丢失的几种手段

我们通过分析消息从生产者发送消息到消费者消费消息的全过程,得出了消息可能丢失的几种场景,并给出了相应的解决方案,如果需要保证消息在整条链路中不丢失,那就需要生产端、mq自身与消费端共同去保障。生产端:对生产的消息进行状态标记,开启confirm机制,依据mq的响应来更新消息状态,使用定时任务重新投递超时的消息,多次投递失败进行报警。mq自身:开启持久化,并在落盘后再进行ack。如果是镜像部署模式,需要在同步到多个副本之后再进行ack。

zhiyikeji的博客 6164

SAP生产版本导入避坑大全:从‘黄灯’到‘绿灯’,详解CM_FV_MKAL_CONSISTENCY_CHECK检查函数

本文深入解析SAP生产版本导入过程中的常见问题,特别是通过`CM_FV_MKAL_CONSISTENCY_CHECK`检查函数从‘黄灯’异常到‘绿灯’正常的修复方法。涵盖静态与动态校验机制、典型异常场景诊断及批量导入最佳实践,帮助SAP运维人员高效解决生产版本管理难题。

weixin_30568591的博客 385

消息中间件如何保证不丢失消息

丢失数据场景 丢数据一般分为三种,一种是生产者发送消息失败,一种是mq把消息丢了,一种就是消费时将消息丢了。下面从rabbitmq和kafka分别说一下,丢失数据的场景: A:生产者弄丢了数据 生产者将数据发送到rabbitmq的时候,可能在传输过程中因为网络问题而将数据弄丢了。 B:rabbitmq自己丢了数据 如果未开启rabbitmq的持久化,那么rabbitmq一旦重启,那么数据就丢了。所依必须开启持久化将消息持久化到磁盘,这样就算rabbitmq挂了,恢复之后会自动读取之前存储的数据,一般数据不会

weixin_38446891的博客 1817

别再搞错了!ERA5-Land小时数据里的辐射值,原来不是你想的那个‘瞬时值’

本文深入解析ERA5-Land小时数据中辐射值的累积特性,揭示其与瞬时值的本质区别。通过详细的数据处理方法和Python代码示例,指导研究者正确转换累积辐射量为实用瞬时值,避免常见误区,提升气候模型验证的准确性。

weixin_28700411的博客 208

Ollama最新快速上手指南:从安装到精通本地AI模型部署

想让Ollama跑你的"私房模型"?三种主流格式全支持,总有一款适合你!GGUF格式(推荐新手首选)创建Modelfile文件:执行创建命令:运行你的专属模型:PyTorch/Safetensors格式(适合进阶玩家)先用库测试模型能否正常加载确保模型结构完整后再导入Ollama官方文档有详细转换指南专业小贴士GGUF格式最轻量,PyTorch最灵活,Safetensors最安全遇到问题?试试用llama.cpp进行格式转换7B参数模型推荐使用q4_0量化级别想让AI用马里奥。

全世界的博客 2309

RocketMQ如何保证消息的不丢失

以下防止丢失的方案,都是以增加集群负载,降低吞吐为代价的。这必然会造成集群效率下降。

炭烤玛卡巴卡的博客 4162

营销反作弊之 异常行为分析模型(一),附带python代码

通过对用户行为进行深入的分析,识别出与常规模式不符的异常行为,可以有效检测并阻止虚假广告点击、刷单、点击欺诈等欺诈行为。本文将详细探讨营销反欺诈中异常行为分析的方法,介绍如何通过数据采集、清洗、行为建模与异常检测,准确识别潜在的欺诈行为,并提供 Python 实现代码示例。**监督学习 (Supervised Learning):**在标注数据的帮助下,训练机器学习模型使其能预测未知数据的结果。营销反欺诈异常行为分析的整体流程涉及多个环节,确保通过对用户行为的深入分析,及时识别潜在的欺诈行为。

viviwiky的博客 1230

Rabbit MQ如何保证消息不丢失

上面的图是官网中关于一条消息发送的整个流程,消息会经历下面几个流程:通过上面的RabbitMQ发送消息的模型我们可以知道在下面几个过程中消息可能会丢失:上面这几种情况都是消息在向不同的模块传递时失败导致消息丢失了,如果上面的情况都能解决就真的消息不会丢失了吗?然而结果并非如此,如果RabbitMQ服务宕机了,如果这些消息没有被持久化,等RabbitMQ服务重启之后,这些没有持久化的消息也将丢失。分析了这么多的情况可能会导致消息丢失,下面将根据各种情况对应的分析来解决。对于网络原因导致消息发送到Exchang

qq_37361514的博客 3964

比例导引算法详解:从理论到Matlab实现(含3D轨迹可视化)

本文深入解析比例导引算法(PNG)的数学原理与Matlab实现,涵盖3D轨迹可视化技术。从基础运动学模型到导航比优化,详细讲解导弹拦截系统的核心算法,并提供Matlab代码示例,帮助读者掌握从理论到实战的全流程。

weixin_33725722的博客 548

【QT/C++】事件过滤器之基于重写 eventFilter 方法的多种常见应用场景及实现

Qt事件过滤器通过重写eventFilter方法实现多种实用功能:1)鼠标事件处理(点击全选文本、禁用滚轮、悬停提示);2)键盘事件处理(输入内容限制、快捷键提交);3)焦点事件处理(自动弹出下拉框、实时验证);4)绘图事件处理(自定义控件绘制);5)窗口事件处理(防止意外关闭、尺寸限制)。事件过滤器提供非侵入式的事件处理方案,相比传统子类化方式更灵活,通过installEventFilter安装到目标控件即可实现各种交互增强功能。

yuhuasheng1997的博客 1483

MQ如何保证消息不丢失?

如果rabbitmq没能处理这个消息,会回调你一个nack接口,告诉你这个消息失败了,你可以进行重试。所以comfirm机制其实是一个异步监听的机制,是为了保证系统的高吞吐量,这样就导致了还是不能够100%保障消息不丢失,因为即使加上了confirm机制,消息在MQ内存中还没有刷盘到磁盘就宕机了,还是没法处理。而且持久化可以跟生产的confirm机制配合起来,只有消息持久化到了磁盘之后,才会通知生产者ack,这样就算是在持久化之前rabbitmq挂了,数据丢了,生产者收不到ack回调也会进行消息重发。

weixin_45286894的博客 2380

使用Python爬虫获取Facebook帖子和评论数据

Web爬虫是用于自动抓取网页数据的程序。它通过发送HTTP请求,获取网页的HTML源代码,再对源代码进行解析,提取所需的内容。爬虫常用于数据收集、信息提取、数据分析等应用。

2201_76125261的博客 1998

RabbitMQ如何保证消息不丢失

可以选择用 RabbitMQ 提供的事务功能,就是生产者发送数据之前开启 RabbitMQ 事务channel.txSelect,然后发送消息,如果消息没有成功被 RabbitMQ 接收到,那么生产者会收到异常报错,此时就可以回滚事务channel.txRollback,然后重试发送消息;RabbitMQ 自己弄丢了数据,这个必须要开启 RabbitMQ消息的持久化,就是消息写入之后会持久化到磁盘,哪怕是 RabbitMQ 自己挂了,恢复之后会自动读取之前存储的数据,一般数据不会丢失。

2301_76166241的博客 2236

把 300 亿参数的 Qwen3-30B-A3B 塞进 16GB 手机:MoE、mmap 与内存轮转的完整拆解

这篇文章详细拆解了如何在16GB内存手机上运行305亿参数的Qwen3-30B-A3B大模型。作者通过MoE(专家混合)架构、内存映射(mmap)和专用NPU内存(rpcmem)的巧妙结合实现了这一"不可能"的任务。 核心原理在于:MoE模型将庞大的前馈网络拆分为128个专家,每个词只激活8个专家,97%的权重处于闲置状态;通过mmap技术按需加载当前需要的专家权重;同时利用NPU专用内存高效计算关键部分。三个关键开关(GGML_HEXAGON_MOE_PAGING=1、--mmap、GGML_CPU_RE

q742971636的博客 185

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

图解RocketMQ之如何保证消息不丢失

其实要回答好这个面试题,是需要系统的从多个角度来分析的,你可以从 RocketMQ 本身的维度,也可以从消费者、生产者维度,还可以从业务维度。当然如果你是面试官,我希望你可以更多关注面试者的理解程度,毕竟大家都是八股选手谁也别为难谁😂好啦,有关 RocketMQ 如何防止消息丢失教程就到这里啦,有疑惑和问题欢迎大家留言讨论。我是苍何,这是图解 RocketMQ 教程的第 13 篇,我们下篇见~

一个成长中的程序员,期待用技术的眼光生活 867

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

深入浅出消息队列----【如何保证消息不丢失?】

本文仅是文章笔记,整理了原文章中重要的知识点、记录了个人的看法。

是微风,是晚霞,是无可替代 1299

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【消息队列】kafka如何保证消息不丢失?

👏大家好!我是和风coding,希望我的文章能给你带来帮助!🔥如果感觉博主的文章还不错的话,请👍三连支持👍一下博主哦📝点击还可以看到和风的其他内容噢,更多内容等你来探索!

这里是和风coding的博客 1949

RabbitMQ保证消息不丢失的机制

RabbitMQ还支持事务机制,即生产者可以将多个发送消息的操作封装在一个事务中。然而,需要注意的是,事务机制会降低RabbitMQ的性能,因此在高吞吐量的场景中可能不适用。此外,RabbitMQ还提供了死信队列(DLX)机制,用于处理无法正常消费的消息。综上所述,RabbitMQ通过消息持久化、消息确认机制、事务机制、镜像队列以及备份队列和死信队列等多种机制来保证消息的可靠性,从而避免消息丢失的情况发生。当一个节点宕机时,其他节点上的队列副本可以继续处理消息,从而确保消息的可靠性。

weixin_42069404的博客 752

RabbitMQ如何保证消息不丢失(面试版)

来避免消息发送到MQ过程中丢失。RabbitMQ提供了。

m0_61925586的博客 1693

Java面试八股之如何保证消息队列中消息不丢失

实施全面的监控系统来检测消息队列的状态,包括消息积压情况、消息延迟等,并在出现问题时及时报警。设置合理的超时时间,如果消费者在规定时间内没有确认消息,则认为消息处理失败并重新发送。通过上述方法结合使用,可以大大提高消息队列的可靠性和稳定性,从而实现消息不丢失的目标。消费者在处理完消息后向服务确认消息已被正确处理,否则服务会重新发布该消息。如果消息无法被处理或者处理失败,可以根据配置的策略重新尝试发送或处理消息。对于需要保证一致性的情况,可以使用事务消息来确保消息的原子性。

u012151345的博客 887

Kafka 如何保证消息不丢失

对 Kafka 集群的关键指标进行监控,如副本同步状态、消息堆积等,及时发现并处理可能导致消息丢失的异常情况,并配置告警机制通知相关人员。- 例如,设置 `acks=all` 表示只有当所有参与复制的分区副本都收到消息时,才向生产者确认成功写入,从而确保消息不会丢失。- 从副本会不断地从主副本同步数据,以保证在主副本出现故障时,能够切换到从副本继续提供服务,从而避免数据丢失。- 在发送或接收消息出现短暂错误时,Kafka 会进行重试,以增加消息成功处理的机会。

m0_57836225的博客 2722

Java使用RabbitMQ时出现连接异常如何处理保证消息不丢失

在使用RabbitMQ进行消息订阅时,如果Java服务由于网络问题没有接收到消息,有可能会导致消息丢失。为了避免这种情况,需要采取一些措施来确保消息的可靠传递。消息持久化:确保RabbitMQ服务器重启时消息不丢失。消息确认机制:确保只有成功处理的消息才从队列中移除。死信队列:处理无法正常消费的消息。消息重试机制:在应用层实现重试处理。高可用队列:在RabbitMQ集群中配置高可用队列。连接恢复:使用RabbitMQ客户端的自动连接恢复功能。

a_beiyo的博客 721

RabbitMq如何确保消息不丢失

RabbitMq如何确保消息不丢失

weixin_64122713的博客 1419

Kafka保证消息不丢失

设置异步发送回调方法中的参数Exception e如果为空代表发送成功,如果不为空代表发送失败出现异常。

qq_55630615的博客 414
上一篇: 04 | 利用事务消息实现分布式事务
下一篇: 06 | 如何处理消费过程中的重复消息
vectorX
博客等级 码龄11年 37粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值