面试官:Kafka 为什么会丢消息?

深入解析Kafka消息丢失的原因与解决方案 Apache Kafka是一种高吞吐量、分布式的消息系统,广泛应用于实时数据流处理。然而,在某些情况下,Kafka可能会出现消息丢失的情况,这对于数据敏感的应用来说是不可接受的。本文将深入解析Kafka消息丢失的各种原因,包括生产者、broker和消费者配置问题,以及硬件故障等。同时,我们将提供详细的解决方案和最佳实践,帮助您确保Kafka消息的可靠传递,提升系统的稳定性和数据安全性。 阅读详情
  • 1、如何知道有消息丢失?
  • 2、哪些环节可能丢消息?
  • 3、如何确保消息不丢失?

引入 MQ 消息中间件最直接的目的:系统解耦以及流量控制(削峰填谷)

  • 系统解耦: 上下游系统之间的通信相互依赖,利用 MQ 消息队列可以隔离上下游环境变化带来的不稳定因素。
  • 流量控制: 超高并发场景中,引入 MQ 可以实现流量 “削峰填谷” 的作用以及服务异步处理,不至于打崩服务。

引入 MQ 同样带来其他问题:数据一致性。

在分布式系统中,如果两个节点之间存在数据同步,就会带来数据一致性的问题。消息生产端发送消息到 MQ 再到消息消费端需要保证消息不丢失。

所以在使用 MQ 消息队列时,需要考虑这 3 个问题:

  • 如何知道有消息丢失?
  • 哪些环节可能丢消息?
  • 如何确保消息不丢失?

1、如何知道有消息丢失?

如何感知消息是否丢失了?可总结如下:

  1. 他人反馈: 运营、PM 反馈消息丢失。
  2. 监控报警: 监控指定指标,即时报警人工调整。Kafka 集群异常、Broker 宕机、Broker 磁盘挂载问题、消费者异常导致消息积压等都会给用户直接感觉是消息丢失了。
  3. 另外,公众 号Java精选,回复java面试,获取面试资料,支持在线刷题。

案例:舆情分析中数据采集同步

  • PM 可自己下发采集调度指令,去采集特定数据。
  • PM 可通过 ES 近实时查询对应数据,若没相应数据可再次下发指令。

当感知消息丢失了,那就需要一种机制来检查消息是否丢失。

检索消息

运维工具有:

  1. 查看 Kafka 消费位置:

# 查看某个topic的message数量
$ ./kafka-run-class.sh
kafka.tools.GetOffsetShell --broker-list localhost:9092 --topic test_topic
# 查看consumer Group列表,面试宝典:https://www.yoodb.com
$
./kafka-consumer-groups.sh --list --bootstrap-server 192.168.88.108:9092
# 查看 offset 消费情况
$
./kafka-consumer-groups.sh --bootstrap-server localhost:9092 --group console-consumer-1152 --describe
GROUP TOPIC PARTITION CURRENT-OFFSET LOG-END-OFFSET LAG CONSUMER-ID HOST CLIENT-IDconsole-consumer-1152 test_topic 0 - 4 -
consumer-console-consumer-1152-1-2703ea2b-b62d-4cfd-8950-34e8c321b942 /127.0.0.1 consumer-console-consumer-1152-1

  1. 利用工具:Kafka Tools

  1. 其他可见化界面工具

2、哪些环节可能丢消息?

一条消息从生产到消费完成经历 3 个环节:消息生产者、消息中间件、消息消费者。

哪个环节都有可能出现消息丢失问题。

1)生产端

首先要认识到 Kafka 生产端发送消息流程:

调用 send() 方法时,不会立刻把消息发送出去,而是缓存起来,选择恰当时机把缓存里的消息划分成一批数据,通过 Sender 线程按批次发送给服务端 Broker。

此环节丢失消息的场景有: 即导致 Producer 消息没有发送成功

  1. 网络波动: 生产者与服务端之间的链路不可达,发送超时。现象是:各端状态正常,但消费端就是没有消费消息,就像丢失消息一样。
  2. *解决措施: *重试 props.put("retries", "10");
  3. 不恰当配置: 发送消息无 ack 确认; 发送消息失败无回调,无日志。producer.send(new ProducerRecord<>(topic, messageKey, messageStr),
    new CallBack(){...});
  4. *解决措施: *设置 acks=1 或者 acks=all。发送消息设置回调。

