Kafka面试整理

1、Kafka 如何保证消息的有序性?

kafka是一个分布式的、基于发布/订阅模式的消息队列系统。在kafka中,信息有序性是通过以下几个方面来实现的:

1、消息分区 kafka将数据分散存储在多个broker节点上。每个主题(topic)可以被划分成多个不同的分区(partition),而且每个分区内的消息都有自己的offset偏移量。这个offset可以看作是一条消息在分区中的唯一标识符,kafka会确保每个分区内部的消息存储顺序是有序的。

2、生产者端有序性 在kafka中,生产者(producer)可以选择将消息发送到指定的分区,也可以让kafka自动为消息选择一个合适的目标分区。当生产者使用同步发送(sync)方式将消息发送到指定的分区时,kafka会按照消息发送的顺序依次将它们写入到目标分区中。

3、消费者端有序性 消费者(consumer)从kafka中读取消息时,可以指定读取的起始位置(offset),kafka会按照offset顺序返回消息给客户端。在消费者组消费场景下,kafka还会对多个消费者之间的消息进行协调,确保每条消息只能被其中一个消费者处理,并且每个消费者只能读取到特定分区内的消息,这样就保证了消费者端的有序性。 综上所述,kafka通过分区、生产者端和消费者端的有序性保证了数据在传输、存储、消费的过程中的有序性。

2、Kafka 如何实现高吞吐量?

Apache Kafka 作为一款高性能的消息队列系统,能够在大规模分布式环境中实现高吞吐量。其高吞吐量的实现主要依赖于以下几个关键设计与技术特点:

1. 分布式架构与水平扩展性 Broker集群:Kafka 采用分布式架构,由多个独立的 Broker 组成集群。每个 Broker 负责存储和提供一部分主题分区的数据。客户端(Producer 和 Consumer)可以与整个集群交互,而非单个节点,这使得系统的整体吞吐量能够随着 Broker 数量的增加而线性提升。 分区与并行处理:Kafka 主题被划分为多个分区,每个分区都可以独立地接收和处理消息。Producer 可以选择性地将消息发送到特定分区,或者让 Kafka 自动分配。Consumer 可以并行消费不同分区的消息,从而实现并行处理,显著提高吞吐量。

2. 高效存储与索引 顺序写入:Kafka Broker 将接收到的消息按顺序追加到磁盘上的日志文件中,这种顺序写入模式极大地减少了磁盘寻道时间,提高了 I/O 性能。此外,现代操作系统通常会对连续写操作进行缓存优化,进一步提升写入速度。 零拷贝技术:Kafka 利用操作系统提供的“零拷贝”功能,减少数据在内核空间与用户空间之间不必要的复制,直接将数据从网络缓冲区传递到磁盘,极大降低了 CPU 使用率和延迟。 索引优化:Kafka 对消息存储的日志文件进行了高效索引,使用偏移量(offset)快速定位消息,无需全量扫描文件。此外,Kafka 仅保留一定时间窗口内的日志段(log segment),过期数据会被自动删除,保持存储高效。

3. 批处理与压缩 批量发送:Producer 可以选择累积一定数量的消息后一次性发送(批次),减少网络交互次数。批处理结合高效的网络协议(如 TCP 协议的 Nagle 算法),有效降低了网络开销。 压缩传输:Kafka 支持消息压缩(如 GZIP、Snappy、LZ4 等),Producer 在发送前对消息批次进行压缩,Consumer 接收后解压。虽然增加了压缩与解压的计算成本,但在大多数情况下,压缩能够显著减小数据在网络中的传输量,尤其对于文本或结构化数据,压缩比往往很高,从而提升整体吞吐量。

4. 高效消费者模型 拉取(Pull)模式:Kafka 采用 Consumer 拉取(Pull)消息而非 Broker 推送(Push)消息的模式。Consumer 根据自身处理能力主动请求数据,避免了因 Broker 过快推送导致 Consumer 处理不过来的情况,实现了流量控制,保证了系统的稳定性和高吞吐。 长轮询与缓存:Consumer 在拉取消息时可以使用长轮询(long polling)机制,即在无新消息时阻塞一段时间再返回,减少空轮询带来的网络开销。此外,Kafka 支持 Consumer 缓存部分数据,减少频繁与 Broker 通信。 消费者组与分区分配:Kafka 提供消费者组(Consumer Group)概念,组内多个 Consumer 共享订阅主题的所有分区,每个分区只被组内一个 Consumer 消费。这种设计允许在一组 Consumer 间自动均衡负载,同时确保消息的有序消费,提高了整体消费能力。

