面试官:请谈谈写入消息中间件的数据,如何保证不丢失?

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

(1)背景引入

这篇文章,给大家聊一下写入Kafka的数据该如何保证其不丢失?

大家应该都知道写入Kafka的数据是会落地写入磁盘的。

我们暂且不考虑写磁盘的具体过程,先大致看看下面的图,这代表了Kafka的核心架构原理。

 

(2)Kafka分布式存储架构

那么现在问题来了,如果每天产生几十TB的数据,难道都写一台机器的磁盘上吗?这明显是不靠谱的啊!

所以说,这里就得考虑数据的分布式存储了

在Kafka里面,有一个核心的概念叫做“Topic”,这个topic你就姑且认为是一个数据集合吧。

举个例子,如果你现在有一份网站的用户行为数据要写入Kafka,你可以搞一个topic叫做“user_access_log_topic”,这里写入的都是用户行为数据。

然后如果你要把电商网站的订单数据的增删改变更记录写Kafka,那可以搞一个topic叫做“order_tb_topic”,这里写入的都是订单表的变更记录。

然后假如说咱们举个例子,就说这个用户行为topic吧,里面如果每天写入几十TB的数据,你觉得都放一台机器上靠谱吗?

明显不太靠谱,所以Kafka有一个概念叫做Partition,就是把一个topic数据集合拆分为多个数据分区,你可以认为是多个数据分片,每个Partition可以在不同的机器上,储存部分数据。

这样,不就可以把一个超大的数据集合分布式存储在多台机器上了吗?大家看下图,一起来体会一下。

(3)Kafka高可用架构

但是这个时候,我们又会遇到一个问题,就是万一某台机器宕机了,这台机器上的那个partition管理的数据不就丢失了吗?

所以说,我们还得做多副本冗余,每个Partition都可以搞一个副本放在别的机器上,这样某台机器宕机,只不过是Partition其中一个副本丢失。

如果某个Partition有多副本的话,Kafka会选举其中一个Parititon副本作为Leader,然后其他的Partition副本是Follower。

只有Leader Partition是对外提供读写操作的,Follower Partition就是从Leader Partition同步数据。

一旦Leader Partition宕机了,就会选举其他的Follower Partition作为新的Leader Partition对外提供读写服务,这不就实现了高可用架构了?

大家看下面的图,看看这个过程。

(4)Kafka写入数据丢失问题

现在我们来看看,什么情况下Kafka中写入数据会丢失呢?

其实也很简单,大家都知道写入数据都是往某个Partition的Leader写入的,然后那个Partition的Follower会从Leader同步数据。

但是万一1条数据刚写入Leader Partition,还没来得及同步给Follower,此时Leader Partiton所在机器突然就宕机了呢?

大家看下图:

如上图,这个时候有一条数据是没同步到Partition0的Follower上去的,然后Partition0的Leader所在机器宕机了。

此时就会选举Partition0的Follower作为新的Leader对外提供服务,然后用户是不是就读不到刚才写入的那条数据了?

因为Partition0的Follower上是没有同步到最新的一条数据的。

这个时候就会造成数据丢失的问题。

(5)Kafka的ISR机制是什么?

现在我们先留着这个问题不说具体怎么解决,先回过头来看一个Kafka的核心机制,就是ISR机制。

这个机制简单来说,就是会自动给每个Partition维护一个ISR列表,这个列表里一定会有Leader,然后还会包含跟Leader保持同步的Follower。

也就是说,只要Leader的某个Follower一直跟他保持数据同步,那么就会存在于ISR列表里。

但是如果Follower因为自身发生一些问题,导致不能及时的从Leader同步数据过去,那么这个Follower就会被认为是“out-of-sync”,从ISR列表里踢出去。

所以大家先得明白这个ISR是什么,说白了,就是Kafka自动维护和监控哪些Follower及时的跟上了Leader的数据同步。

(6)Kafka写入的数据如何保证不丢失?

所以如果要让写入Kafka的数据不丢失,你需要要求几点:

1.每个Partition都至少得有1个Follower在ISR列表里,跟上了Leader的数据同步

2.每次写入数据的时候,都要求至少写入Partition Leader成功,同时还有至少一个ISR里的Follower也写入成功,才算这个写入是成功了

3.如果不满足上述两个条件,那就一直写入失败,让生产系统不停的尝试重试,直到满足上述两个条件,然后才能认为写入成功

4.按照上述思路去配置相应的参数,才能保证写入Kafka的数据不会丢失

好!现在咱们来分析一下上面几点要求。

第一条,必须要求至少一个Follower在ISR列表里。

那必须的啊,要是Leader没有Follower了,或者是Follower都没法及时同步Leader数据,那么这个事儿肯定就没法弄下去了。