回顾下重要的参数: acks

  • acks=0:不需要等待服务器的确认. 这是 retries 设置无效. 响应里来自服务端的 offset 总是 -1,producer只管发不管发送成功与否。延迟低,容易丢失数据。
  • acks=1:表示 leader 写入成功(但是并没有刷新到磁盘)后即向 producer 响应。延迟中等,一旦 leader 副本挂了,就会丢失数据。
  • acks=all:等待数据完成副本的复制, 等同于 -1. 假如需要保证消息不丢失, 需要使用该设置. 同时需要设置 unclean.leader.election.enable 为 true, 保证当 ISR 列表为空时, 选择其他存活的副本作为新的 leader.

2)服务端

先来了解下 Kafka Broker 写入数据的过程:

  1. Broker 接收到一批数据,会先写入内存 PageCache(OS Cache)中。
  2. 操作系统会隔段时间把 OS Cache 中数据进行刷盘,这个过程会是 「异步批量刷盘」 。

这里就有个隐患,如果数据写入 PageCache 后 Kafka Broker宕机会怎样?机子宕机/掉电?

  • Kafka Broker 宕机: 消息不会丢失。因为数据已经写入 PageCache,只等待操作系统刷盘即可。
  • 机子宕机/掉电: 消息会丢失。因为数据仍在内存里,内存RAM 掉电后就会丢失数据。

解决方案 :使用带蓄电池后备电源的缓存 cache,防止系统断电异常。

对比学习 MySQL 的 “双1” 策略,基本不使用这个策略,因为 “双1” 会导致频繁的 I/O 操作,也是最慢的一种。

对比学习 Redis 的 AOF 策略,默认且推荐的策略:**Everysec(AOF_FSYNC_EVERYSEC) 每一秒钟保存一次(默认):** 。每个写命令执行完, 只是先把日志写到 AOF 文件的内存缓冲区, 每隔一秒把缓冲区中的内容写入磁盘。

拓展:Kafka 日志刷盘机制

# 推荐采用默认值,即不配置该配置,交由操作系统自行决定何时落盘,以提升性能。
# 针对 broker 配置:

log.flush.interval.messages=10000 # 日志落盘消息条数间隔,即每接收到一定条数消息,即进行log落盘。
log.flush.interval.ms=1000 # 日志落盘时间间隔,单位ms,即每隔一定时间,即进行log落盘。
# 针对 topic 配置:面试宝典:https://www.yoodb.com
flush.messages.flush.ms=1000 # topic下每1s刷盘
flush.messages=1 # topic下每个消息都落盘
# 查看 Linux 后台线程执行配置
$ sysctl -a | grep dirtyvm.dirty_background_bytes = 0vm.dirty_background_ratio = 10 # 表示当脏页占总内存的的百分比超过这个值时,后台线程开始刷新脏页。
vm.dirty_bytes = 0vm.dirty_expire_centisecs = 3000 # 表示脏数据多久会被刷新到磁盘上(30秒)。
vm.dirty_ratio = 20
vm.dirty_writeback_centisecs = 500 # 表示多久唤醒一次刷新脏页的后台线程(5秒)。

vm.dirtytime_expire_seconds = 43200

Broker 的可靠性需要依赖其多副本机制: 一般副本数 3 个(配置参数:replication.factor=3)

  • Leader Partition 副本:提供对外读写机制。
  • Follower Partition 副本:同步 Leader 数据。

副本之间的数据同步也可能出现问题:数据丢失问题和数据不一致问题。

解决方案:ISR 和 Epoch 机制

  • ISR(In-Sync Replicas) : 当 Le``ader 宕机,可以从 ISR 中选择一个 Follower 作为 Leader。
  • Epoch 机制: 解决 Leader 副本高水位更新和 Follower 副本高水位更新在时间上是存在错配问题。Tips: Kafka 0.11.x 版本才引入 leader epoch 机制解决高水位机制弊端。