5. 高效网络通信与协议优化 TCP 协议:Kafka 基于稳定的 TCP/IP 协议进行数据传输,保证了数据的可靠传输。 二进制协议:Kafka 使用自定义的二进制协议进行通信,相比文本协议,二进制协议更紧凑,解析效率更高,有助于提升网络通信性能。 高效心跳与协调:Kafka 的心跳机制用于维持 Broker 与 Consumer 的连接,并进行必要的元数据同步和分区再平衡。高效的心跳与协调机制减少了无谓的网络通信,保证了高并发下的稳定性和吞吐量。 综上所述,Kafka 通过分布式架构、高效存储与索引、批处理与压缩、高效消费者模型以及网络通信优化等多个层面的设计与技术实现,确保了其在大规模分布式环境中的高吞吐量。实际应用中,可以根据业务需求对相关配置进行调优,如调整批次大小、压缩算法、消费者数量等,以进一步提升系统的吞吐性能。

3、Kafka 零拷贝原理

传统的 IO 模型 如果要把磁盘中的某个文件发送到远程服务器需要经历以下几个步骤

(1) 从磁盘中读取文件的内容,然后拷贝到内核缓冲区

(2) CPU把内核缓冲区的数据赋值到用户空间的缓冲区

(3) 在用户程序中调用write方法,把用户缓冲区的数据拷贝到内核下面的Socket Buffer中

(4) 把内核下面的Socket Buffer中的数据赋值到网卡的缓冲区

(5) 网卡的缓冲区把数据传输到目标服务器上 我们可以看到这个过程中经历了四次拷贝 我们所说的零拷贝并不是没有拷贝(数据赋值),去掉的两次浪费的拷贝分别是

1.从内核空间赋值到用户空间的拷贝 

2.从用户空间再次复制到内核空间的拷贝

由于用户空间和内核空间的切换会带来CPU的上下文切换,对于CPU的性能也会造成影响 零拷贝就是把这两次多余的拷贝省略掉,应用程序可以直接把磁盘中的数据从内核中直接传输给Socket,而不再需要经过应用程序所在的用户空间,所以零拷贝不是没有拷贝,而是对于用户空间来说,不再需要进行数据拷贝,这只是较少了不必要的拷贝次数而已。

 在程序中实现零拷贝的方式:

1. 在Linux中,零拷贝技术依赖于底层的sendfile方法实现

2. 在Java中,FileChannel.transferTo()方法的底层调用就是sendfile方法

3. MMAP文件映射机制 mmap(即 memory-mapped file)是一种内存映射文件的机制,它可以让程序将一个文件映射到进程的地址空间,从而实现文件和内存的无缝转换。 具体来说,使用mmap将一个文件映射到进程的地址空间后,该文件就可以像普通的内存一样被读写,甚至可以在多个进程之间共享,而不需要进行繁琐的文件读写操作。在使用mmap时,操作系统会自动将文件的某些部分或者整个文件的内容映射到内存中,而这些映射的内存区域可以被当作普通的内存指针来访问,从而实现对文件内容的访问。 mmap的一些主要应用场景包括: 实现零拷贝(zero-copy)网络传输:可以将网络数据直接映射到进程的地址空间,避免了数据拷贝的开销。 实现高性能的数据库和搜索引擎:将大规模的数据文件映射到内存中,可以大大提升数据的访问速度。 实现内存共享和进程间通信:多个进程可以映射同一个文件到它们各自的地址空间,从而实现进程间共享数据的目的。

4、Kafka 中的 ISR、AR 又代表什么?ISR 伸缩又是什么?

一、ISR and AR 简单来说,分区中的所有副本统称为 AR (Assigned Replicas)。所有与leader副本保持一定程度同步的副本(包括leader副本在内)组成 ISR (In Sync Replicas)。 ISR 集合是 AR 集合的一个子集。消息会先发送到leader副本,然后follower副本才能从leader中拉取消息进行同步。同步期间,follow副本相对于leader副本而言会有一定程度的滞后。前面所说的 ”一定程度同步“ 是指可忍受的滞后范围,这个范围可以通过参数进行配置。于leader副本同步滞后过多的副本(不包括leader副本)将组成 OSR (Out-of-Sync Replied)由此可见,AR = ISR + OSR。正常情况下,所有的follower副本都应该与leader 副本保持 一定程度的同步,即AR=ISR,OSR集合为空。

二、ISR 的伸缩性 leader副本负责维护和跟踪 ISR 集合中所有follower副本的滞后状态,当follower副本落后太多或失效时,leader副本会把它从 ISR 集合中剔除。如果 OSR 集合中所有follower副本“追上”了leader副本,那么leader副本会把它从 OSR 集合转移至 ISR 集合。默认情况下,当leader副本发生故障时,只有在 ISR 集合中的follower副本才有资格被选举为新的leader,而在 OSR 集合中的副本则没有任何机会(不过这个可以通过配置来改变)。

