Kafka面试题
Kafka面试题
Kafka是什么?它的主要特点是什么?
Kafka是一种分布式流处理平台,用于高吞吐量、可扩展的发布和订阅消息系统。它具有以下主要特点:
- 高吞吐量:Kafka能够处理大规模消息流,并保持低延迟。
- 可扩展性:Kafka通过分布在多个服务器上的多个分区来实现水平扩展。
- 持久性:Kafka将所有消息持久保存在磁盘上,因此可以持久存储和再处理。
- 容错性:Kafka在集群中复制分区以提供容错性,并能够自动重新平衡分区和故障转移。
Kafka应用场景?
- 消息队列:比起大多数的消息系统来说,Kafka 有更好的吞吐量,内置的分区,冗余及容错性,这让 Kafka 成为了一个很好的大规模消息处理应用的解决方案。消息系统一般吞吐量相对较低,但是需要更小的端到端延时,并常常依赖于 Kafka 提供的强大的持久性保障。在这个领域,Kafka 足以媲美传统消息系统,如 ActiveMQ 或 RabbitMQ 。
- 行为跟踪:跟踪用户浏览页面、搜索及其他行为,以发布订阅的模式实时记录到对应的 Topic 里。那么这些结果被订阅者拿到后,就可以做进一步的实时处理,或实时监控,或放到 Hadoop / 离线数据仓库里处理。
- 元信息监控:作为操作记录的监控模块来使用,即汇集记录一些操作信息,可以理解为运维性质的数据监控吧。
- 日志收集:日志收集方面,其实开源产品有很多,包括 Scribe、Apache Flume 。很多人使用 Kafka 代替日志聚合(log aggregation)。日志聚合一般来说是从服务器上收集日志文件,然后放到一个集中的位置(文件服务器或 HDFS)进行处理。 Kafka 忽略掉文件的细节,将其更清晰地抽象成一个个日志或事件的消息流。这就让 Kafka 处理过程延迟更低,更容易支持多数据源和分布式数据处理。Kafka 提供同样高效的性能和因为复制导致的更高的耐用性保证,以及更低的端到端延迟。
- 流处理:保存收集流数据,以提供之后对接的 Storm 或其他流式计算框架进行处理。很多用户会将那些从原始 Topic 来的数据进行阶段性处理,汇总,扩充或者以其他的方式转换到新的 Topic 下再继续后面的处理。例如一个文章推荐的处理流程,可能是先从 RSS 数据源中抓取文章的内容,然后将其丢入一个叫做“文章”的 Topic 中。后续操作可能是需要对这个内容进行清理,比如回复正常数据或者删除重复数据,最后再将内容匹配的结果返还给用户。这就在一个独立的 Topic 之外,产生了一系列的实时数据处理的流程。Strom 和 Samza 是非常著名的实现这种类型数据转换的框架。
- 事件源:是一种应用程序设计的方式。该方式的状态转移被记录为按时间顺序排序的记录序列。Kafka 可以存储大量的日志数据,这使得它成为一个对这种方式的应用来说绝佳的后台。比如动态汇总(News feed)。
- 持久性日志(Commit Log):Kafka 可以为一种外部的持久性日志的分布式系统提供服务。这种日志可以在节点间备份数据,并为故障节点数据回复提供一种重新同步的机制。Kafka 中日志压缩功能为这种用法提供了条件。
Kafka的消息发布和订阅模型是怎样的?
Kafka使用发布和订阅模型。在该模型中,消息生产者将消息发布到一个或多个主题(topics)中,而消费者则订阅一个或多个主题来接收消息。主题是消息的逻辑容器,而分区(partitions)是主题的物理分割。
什么是Kafka的分区(partitions)?
Kafka的分区是主题的物理分割,用于实现数据的水平扩展和并行处理。每个分区都是有序且不可变的消息序列。分区允许并行处理和负载均衡,因为每个分区可以在不同的服务器上进行读写操作。
Kafka的生产者和消费者是如何工作的?
生产者使用Kafka客户端库将消息发布到指定的主题中。生产者可以选择将消息直接发送到指定的分区,也可以让Kafka根据某种策略自动选择分区。消费者订阅一个或多个主题,并从分区中拉取消息进行处理。
Kafka的消息保存在哪里?它们是如何被删除的?
Kafka的消息保存在磁盘上,通常以日志文件的形式。每个主题的分区都有一个日志文件,其中包含按顺序追加的消息。消息可以根据时间保留一段时间(如7天)或保留一定的存储空间(如1TB),一旦达到保留策略,旧的消息将被删除。
什么是Kafka的副本(replicas)?
Kafka使用复制机制来提供容错性和高可用性。副本是分区的拷贝,其中一个副本被视为领导者(leader),负责处理读写请求,其他副本则被称为追随者(follower)。如果领导者副本故障,追随者之一将被选举为新的领导者。
Kafka的消息传递保证是什么?
Kafka提供了至少一次的传递保证。这意味着,一旦消息被写入领导者副本,生产者会收到确认。如果在消息复制到所有副本之前领导者副本发生故障,但在复制之后追随者副本发生故障,Kafka将不会丢失消息。
什么是Kafka的消费者组(consumer group)?
消费者组是一组消费者实例的集合,它们共同订阅一个或多个主题。Kafka使用消费者组来实现负载均衡和并行处理。每个消费者组中的消费者将分区进行分配,以便每个分区只被一个消费者实例消费,并且当消费者加入或离开消费者组时,分区的分配会自动重新平衡。
Kafka的重平衡是什么?它是如何工作的?
重平衡是指当消费者组中的消费者实例发生变化(加入或离开)时,Kafka自动重新分配分区的过程。重平衡确保每个消费者实例具有平均分配的分区负载,并确保没有分区被多个消费者实例同时消费。重平衡是通过消费者组协调器来实现的。
Kafka的消息偏移量(offset)是什么?它的作用是什么?
消息偏移量是一个唯一标识符,用于标识消息在分区中的位置。消费者使用偏移量来跟踪已经消费的消息,并确保在重启后能够从上次消费的位置继续消费。偏移量还用于控制消费者的位置,可以重置偏移量以重新读取消息。
Kafka的网络模型是怎样的?
Kafka内部,基于Java NIO封装了网络模型。
- Kafka Client:单线程Selector模型。
- Kafka Server:多线程Selector模型。
Kafka的数据存储模型是怎么样的?
Kafka每个Topic下面的所有消息都是以Partition的方式分布式的存储在多个节点上。同时在Kafka的机器上,每个Partition其实都会对应一个日志目录,在目录下面会对应多个日志分段(LogSegment)。
Kafka如何保证消息的顺序性?
- Consumer,对每个Partition内部单线程消费,单线程吞吐量太低,一般不会用这个。
- Consumer,拉取到消息后,写到N个内存queue,具有相同key的数据都到同一个内存 queue 。然后,对于N个线程,每个线程分别消费一个内存 queue 即可,这样就能保证顺序性。