对应需要的配置参数如下:

  1. acks=-1 或者 acks=all: 必须所有副本均同步到消息,才能表明消息发送成功。
  2. replication.factor >= 3: 副本数至少有 3 个。
  3. min.insync.replicas > 1: 代表消息至少写入 2个副本才算发送成功。前提需要 acks=-1。举个栗子:Leader 宕机了,至少要保证 ISR 中有一个 Follower,这样这个Follwer被选举为Leader 且不会丢失数据。公式:replication.factor = min.insync.replicas + 1
  4. unclean.leader.election.enable=false: 防止不在 ISR 中的 Follower 被选举为 Leader。Kafka 0.11.0.0版本开始默认 unclean.leader.election.enable=false

3)消费端

消费端消息丢失场景有:

  1. 消息堆积: 几个分区的消息都没消费,就跟丢消息一样。
  2. 解决措施: 一般问题都出在消费端,尽量提高客户端的消费速度,消费逻辑另起线程进行处理。
  3. 自动提交: 消费端拉下一批数据,正在处理中自动提交了 offset,这时候消费端宕机了; 重启后,拉到新一批数据,而上一批数据却没处理完。
  4. 解决措施: 取消自动提交 auto.commit = false,改为手动 ack。
  5. 心跳超时,引发 Rebalance: 客户端心跳超时,触发 Rebalance被踢出消费组。如果只有这一个客户端,那消息就不会被消费了。同时避免两次 poll 的间隔时间超过阈值:
  6. max.poll.records:降低该参数值,建议远远小于 <单个线程每秒消费的条数> * <消费线程的个数> * 的积。
  7. max.poll.interval.ms: 该值要大于 / (<单个线程每秒消费的条数> * <消费线程的个数>) 的值。
  8. 解决措施: 客户端版本升级至 0.10.2 以上版本。

案例:凡凡曾遇到数据同步时,消息中的文本需经过 NLP 的 NER 分析,再同步到 ES。

这个过程的主要流程是:

  1. 数据同步程序从 Kafka 中拉取消息。
  2. 数据同步程序将消息内的文本发送的 NER 进行分析,得到特征数组。
  3. 数据同步程序将消息同步给 ES。

现象:线上数据同步程序运行一段时间后,消息就不消费了。

  • 排查日志: 发现有 Rebalance 日志,怀疑是客户端消费太慢被踢出了消费组。
  • 本地测试: 发现运行一段时间也会出现 Rebalance,且 NLP的NER 服务访问 HTTP 500 报错。
  • 得出结论: 因NER服务异常,导致数据同步程序消费超时。且当时客户端版本为 v0.10.1,Consumer 没有独立线程维持心跳,而是把心跳维持与 poll 接口耦合在一起,从而也会造成心跳超时。

当时解决措施是:

  1. session.timeout.ms: 设置为 25s,当时没有升级客户端版本,怕带来其他问题。
  2. 熔断机制: 增加 Hystrix,超过 3 次服务调用异常就熔断,保护客户端正常消费数据。

3、如何确保消息不丢失?

掌握这些技能:

  1. 熟悉消息从发送到消费的每个阶段
  2. 监控报警 Kafka 集群
  3. 熟悉方案 “MQ 可靠消息投递”

怎么确保消息 100% 不丢失?

到这,总结下:

  1. 生产端:
  • 设置重试:props.put("retries", "10");
  • 设置 acks=all
  • 设置回调:producer.send(msg, new CallBack(){...});
  1. Broker:
  • 内存:使用带蓄电池后备电源的缓存 cache。
  • Kafka 版本 0.11.x 以上:支持 Epoch 机制。
  • replication.factor >= 3: 副本数至少有 3 个。
  • min.insync.replicas > 1: 代表消息至少写入 2个副本才算发送成功。前提需要 acks=-1。
  • unclean.leader.election.enable=false: 防止不在 ISR 中的 Follower 被选举为 Leader。
  1. 消费端
  • 客户端版本升级至 0.10.2 以上版本。
  • 取消自动提交 auto.commit = false,改为手动 ack。
  • 尽量提高客户端的消费速度,消费逻辑另起线程进行处理。