5、Kafka 的 ack 的三种机制是什么?

Kafka的ACK(Acknowledgment)机制是用于确保消息可靠传递的关键组件之一。生产者在发送消息到Kafka集群时,可以通过设置不同的acks参数值来控制消息发送后的确认机制,从而平衡消息的可靠性和延迟时间。

1.acks=0:此模式下,生产者在发送消息后不会等待任何来自Broker的确认响应。这意味着一旦消息被发送出去,即使Broker没有成功写入磁盘,生产者也会继续处理其他任务。这种模式适用于对延迟要求极高且可以容忍一定数据丢失的场景,但如果Broker发生故障,可能会导致消息丢失。 2.acks=1:在此模式下,生产者需要等待Leader副本成功将消息写入本地日志文件后才返回确认。这种模式提供了一定的可靠性保证,因为至少有一个副本已经保存了消息。如果Leader副本在follower副本同步之前崩溃,消息可能会丢失。这种模式适用于大多数应用场景,能够在可接受的延迟范围内提供较好的消息可靠性。

3.acks=all或acks=-1:在此模式下,生产者需要等待所有在ISR(In-Sync Replicas)中的副本都成功写入消息后才返回确认。这种模式提供了最高的消息可靠性保证,因为只有当所有副本都成功写入消息时,生产者才认为消息已经成功发送。这种模式适用于对消息可靠性要求极高的场景,但相应的延迟也会增加。这确保了消息的可靠性,但会导致更长的延迟。 Kafka的ACK机制通过提供不同级别的确认策略,使得生产者可以根据具体的业务需求和对消息可靠性的要求,在吞吐量和消息可靠性之间做出权衡.

6、Kafka 哪些地方使用了零拷贝?

在 Kafka 中,主要有以下几个地方使用了零拷贝技术:

1. 在 Kafka 的生产者端,使用了零拷贝来优化发送消息的效率。具体来说,生产者在发送消息时,会使用 ByteBuffer.wrap() 将消息内容封装成 ByteBuffer 类型,然后在发送给 Kafka 集群时,使用零拷贝技术将 ByteBuffer 直接发送到目的地,而不需要将数据从用户态拷贝到内核态。这一部分的代码位于 org.apache.kafka.clients.producer.KafkaProducer 类中。

2. 在 Kafka 的消费者端,使用了零拷贝来优化消费消息的效率。具体来说,消费者在消费消息时,会使用 ByteBuffer.wrap() 将消息内容封装成 ByteBuffer 类型,然后在消费者应用程序中使用零拷贝技术将 ByteBuffer 直接发送到用户态,而不需要将数据从内核态拷贝到用户态。这一部分的代码位于 org.apache.kafka.clients.consumer.KafkaConsumer 类中。

