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

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

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

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

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

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

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

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

场景一:异步发送

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

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

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

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

在 Producer 端有一个 acks 配置,说明如下 :fMw28资讯网——每日最新资讯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 列表中最小写入消息成功的副本数。fMw28资讯网——每日最新资讯28at.com

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

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

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

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

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

场景三:发送端重试

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

场景四:Follower 落后太多

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

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

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

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

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

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

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

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

场景五:Broker 宕机

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

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

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

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

场景六:并发消费

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

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

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

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

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

总结

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

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

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

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

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

标签:
  • 热门焦点
  • K60至尊版狂暴引擎2.0加持:超177万跑分斩获性能第一

    K60至尊版狂暴引擎2.0加持:超177万跑分斩获性能第一

    Redmi的后性能时代战略发布会今天下午如期举办,在本次发布会上,Redmi公布了多项关于和联发科的深度合作,以及新机K60 Ultra在软件和硬件方面的特性,例如:“K60 至尊版,双芯旗舰
  • Mate60手机壳曝光 致敬自己的经典设计

    Mate60手机壳曝光 致敬自己的经典设计

    8月3日消息,今天下午博主数码闲聊站带来了华为Mate60的第三方手机壳图,可以让我们在真机发布之前看看这款华为全新旗舰的大致轮廓。从曝光的图片看,Mate 60背后摄像头面积依然
  • 小米官宣:2023年上半年出货量中国第一!

    小米官宣:2023年上半年出货量中国第一!

    今日早间,小米电视官方微博带来消息,称2023年小米电视上半年出货量达到了中国第一,同时还表示小米电视的巨屏风暴即将开始。“公布一个好消息2023年#小米电视上半年出货量中国
  • 0糖0卡0脂 旭日森林仙草乌龙茶优惠:15瓶到手29元

    0糖0卡0脂 旭日森林仙草乌龙茶优惠:15瓶到手29元

    旭日森林无糖仙草乌龙茶510ml*15瓶平时要卖为79.9元,今日下单领取50元优惠券,到手价为29.9元。产品规格:0糖0卡0脂,添加草本仙草汁,清凉爽口,富含茶多酚,保留
  • Flowable工作流引擎的科普与实践

    Flowable工作流引擎的科普与实践

    一.引言当我们在日常工作和业务中需要进行各种审批流程时,可能会面临一系列技术和业务上的挑战。手动处理这些审批流程可能会导致开发成本的增加以及业务复杂度的上升。在这
  • “又被陈思诚骗了”

    “又被陈思诚骗了”

    作者|张思齐 出品|众面(ID:ZhongMian_ZM)如今的国产悬疑电影,成了陈思诚的天下。最近大爆电影《消失的她》票房突破30亿断层夺魁暑期档,陈思诚再度风头无两。你可以说陈思诚的
  • 消费结构调整丨巨头低价博弈,拼多多还卷得动吗?

    消费结构调整丨巨头低价博弈,拼多多还卷得动吗?

    来源:征探财经作者:陈香羽随着流量红利的退潮,电商的存量博弈越来越明显。曾经主攻中高端与品质的淘宝天猫、京东重拾&ldquo;低价&rdquo;口号。而过去与他们错位竞争的拼多多,靠
  • 一条抖音4亿人围观 ! 这家MCN比无忧传媒还野

    一条抖音4亿人围观 ! 这家MCN比无忧传媒还野

    作者:Hiu 来源:互联网品牌官01 擦边少女空降热搜,幕后推手曝光被网友誉为&ldquo;纯欲天花板&rdquo;的女网红井川里予,近期因为一组哥特风照片登上热搜,引发了一场互联网世界关于
  •  三星推出Galaxy Tab S9系列平板电脑以及Galaxy Watch6系列智能手表

    三星推出Galaxy Tab S9系列平板电脑以及Galaxy Watch6系列智能手表

    2023年7月26日,三星电子正式发布了Galaxy Z Flip5与Galaxy Z Fold5。除此之外,Galaxy Tab S9系列平板电脑以及三星Galaxy Watch6系列智能手表也同期
Top