一文读懂kafka消息丢失问题和解决方案 今天分享一下kafka的消息丢失问题,kafka的消息丢失是一个很值得关注的问题,根据消息的重要性,消息丢失的严重性也会进行放大,如何从最大程度上保证消息不丢失,要从生产者,消费者,broker几个端来说。关于kafka的消息丢失问题和解决方案就说到这里,我们分别从生产者到broker,broker到磁盘以及消费者端进行说明,也引申出一些知识点,可能平时没有遇到消息丢失的情况,那是因为网络比较可靠,数据量可能不大,但是如果要真的实现高可用,高可靠,那么就需要对其进行设计。 阅读详情

相关推荐

面试官:Kafka 会不会丢消息?怎么处理的?

Kafka存在丢消息的问题,消息丢失会发生在Broker,Producer和Consumer三种。 Broker Broker丢失消息是由于Kafka本身的原因造成的,kafka为了得到更高的性能和吞吐量,将数据异步批量的存储在磁盘中。消息的刷盘过程,为了提高性能,减少刷盘次数,kafka采用了批量刷盘的做法。即,按照一定的消息量,和时间间隔进行刷盘。 这种机制也是由于linux操作系统决定的。将数据存储到linux操作系统种,会先存储到页缓存(Page cache)中,按照时间或者其他条件进行刷

m0_67322837的博客 531

Kafka消息丢失:原因、解决方案和零丢失的配置

Kafka消息丢失是一个常见的问题,但通过合理的配置和实施解决方案,可以降低消息丢失的风险。本文介绍了Kafka消息丢失的原因、解决方案以及实现零丢失的配置方法。通过正确配置生产者和消费者、增加副本因子、监控和警报系统,以及合理的容量规划,我们可以实现高可靠性的消息传递系统。

果酱 の 博客 7646

Kafka消息丢失:原因与解决方案

然而,尽管Kafka被设计为高可靠的系统,但在某些情况下,可能会发生消息丢失的问题。通过合理配置和实施相应的解决方案,可以最大程度地减少消息丢失的风险,并确保Kafka系统的可靠性和稳定性。b. 实现消息处理的幂等性:通过设计消费者的消息处理逻辑具有幂等性,即无论消息被处理多次,结果都是一致的,可以避免重复消费和丢失消息的问题。b. 增加副本的数量:通过增加副本的数量,可以提高消息的冗余度,减少消息丢失的风险。,可以使消费者在处理消息后自动提交偏移量,确保不会丢失已处理的消息。,可以确保消息及时写入磁盘。

LmzActionscript的博客 630

剖析 Kafka 消息丢失的原因

Kafka消息丢失的原因通常涉及多个方面,包括生产者、消费者和Kafka服务端(Broker)的配置和行为。下面将围绕这三个关键点,详细探讨Kafka消息丢失的常见原因,并提供相应的解决方案和最佳实践。总的来说,Kafka消息丢失是一个涉及多个环节的问题,需要从生产者、Broker和消费者三个层面综合考虑。通过合理的配置和策略,结合监控和及时的应对措施,可以大幅降低消息丢失的风险,确保数据在分布式系统中的可靠传递。

fhey的博客 3362

Win11/Win10系统下,Proe5.0 M280终极版保姆级安装与激活指南(含SSQ补丁避坑)

本文提供Win11/Win10系统下Pro/E 5.0 M280终极版的详细安装与激活指南,涵盖环境配置、SSQ补丁应用及常见问题解决方案。通过系统调整、分步安装和性能优化,确保软件在现代操作系统上的稳定运行,特别适合机械设计用户参考。

weixin_30895059的博客 446

xenomai内核解析--嵌入式实时linux概述

Linux系统作为一个GPOS(通用操作系统)发展至今已经非常成熟可靠了,并且由于遵循GPL协议,开放所有系统源代码,非常易于裁剪。更重要的是,与其他开源的GPOS或RTOS相比,Linux系统支持多种处理器、开发板,提供多种软件开发工具,同时Linux系统对网络和图形界面的支持非常出色。显然,选择Linux操作系统在产品的开发周期和成本控制方面都有巨大优势。 虽然Linux系统功能强大、实用性强...