第二条,每次写入数据的时候,要求leader写入成功以外,至少一个ISR里的Follower也写成功。

大家看下面的图,这个要求就是保证说,每次写数据,必须是leader和follower都写成功了,才能算是写成功,保证一条数据必须有两个以上的副本。

这个时候万一leader宕机,就可以切换到那个follower上去,那么Follower上是有刚写入的数据的,此时数据就不会丢失了。

如上图所示,假如现在leader没有follower了,或者是刚写入leader,leader立马就宕机,还没来得及同步给follower。

在这种情况下,写入就会失败,然后你就让生产者不停的重试,直到kafka恢复正常满足上述条件,才能继续写入。

这样就可以让写入kafka的数据不丢失。

(7)总结

最后总结一下,其实kafka的数据丢失问题,涉及到方方面面。

譬如生产端的缓存问题,包括消费端的问题,同时kafka自己内部的底层算法和机制也可能导致数据丢失。

但是平时写入数据遇到比较大的一个问题,就是leader切换时可能导致数据丢失。所以本文仅仅是针对这个问题说了一下生产环境解决这个问题的方案。

最新整理的Java技术干货文档资料:【Java核心知识点整理】涵盖29个Java核心技术详解,JVM,Redis,Nginx,Spring Boot,Spring Cloud,Kafka,并发编程,Tomcat,MyBatis,BAT面试题,Java技术精讲视频等。转发+关注,私信回复“干货”即可获得免费领取方式。

掌握了这些知识点,面试时在候选人中又可以夺目不少,暴击9999点。机会都是留给有准备的人,只有充足的准备,才可能让自己可以在候选人中脱颖而出。

 

每次都碰到面试官问我如何保证Kafka不丢失消息,快哭了。。 这篇文章,我们来聊聊在线上生产环境使用消息中间件技术的时候,从前到后的全链路到底如何保证数据不能丢失。 阅读详情

相关推荐

面试官:RocketMQ 如何保证消息不丢失,如何保证消息不被重复消费?

Kafka 实际上有个 offset 的概念,就是每个消息写进去,都有一个 offset,代表消息的序号,然后 consumer 消费了数据之后,每隔一段时间(定时定期),会把自己消费过的消息的 offset 提交一下,表示“我已经消费过了,下次我要是重启啥的,你就让我继续从上次消费到的 offset 来继续消费吧”。但是凡事总有意外,比如我们之前生产经常遇到的,就是你有时候重启系统,看你怎么重启了,如果碰到点着急的,直接 kill 进程了,再重启。重启之后,少数消息会再次消费一次。......

m0_72885838的博客 1273

java 文件的读写 保存_java – 如何确保文件已成功写入?

我正在为Java中的图形应用程序添加自动保存功能.应用程序定期自动保存当前文档,并在退出时自动保存.当用户启动应用程序时,将重新加载自动保存文件.如果自动保存文件以任何方式损坏(我假设当文件处于保存状态时断电会这样做吗?),用户将失去工作.如何防止这种情况并尽我所能保证自动保存文档处于一致状态?更复杂的是,要自动保存文档,我需要保存一个.xml文件和几个.png文件.此外,.png保存发生在JNI...

weixin_28724319的博客 744

VSCode关联VIVADO编辑Verilog

有时候接手别人的代码,或者从网上找的开源代码,每个人风格不一致,对齐缩进也不一样,阅读起来很累。有没有什么方法能快捷地格式化代码呢。下面我们利用VSCode插件来实现这个需求。Vivado是Xilinx公司提供的逻辑开发平台(之一),如果不喜欢Vivado自带的文本编辑器,可以选择第三方的文本编辑器VSCode。

小王在努力...的博客 7150

java写文件时,输出不完整的原因以及解决方法close()或flush()

 在java的IO体系中,写文件通常会用到下面语句 BufferedWriter bw=new BufferedWriter(new FileWriter("sql语句.txt")); 用到这个的时候一定不能忘了他的伴侣代码。。 bw.close(); 或者 bw.flush(); 实际上,FileWriter在写文件时,会把内容存储到一块缓冲区中,当缓冲区满后,才会

xuhb的专栏 4105

从STM32转战华大HC32F4A0:我的踩坑实录与10个USART的灵活配置心得

本文分享了从STM32迁移至华大HC32F4A0的实战经验,重点解析了10个USART的灵活配置技巧及常见问题解决方案。通过对比STM32F407,详细介绍了HC32F4A0在外设灵活性、IO功能组设计及多串口应用中的优势,帮助开发者快速掌握国产芯片的开发要点。

weixin_30514745的博客 524

拯救者R9000P-2021-AMD5800H黑苹果EFI配置与优化指南

