当前位置:首页 > 科技  > 软件

注意:Kafka 的这六个场景会丢失消息!

来源: 责编: 时间:2024-04-11 08:59:39 103观看
导读大家好,我是君哥。我们使用 Kafka 的时候,怎样能保证不丢失消息呢?今天来聊一聊这个话题。首先我们看一下 Kafka 的架构图,场景一:异步发送Producer 异步发送是丢失消息比较多的场景,Kafka 异步发送的代码如下:ProducerRecor

k3528资讯网——每日最新资讯28at.com

大家好,我是君哥。k3528资讯网——每日最新资讯28at.com

我们使用 Kafka 的时候,怎样能保证不丢失消息呢?今天来聊一聊这个话题。k3528资讯网——每日最新资讯28at.com

首先我们看一下 Kafka 的架构图,k3528资讯网——每日最新资讯28at.com

k3528资讯网——每日最新资讯28at.com

场景一:异步发送

Producer 异步发送是丢失消息比较多的场景,Kafka 异步发送的代码如下:k3528资讯网——每日最新资讯28at.com

ProducerRecord<byte[],byte[]> record = new ProducerRecord<byte[],byte[]>("the-topic", key, value);RecordMetadata metadata = producer.send(record).get();

Producer 发送消息后,不用等待发送结果,就可以继续执行后面的逻辑。如果发送失败,就会丢失消息。k3528资讯网——每日最新资讯28at.com

Kafka 提供了回调方法,可以同步等待发送结果,这样降低了发送效率,但可以对发送失败的场景进行处理,比如重新发送。k3528资讯网——每日最新资讯28at.com

ProducerRecord<byte[],byte[]> record = new ProducerRecord<byte[],byte[]>("the-topic", key, value);producer.send(record,                (Callback) (metadata, e) -> {                    if(e != null) {                        e.printStackTrace();                    } else {                        System.out.println("The offset of the record we just sent is: " + metadata.offset());                    }                });

场景二:配置 acks=0

从文章开头的架构图中可以看到,Broker Leader 节点收到消息后,会同步给 Follower 节点。k3528资讯网——每日最新资讯28at.com

在 Producer 端有一个 acks 配置,说明如下 :k3528资讯网——每日最新资讯28at.com

  • acks=0:Producer 发送消息后不等待 Broker 的响应;
  • acks=1:Producer 发送消息后,Leader 节点写入消息成功后给 Producer 发送响应;
  • acks=all/-1:Producer 发送消息后,需要 ISR 列表中所有 Broker 节点都写入消息成功才会给 Producer 发送响应。

注意:acks=all/-1 是最高安全级别,可以配合 min.insync.replicas 参数使用,当 acks=all/-1 时,min.insync.replicas 表示 ISR 列表中最小写入消息成功的副本数。k3528资讯网——每日最新资讯28at.com

如下图,cks=all/-1,当 min.insync.replicas=2 时。k3528资讯网——每日最新资讯28at.com

k3528资讯网——每日最新资讯28at.com

如果 ISR 列表中有【Broker0、Broker1】,即使 Broker2 写入消息失败,也会给 Producer 返回成功。k3528资讯网——每日最新资讯28at.com

如果 ISR 列表中只有【Broker0】,则无论如何都不会给 Producer 返回成功。k3528资讯网——每日最新资讯28at.com

如果 ISR 列表中有【Broker0、Broker1、Broker2】,则 3 个 Broker 都写成功才会给 Producer 返回成功。k3528资讯网——每日最新资讯28at.com

场景三:发送端重试

如果配置 retries=0,Producer 发送消息失败后是不会进行重试的,要保证消息不丢失,可以增加 retries 的配置值,避免因为网络抖动而造成的发送失败。k3528资讯网——每日最新资讯28at.com

场景四:Follower 落后太多

Kafka Broker 有一个参数:unclean.leader.election.enable,这个参数值说明如下:k3528资讯网——每日最新资讯28at.com

  • true:允许 ISR 列表之外的节点参与竞选 Leader;
  • false:不允许 ISR 列表之外的节点参与竞选 Leader。

如果设置为 true,也是会丢失消息的,看下图:k3528资讯网——每日最新资讯28at.com

k3528资讯网——每日最新资讯28at.com

如果 Leader 和 Follower1 都挂了,这时就要考虑是否让 Follower2 参加竞选,把 unclean.leader.election.enable 参数值设置为 true,则 Follower2 也可以竞选 Leader,并且作为唯一存活节点成功竞选为 Leader,但是它并没有同步到偏移量为 3、4、5 的消息,k3528资讯网——每日最新资讯28at.com

而之前的 Leader 上线后,成为了 Follower,因为 Follower 的 LEO(Log End Offset)不能大于 Leader,所以之前偏移量为 3、4、5 的消息就被丢弃了。如下图:k3528资讯网——每日最新资讯28at.com

k3528资讯网——每日最新资讯28at.com

所以,要保证消息不丢失,unclean.leader.election.enable 这个参数值要设置为 false。k3528资讯网——每日最新资讯28at.com

场景五:Broker 宕机

为了提升性能,Kafka 使用 Page Cache,先将消息写入 Page Cache,采用了异步刷盘机制去把消息保存到磁盘。如果刷盘之前,Broker Leader 节点宕机了,并且没有 Follower 节点可以切换成 Leader,则 Leader 重启后这部分未刷盘的消息就会丢失。k3528资讯网——每日最新资讯28at.com

这种场景下多设置副本数是一个好的选择,通常的做法是设置 replication.factor >= 3,这样每个 Partition 就会有 3 个以上 Broker 副本来保存消息,同时宕机的概率很低。k3528资讯网——每日最新资讯28at.com