wsg1100 3702

面试官问我如何保证Kafka不丢失消息?我哭了!

kafka如何保证不丢消息 ps:这篇文章自我感觉说的很大白话了!希望你们看过了之后能有收获。 不了解 Kafka 的朋友建议先看一看我的下面这几篇文章,第一篇一定要看,其他的可以按需学习。 入门篇!大白话带你认识 Kafka! 5分钟带你体验一把 Kafka Kafka系列第三篇!10 分钟学会如何在 Spring Boot 程序中使用 Kafka 作为消息队列? 生产者丢失消息的情况 生产...

JavaGuide 9583

FPGA图像处理入门 ZYNQ7020 图像中值膨胀腐蚀滤波

图像处理的三种滤波 中值滤波应用较为广泛 综合膨胀和腐蚀可以实现边缘检测。

Coast_的博客 715

面试官:如何保证 Kafka 消息的可靠性,做到不丢消息?(教科书式回答)

本文将带你走过一条消息从诞生到被消费的全链路,并通过流程图,清晰地展示在每个环节应该如何配置,以构建一个真正可靠的 Kafka 消息系统。消息丢失的第一个风险点,在于生产者发送消息的那一刻。通过“先完成业务处理,再手动提交偏移量”的模式,即使消费者宕机,重启后也能从上一个安全点重新消费,确保了消息。如果消费者拉取了一批消息,正在处理中,但还未处理完就到了自动提交的时间点,此时消费者宕机。性能最高,但丢消息的风险也最大。消息在 Broker 端是安全的,但如果消费者在处理消息时出现问题,消息也可能“丢失”。

郑龙飞 1877

一文详解数据仓库、数据湖、湖仓一体和数据网格

本文对数据仓库、数据湖、湖仓一体、数据网格四个技术概念进行了辨析,并对它们的优势和局限给出了对比介绍。

oOBubbleX的博客 2596

图像处理入门007:图像处理中的数学基础:线性代数与卷积

一种:把 OpenCV 当黑盒,调用,效果不对就乱调参数;另一种:理解每个像素是怎么被周围邻域"加权平均"的,理解核翻转、边界填充、stride 的含义。前者能干活,后者能解难题。一旦遇到自定义核(比如 ISP 上的锐化)、深度学习反向传播、医学图像重建,你就必须把卷积、相关、矩阵乘法这些基本功捡回来。线性代数三件套:向量点积、矩阵乘法、线性变换;2D 卷积的数学定义:核翻转、滑动窗口、边界填充。并手写一个,验证它与和的结果完全一致(误差 < 1e-9)。f∗gn∑m−∞∞f。

专注:太空算力、AI infra、异构调度、大模型成本工程 387

面试官问:Kafka 会不会丢消息?怎么处理的?

来源 |https://blog.dogchao.cn/?p=305Kafka存在丢消息的问题,消息丢失会发生在Broker,Producer和Consumer三种。BrokerBro...

qq_14958051的博客 104

MATLAB - ROS 2 工具箱入门教程

ROS 工具箱提供了一个连接 MATLAB® 和 Simulink® 与机器人操作系统(ROS 和 ROS 2)的接口。利用该工具箱,您可以设计 ROS 节点网络,并将 MATLAB 或 Simulink 生成的 ROS 节点与现有的 ROS 网络相结合。工具箱包括 MATLAB 函数和 Simulink 块,可通过记录、导入和回放 rosbag 文件来可视化和分析 ROS 数据。您还可以连接到实时 ROS 网络,访问 ROS 消息。

机器人控制与仿真应用 3070

面试官问:为什么kafka这么快,又能保证消息不丢失?

小菜鸡最近在疯狂面试中,就是为了能拿到一份满意的offer,这不上周又去头条受虐了。 面试过程中,由于小菜鸡的充分准备(letcode各种刷),各种算法题不在话下,顺利的通过的头条变态的算法面试。 面试官: 我看你项目中用到了kafka,你觉得你这个场景一定需要kafka吗,有没有其它替代方案? 小菜鸡一听,很紧张啊,早知道简历上不写kafka了,原因你懂得,就好像redis只会put和ge...

