网易面试真题:讲讲 kafka 维护消费状态跟踪的方法?

解析:大部分消息系统在 broker 端的维护消息被消费的记录:一个消息被分发到consumer 后 broker 就马上进行标记或者等待 customer 的通知后进行标记。这样也可以在消息在消费后立马就删除以减少空间占用。
但是这样会不会有什么问题呢?如果一条消息发送出去之后就立即被标记为消费过的,一旦 consumer 处理消息时失败了(比如程序崩溃)消息就丢失了。为了解决这个问题,很多消息系统提供了另外一个个功能:当消息被发送出去之后仅仅被标记为已发送状态,当接到 consumer 已经消费成功的通知后才标记为已被消费的状态。这虽然解决了消息丢失的问题,但产生了新问题,首先如果 consumer处理消息成功了但是向 broker 发送响应时失败了,这条消息将被消费两次。第二个问题时,broker 必须维护每条消息的状态,并且每次都要先锁住消息然后更改状态然后释放锁。这样麻烦又来了,且不说要维护大量的状态数据,比如如果消息发送出去但没有收到消费成功的通知,这条消息将一直处于被锁定的状态,Kafka 采用了不同的策略。Topic 被分成了若干分区,每个分区在同一时间只被一个 consumer 消费。这意味着每个分区被消费的消息在日志中的位置仅仅是一个简单的整数:offset。这样就很容易标记每个分区消费状态就很容易了,仅仅需要一个整数而已。这样消费状态的跟踪就很简单了。

Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是在现代网络上的许多社会功能的一个关键因素。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。在大厂Kafka也是经常被问到的一个问题,我学习Kafka的时候也整理一些学习笔记,和收集了很多的面试真题,希望能够对大家有一定的帮助。

历年来关于Kafka的一些面试真题(含解析):

如何获取 topic 主题的列表

生产者和消费者的命令行是什么?

consumer 是推还是拉?

讲讲 kafka 维护消费状态跟踪的方法

讲一下主从同步

为什么需要消息系统,mysql 不能满足需求吗?

Zookeeper 对于 Kafka 的作用是什么?

数据传输的事务定义有哪三种?

Kafka 判断一个节点是否还活着有那两个条件?

Kafka 与传统 MQ 消息系统之间有三个关键区别

讲一讲 kafka 的 ack 的三种机制

消费者故障,出现活锁问题如何解决?

如何控制消费的位置

kafka 分布式(不是单机)的情况下,如何保证消息的顺序消费?

kafka 的高可用机制是什么?

kafka 如何减少数据丢失

kafka 如何不消费重复数据?比如扣款,我们不能重复的扣。


kafka面试真题解析

我整理的关于Kafka(含核心知识点以及思维导图xmind):


Kafka 概念:

Kafka 是一种高吞吐量、分布式、基于发布/订阅的消息系统,最初由 LinkedIn 公司开发,使用Scala 语言编写,目前是 Apache 的开源项目。

broker:Kafka 服务器,负责消息存储和转发

topic:消息类别,Kafka 按照 topic 来分类消息

partition:topic 的分区,一个 topic 可以包含多个 partition,topic 消息保存在各个partition 上

offset:消息在日志中的位置,可以理解是消息在 partition 上的偏移量,也是代表该消息的唯一序号

Producer:消息生产者

Consumer:消息消费者

Consumer Group:消费者分组,每个 Consumer 必须属于一个 group

Zookeeper:保存着集群 broker、topic、partition 等 meta 数据;另外,还负责 broker 故障发现,partition leader 选举,负载均衡等功能

Kafka 数据存储设计:

partition 的数据文件(offset,MessageSize,data)

数据文件分段 segment(顺序读写、分段命令、二分查找)

数据文件索引(分段索引、稀疏存储)

生产者设计:

负载均衡(partition 会均衡分布到不同 broker 上)

批量发送

压缩(GZIP 或 Snappy)

消费者设计:

Consumer Group

读者福利:

由于题量较多,篇幅的限制,文章中的面试题分享没有全部附上详细的解析,希望各位同仁理解

但是整理成了一份详细的PDF文档可分享给大家

领取方式:关注我的供种号(Java周某人)即可领取

近千道大厂面试题整理(PDF)带详细解析