同时可以配合场景二中的参数 min.insync.replicas > 1(不建议使用默认值 1),表示消息至少要被成功写入到 2 个 Broker 副本才算是发送成功。k3528资讯网——每日最新资讯28at.com

注意:参数配置要保证 replication.factor > min.insync.replicas,通常设置成 replication.factor = min.insync.replicas + 1。如果这 2 个参数设置成相等,则只要有一个 Broker 节点宕机,Broker 就无法给 Producer 返回发送成功,系统可用性降低。k3528资讯网——每日最新资讯28at.com

场景六:并发消费

如果消费端采用多线程并发消费,很容易因为并发更新 Offset 导致消费失败。看下图:k3528资讯网——每日最新资讯28at.com

k3528资讯网——每日最新资讯28at.com

线程 1 拉取 3 条消息把 Offset 更新成 3,线程 2 把 Offset 更新成 6,线程 3 把 Offset 更新成 9。这时如果线程 2 消费失败了,想要重新消费,但是 Offset 已经更新到了 9,不能拉取到 Offset 9 以前的消息了。k3528资讯网——每日最新资讯28at.com

所以,消费者并发消费很可能会造成消息丢失,如果对消息丢失很敏感,最好使用单线程来进行消费。k3528资讯网——每日最新资讯28at.com

如果采用多线程,可以把 enable.auto.commit 设置为 false,这样相当于每次消费完后手动更新 Offset。不过这又会带来重复消费问题,比如上面的例子,如果线程 2 消费失败了,则手动把 Offset 更新成 3,线程 3 消费成功后,再次拉取,还会拉取到  6、7、8 这三条数据。因此消费端需要做好幂等处理。k3528资讯网——每日最新资讯28at.com

总结

本文介绍了 Kafka 丢失消息的六个场景,使用 Kafka 时需要根据实际情况制定解决方案,希望本文介绍的场能够对你有所帮助。k3528资讯网——每日最新资讯28at.com

本文链接://www.dmpip.com//www.dmpip.com/showinfo-26-82738-0.html注意:Kafka 的这六个场景会丢失消息!

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 如何在JavaScript中复制一个对象?

下一篇: C++线程安全:共享数据的完美守护者

标签:
  • 热门焦点
  • 卢伟冰长文解析K60至尊版 对Redmi有着里程碑式的意义

    卢伟冰长文解析K60至尊版 对Redmi有着里程碑式的意义

    在今天的Redmi后性能时代战略发布会结束之后,Redmi总经理卢伟冰又带来了一篇长文,详解了为什么 Redmi 要开启后性能时代?为什么选择和 MediaTek、Pixelworks 深度合作?以及后性
  • Redmi Pad评测:红米充满野心的一次尝试

    Redmi Pad评测:红米充满野心的一次尝试

    从Note系列到K系列,从蓝牙耳机到笔记本电脑,红米不知不觉之间也已经形成了自己颇有竞争力的产品体系,在中端和次旗舰市场上甚至要比小米新机的表现来得更好,正所谓“大丈夫生居
  • vivo TWS Air开箱体验:真轻 臻好听

    vivo TWS Air开箱体验:真轻 臻好听

    在vivo S15系列新机的发布会上,vivo的最新款真无线蓝牙耳机vivo TWS Air也一同发布,本次就这款耳机新品给大家带来一个简单的分享。外包装盒上,vivo TWS Air保持了vivo自家产
  • JavaScript 混淆及反混淆代码工具

    JavaScript 混淆及反混淆代码工具

    介绍在我们开始学习反混淆之前,我们首先要了解一下代码混淆。如果不了解代码是如何混淆的,我们可能无法成功对代码进行反混淆,尤其是使用自定义混淆器对其进行混淆时。什么是混
  • 摸鱼心法第一章——和配置文件说拜拜

    摸鱼心法第一章——和配置文件说拜拜

    为了能摸鱼我们团队做了容器化,但是带来的问题是服务配置文件很麻烦,然后大家在群里进行了“亲切友好”的沟通图片图片图片图片对比就对比,简单对比下独立配置中心和k8s作为配
  • 使用LLM插件从命令行访问Llama 2

    使用LLM插件从命令行访问Llama 2

    最近的一个大新闻是Meta AI推出了新的开源授权的大型语言模型Llama 2。这是一项非常重要的进展:Llama 2可免费用于研究和商业用途。(几小时前,swyy发现它已从LLaMA 2更名为Lla
  • 三星获批量产iPhone 15全系屏幕:苹果史上最惊艳直屏

    三星获批量产iPhone 15全系屏幕:苹果史上最惊艳直屏

    按照惯例,苹果将继续在今年9月举办一年一度的秋季新品发布会,有传言称发布会将于9月12日举行,届时全新的iPhone 15系列将正式与大家见面,不出意外的话
  • Windows 11发布,微软一改往常对老机型开放的态度

    Windows 11发布,微软一改往常对老机型开放的态度

    距离 Windows 11 发布已经过去一周,在过去一周里,很多数码爱好者围绕其对 Android 应用的支持、对老机型的升级问题展开了激烈讨论。与以往不同的是,在这次大
  • 2022爆款:ROG魔霸6 冰川散热系统持续护航

    2022爆款:ROG魔霸6 冰川散热系统持续护航

    喜逢开学季,各大商家开始推出自己的新产品,进行打折促销活动。对于忠实的端游爱好者来说,能够拥有一款梦寐以求的笔记本电脑是一件十分开心的事。但是现在的
Top
Baidu
map