谢谢你,慌乱了我的年华 1980

从零开始学习CANoe(六)—— CAPL 测试节点

创建CAPL Test Module的两种方式

蚂蚁小兵 1万+

ValueError:Using a `device_map`, `tp_plan`, `torch.device` context manager or setting `torch.set解决方案

本文主要介绍了ValueError:Using a `device_map`, `tp_plan`, `torch.device` context manager or setting 'torch.set_default_device(device)` requires `accelerate`解决方案,希望能对使用transformers的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 3万+

面试官:Kafka 会不会丢消息?怎么处理的?一篇文章带你学习

在正常情况下,客户端的异步调用可以通过callback来处理消息发送失败或者超时的情况,但是,一旦producer被非法的停止了,那么buffer中的数据将丢失,broker将无法收到该部分数据。Broker丢失消息是由于Kafka本身的原因造成的,kafka为了得到更高的性能和吞吐量,将数据异步批量的存储在磁盘中。消息的刷盘过程,为了提高性能,减少刷盘次数,kafka采用了批量刷盘的做法。中有实现,实现原理是将异步刷盘的流程进行阻塞,等待响应,类似ajax的callback或者是java的future。

程序源日志的博客 1267

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

为什么消息队列使用kafka,而不是用其他消息队列(热度计算)

黑马头条:为什么消息队列使用kafka,而不是用其他消息队列

2302_80981029的博客 970

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

贝叶斯统计 [韦来生编]

贝叶斯(Bayes)统计是近几十年来迅速发展起来的数理统计的一个重要分支。贝叶斯方法与经典统计方法的主要不同之处是进行统计推断时除了利用样本信息外,还要利用参数的先验信息,因此可以提高统计推断或统计决策的效果。它在经济、金融、生物、医学、自然科学和社会科学等许多领域具有广泛的应用。贝叶斯方法的研究已渗透到了统计学的几乎所有领域。作者在给中国科学技术大学概率论与数理统计专业本科生开设的“数理统计”课程中有一章专门讲授“贝叶斯方法和统计决策理论”,近十年来也给中国科学技术大学概率统计专业研究生开设过几次“贝叶斯分析”课。本书是在对过去讲稿的内容作了适当的增减和调整的基础上完成的。  本书共分六章。第1章是绪论,介绍了贝叶斯统计的若干基本概念,同时对必要的数理统计的基础知识有重点地作了回顾。第二章介绍了确定先验分布的若干可供选择的方法。第三章介绍了几类常见统计模型参数的后验分布的主要结果和计算方法。第四章和第五章分别介绍了“贝叶斯统计推断”和“贝叶斯统计决策”的内容。第六章介绍了贝叶斯统计计算的若干方法,包括蒙特卡洛方法和马尔可夫链蒙特卡洛(MCMC)方法以及相关统计软件的简介。本书的每一章附右大量的例题和习题,书末附有常用的几个表格和部分习题解答供读者查用。  大约可在54学时内讲授本书的第1章至第六章的主要内容,教师可根据学时需要选讲本书第1章至第六章的部分内容。书中标“*”号的章节可略去不讲,留给读者作为阅读材料。第六章例题中的R代码和部分例题的数据文件等可从作者个人主页下载。  作者在编写本书的过程中参考了J.O.Berger教授的《统计决策论及贝叶斯分析》和茆诗松教授编写的《贝叶斯统计》等书中的一些内容,以及《贝叶斯分析》一书中由张伟平博士编写的有关贝叶斯统计计算的一些内容。在此表示衷心感谢。  本书编写准备过程中,中国科学技术大学统计与金融系的几个研究生帮助完成了本书部分中文的录入和排版,作者对他们的辛勤工作表示真诚的感谢。高等教育出版社为本书的出版给予了大力支持。在此一并致谢。

上一篇: 存储架构|Bitcask 引擎的设计,妙!
下一篇: 一文搞懂JAVA中的线程池
程序员职业指南
博客等级 码龄4年 2139粉丝 960原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值