本文详细介绍了在联想拯救者R9000P 2021款(搭载AMD锐龙7 5800H处理器)上安装和优化黑苹果系统的完整指南。内容涵盖EFI配置、OpenCore引导设置、关键驱动(如NootedRed核显驱动)的调整,以及安装后的性能调优与常见问题解决,旨在帮助开发者和极客用户在这款游戏本上搭建稳定可用的macOS开发环境。

weixin_29291069的博客 288

Java文件写入的六种方式

在 Java 中操作文件的方法本质上只有两种:字符流和字节流,而字节流和字符流的实现类又有很多,因此在文件写入时我们就可以选择各种各样的类来实现。 流 Java 中的“流”是一种抽象的概念,也是一种比喻,就好比水流一样,水流是从一端流向另一端的,而在 Java 中的“水流”就是数据,数据会从一端“流向”另一端。 根据流的方向性,可以将流分为输入流和输出流,当程序需要从数据源中读入数据的时候就会开启一个输入流,相反,写出数据到某个数据源目的地的时候也会开启一个输出流,数据源可以是文件、内存或者网络等。 字节流

今天星期六 3456

python -- 海洋气象科研论文中常用绘图配色汇总

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。观看全面零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。可以通过自定义选取不同颜色的rgb,通过自定义的方式构建colormap。

weixin_68789096的博客 972

java-NIO之Buffer(缓冲区)

Buffer(缓冲区)

S1124654的博客 902

Serial RapidIO Gen2 IP 说明(三)

前言 继续接着上篇文章,介绍Serial RapidIO Gen2 IP 的具体端口信息。 一、端口描述 1、缓冲设计接口 2、物理层接口 参考说明 【1】Serial RapidIO Gen2 v4.1https://china.xilinx.com/content/dam/xilinx/support/documentation/ip_documentation/srio_gen2/v4_1/pg007_srio_gen2.pdf ...

记录所学,分享知识,结识挚友 1321

《点云进阶》专栏文章目录

点云进阶》专栏文章目录

点云侠的博客 4905

Java NIO-缓冲区操作

在JAVA API提供的原I/O中,提供了文件读写,操作,传输的方法。但是存在一个核心的问题,就是这些文件的读写,操作等都是阻塞式,如果当前操作未完成,程序无法向下执行,所以在某种情况下会严重影响I/O,效率。因此,在后期的JDK版本发布中,出现了NIO,NIO包括对缓冲区操作,通道,文件锁,字符集,selector等。下面为大家介绍下缓冲区。

dymkkj的专栏 790

Pulseaudio之同步/异步(十一)

PulseAudio是一个声音服务器,一个后台进程从一个或多个音源(进程或输入设备)接受声音输入 然后重定向声音到一个或多个槽(声卡,远程网络PulseAudio服务,或其他进程)。 PulseAudio的主要特点包括: 可对每一个应用程序进行音量控制Per-application volume controls 可扩展的插件与支持可装载模块架构 兼容性许多流行的音频应用程序 支持多重音源和多重输出 低延时操作和支持延迟测量 一个对处理器资源效率零拷贝内存架构 能够发现本地网络上使用PulseAu

Android系统攻城狮 999

面试官:请谈谈写入消息中间件的数据,如何保证不丢失?【石杉的架构笔记】...

点击上方"蓝字",右上角选择“设为星标”周一至周五早8点半!精品技术文章准时送上!公众号后台回复 “学习” ,获取作者独家秘制学习套餐 目录1、背景引入2、K...

石杉的架构笔记 825

基于STM32L4XX 、HAL库的SGM452B数字温度传感器驱动应用C语言程序设计

SGM452B_RESOLUTION_12BIT = SGM452B_CONFIG_R1 | SGM452B_CONFIG_R0 /* 12位分辨率,精度0.0625°C,转换时间200ms */SGM452B_RESOLUTION_11BIT = SGM452B_CONFIG_R1, /* 11位分辨率,精度0.125°C,转换时间100ms */SGM452B_RESOLUTION_10BIT = SGM452B_CONFIG_R0, /* 10位分辨率,精度0.25°C,转换时间50ms */

PP_Cottage的博客 327

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

请谈谈写入消息中间件的数据,如何保证不丢失?【石杉的架构笔记】

面试官:请谈谈写入消息中间件的数据,如何保证不丢失?【石杉的架构笔记】 欢迎关注个人公众号:石杉的架构笔记(ID:shishan100) 周一至周五早8点半!精品技术文章准时送上! 精品学习资料获取通道,参见文末 目录 1、背景引入 2、Kafka分布式存储架构 3、Kafka高可用架构 4、画图复现Kafka的写入数据丢失问题 5、Kafka的ISR机制是什么? 6、Kafka写入的数据如何保证...

mhHao的博客 378

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