3. 在 Kafka 的内部存储机制中,使用了零拷贝来优化存储和查询的效率。具体来说,Kafka 使用了内存映射文件的技术来存储消息,并使用零拷贝技术来读写数据。这一部分的代码位于 `org.apache.kafka.common

7、Kafka 怎么保证数据不丢失,不重复

Kafka是一个分布式消息队列系统,具有高可靠性、高性能和高扩展性等特点。在数据传输过程中,Kafka采用了多种措施来保证数据的可靠性,包括数据复制、数据持久化、数据备份等。本文将从各个阶段深入分析Kafka如何保证数据不丢失、不重复,并提供代码实例来验证过程。

一、数据写入阶段

在Kafka中,数据写入的过程包括数据发送和数据持久化两个阶段。在数据发送阶段,生产者将数据发送到Kafka的分区中,Kafka通过副本机制来保证数据可靠性。在数据持久化阶段,Kafka将数据持久化到磁盘中,以防止数据丢失。Kafka通过以下措施来保证数据写入的可靠性:

1.数据复制

Kafka通过副本机制来保证数据的可靠性。每个分区都有多个副本,其中一个副本被称为“领导者”,其他副本被称为“追随者”。生产者将数据发送到领导者副本中,领导者副本将数据复制到其他追随者副本中。只有当所有副本都成功写入数据时,生产者才会收到确认消息,从而保证数据可靠性。

2.数据持久化

Kafka将数据持久化到磁盘中,以防止数据丢失。Kafka使用了一种称为“零拷贝”的技术,可以将数据直接从内存中写入磁盘,避免了数据复制和中间缓存等操作,提高了数据写入的效率和可靠性。
二、数据读取阶段

在Kafka中,消费者从分区中读取数据时,Kafka通过多种机制来保证数据的可靠性和不重复性。以下是Kafka保证数据读取的可靠性和不重复性的措施:

1.消费者组

Kafka将消费者组的概念引入到了消息队列中。消费者组包括多个消费者,每个消费者只能消费分区中的一部分数据。当一个消费者组中的消费者读取一个分区中的数据时,其他消费者就不能再读取该分区中的数据。消费者组的引入保证了数据的不重复性。
2.偏移量

Kafka通过偏移量来保证数据的不重复性。每个分区都有一个偏移量,用于标识消费者已经读取到的数据位置。消费者会将已经读取的数据位置保存在本地磁盘中,以便下次读取时可以从上次读取的位置开始,保证数据不重复。
综上所述,Kafka通过多种机制来保证数据的可靠性和不重复性,包括数据复制、数据持久化、数据备份、消费者组和偏移量等。在使用Kafka时,可以根据具体的业务需求来选择不同的机制来保证数据的可靠性和不重复性。

8、Kafka 分区 Leader 选举策略有几种?
Kafka分区的Leader选举策略是内置在其复制协议中的,主要用于在ISR(In-Sync Replicas,同步副本集)中选择新的Leader。虽然具体的选举策略细节并未公开为多种可配置选项,但其基本逻辑可以概括为以下几点:

1. 自动选举机制:
当当前的Leader副本出现故障或与集群失联时,Kafka会自动触发Leader选举过程。该过程是自动进行的,并且在Zookeeper(在较早版本中)或Kafka内部的Controller(在新版本中)协调下完成。

2.ISR成员选举:
新的Leader总是从ISR集合中选举产生。ISR是指那些与Leader保持最新数据同步的所有副本。当Leader失效时,Controller会从剩余的ISR副本中选择一个新的副本作为Leader。

3. 优先级规则:
在ISR内选举新Leader时,通常会选择具有最高偏移量(也即最“领先”的副本)的副本作为新的Leader,因为这样的副本拥有最新的数据。

4. 不可_clean_选举:
如果所有ISR副本都不可用,则在未配置为严格一致性的情况下(通过设置unclean.leader.election.enable参数),可以从非ISR的副本(称为OSR,Out-of-Sync Replicas)中选举一个副本作为Leader,但这可能导致数据不一致,因为这个副本可能没有包含所有已提交的消息。

总结来说,Kafka并没有提供多种明确的Leader选举策略供用户配置,而是有一个确定的过程来确保在满足一定条件下的自动和有序选举。重点在于保持数据一致性以及在故障恢复时尽快恢复服务。

9、kafka 有几种数据保留的策略?
在 Apache Kafka 中,有几种数据保留策略用于定义消息保存的时长和数据保留的规则。这些策略主要影响 Kafka 中的 Topic。

以下是 Kafka 中常见的数据保留策略:

1. 保留时间策略(retention.ms):

该策略定义了消息在 Topic 中的保留时长,超过指定的时间后将被删除。
使用配置项 log.retention.hours 或 log.retention.ms 来设置保留的小时数或毫秒数。

2. 保留大小策略(retention.bytes):

该策略定义了消息在 Topic 中的保留大小,超过指定的大小后将被删除。
使用配置项 log.retention.bytes 来设置保留的字节数。
3.Compact 策略(cleanup.policy):

cleanup.policy 用于定义是否启用 Log Compaction,以及使用何种策略进行 Compaction。
设置为 "compact" 表示启用 Compaction,即保留最新的消息以及具有相同 key 的最新消息。

10、Kafka的分区策略有哪些?

轮询分区策略(RoundRobinPartitioner):这是一种简单的分区策略,它将消息依次写入每个分区,实现简单的轮询。这种策略简单且公平,适用于大多数情况,但可能导致某些分区的负载过重。

默认分区策略(DefaultPartitioner):如果没有指定消息的 key,则使用轮询策略;如果消息有 key,则使用 key 进行哈希计算,将消息分配到相应的分区。这种方式可以保证具有相同 key 的消息被写入同一分区,确保消息的有序性。

哈希分区策略(HashedPartitioner):使用消息的 key 进行哈希计算,然后将消息分配到计算出的哈希值对应的分区。这种方式同样保持了相同 key 的消息写入同一分区的特性,但避免了轮询策略的局限性。

自定义分区策略(CustomPartitioner):允许用户根据自己的需求自定义分区策略,实现更灵活的分区逻辑。这种方式可以根据特定业务场景进行定制,适应各种分区需求。

Range 分区分配策略:这种策略根据每个消费者的订阅范围进行分配,确保每个消费者负责一定范围的分区,实现负载均衡。

Sticky 分区分配策略:这是一种较新的策略,旨在减少分区重新分配的频率,提高消费者在处理分区时的粘性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值