面试官再问我如何保证 RocketMQ 不丢失消息,这回我笑了!

最近看了 @JavaGuide 发布的一篇『面试官问我如何保证Kafka不丢失消息?我哭了!』,这篇文章承接这个主题,来聊聊如何保证 RocketMQ 不丢失消息。 0x00. 消息的发送流程 一条消息从生产到被消费,将会经历三个阶段: 生产阶段,Producer 新建消息,然后通过网络将消息投递给 MQ Broker 存储阶段,消息将会存储在 Broker 端磁盘中 消息阶段, Consum...

楼下小黑哥 4114

WINCC7.3破解文件

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

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

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

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

weixin_38446891的博客 1818

为什么redis不能保证100%数据不丢失

为什么redis不能保证100%数据不丢失起因准备环境阅读源码 起因   前段时间面试被问到,Redis能否保证100%数据不丢失,我回答不能。面试官又问,为什么呢?我一时语塞,慌忙回答因为异步写磁盘。   随后我在百度上搜了搜,发现很多博客都讲,将appendfsync值设置为always就可以了。这回答让我对《redis设计与实现》产生了怀疑。难道新版本的redis能够保证数据100%不丢失?...

qq_22421145的博客 2825

高级java每日一道面试题-2024年10月14日-消息中间件篇-如何确保消息中间件的消息不丢失?

* 在消费者处理消息时,如果发生异常或失败,可以配置重试机制来重新发送消息给消费者进行处理。 * 重试机制可以设置重试次数和重试间隔等参数,以确保在多次尝试后仍然无法处理消息时,能够采取相应的措施(如将消息投递到异常交换机、记录日志等)。 * **自动重试**:配置消费者端的自动重试机制,当消息处理失败时,可以自动重试一定次数。 * **自定义重试逻辑**:根据业务需求实现自定义的重试逻辑。

qq_43071699的博客 1070

【MQ】如何保证消息中间件全链路数据100%不丢失(1)

目录 1、背景引入 2、前情回顾 3、目前已有的技术方案 4、数据100%不丢失了吗? 5、按需制定技术方案 6、需要研究的技术细节 1、背景引入 这篇文章,我们来聊聊在线上生产环境使用消息中间件技术的时候,从前到后的全链路到底如何保证数据不能丢失。 这个问题,在互联网公司面试的时候高频出现,而且也是非常现实的生产环境问题。 如果你的简历中写了自己熟悉MQ技术(RabbitMQ...

凡是过往,皆为序章 513

RocketMQ怎么保证的消息不丢失(吊打面试官)?

编程界的小学生一、消息发送过程二、Producer生产阶段1、解决方案一1.1、说明1.2、源码2、解决方案二2.1、说明2.2、源码3、解决方案三3.1、说明4、总结三、Broker存储阶段1、解决方案一2、解决方案二3、总结四、Consumer消费阶段1、解决方案一2、解决方案二 面试官常常喜欢问:Rocket MQ 怎么保证的消息不丢失? 我想说:就这?我笑了。 一、消息发送过程 我们将消息流程分为如下三大部分,每一部分都有可能会丢失数据。 生产阶段:Producer通过网络将消息发送给Bro

【原】编程界的小学生 2972

kafka如何保证不重复消费又不丢失数据_互联网面试必杀:如何保证消息中间件全链路数据100%不丢失...

背景引入这篇文章,我们来聊聊在线上生产环境使用消息中间件技术的时候,从前到后的全链路到底如何保证数据不能丢失。这个问题,在互联网公司面试的时候高频出现,而且也是非常现实的生产环境问题。如果你的简历中写了自己熟悉MQ技术(RabbitMQ、RocketMQ、Kafka),而且在项目里有使用的经验,那么非常实际的一个生产环境问题就是:投递消息到MQ,然后从MQ消费消息来处理的这个过程,数据到底会不会丢...

weixin_39716971的博客 280

如何保证消息中间件全链路数据100%不丢失(1)

目录1.背景引入2.前情回顾3.目前已有的技术方案4.数据100%不丢失了吗? 1.背景引入 这篇文章,我们来聊聊在线上生产环境使用消息中间件技术的时候,从前到后的全链路到底如何保证数据不能丢失。 这个问题,在互联网公司面试的时候高频出现,而且也是非常现实的生产环境问题。 如果你的简历中写了自己熟悉MQ技术(RabbitMQ、RocketMQ、Kafka),而且在项目里有使用的经验,那么非常实际的...

qq_24038385的博客 325
上一篇: 掌握 MySQL 这 19 个骚操作,效率至少提高3倍
下一篇: 干货|一次MySQL两千万数据大表的优化过程,三种解决方案!
Java斗帝之路
博客等级 码龄7年 2392粉丝 687原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值