面试题答案
一键面试生产者角度
- 架构设计维持容错性
- 多副本机制:Kafka 生产者发送消息时,消息会被写入到多个副本(replicas)中。生产者会将消息发送到分区的 leader 副本,leader 副本再将消息同步给 follower 副本。即使部分副本所在节点出现网络分区,只要还有存活的副本(满足 ISR 条件,即 in - sync replicas),消息就不会丢失。
- acks 参数配置:生产者可以通过
acks
参数来控制消息发送的确认机制。例如,acks = all
表示只有当所有 in - sync 副本都接收到消息时,生产者才会收到确认,这保证了消息在多个副本上的持久化,提高了容错性。
- 面临的挑战及应对方式
- 挑战:当网络分区发生时,可能导致生产者与部分副本的连接中断,无法及时获取确认,影响消息发送的成功率。
- 应对方式:Kafka 生产者有重试机制。如果生产者在发送消息时没有收到预期的确认(例如由于网络分区导致与 leader 副本通信失败),它会根据配置的重试次数进行重试,直到消息成功发送或达到最大重试次数。
消费者角度
- 架构设计维持容错性
- 基于偏移量(offset)的消费:消费者通过记录消费的偏移量来标记已经消费的消息位置。偏移量存储在 Kafka 内部的
__consumer_offsets
主题中。即使消费者所在节点出现故障或网络分区,当它恢复时,可以从存储的偏移量位置继续消费,确保消息不重复消费且不丢失。 - 消费者组机制:Kafka 引入消费者组(Consumer Group),一个分区只能被组内的一个消费者消费。当某个消费者出现故障或网络分区时,组内其他消费者会通过 Rebalance 机制重新分配分区,继续消费消息,保证了整个消费者组的容错性。
- 基于偏移量(offset)的消费:消费者通过记录消费的偏移量来标记已经消费的消息位置。偏移量存储在 Kafka 内部的
- 面临的挑战及应对方式
- 挑战:网络分区可能导致消费者与 Kafka 集群短暂失联,Rebalance 过程可能会造成消息的重复消费或短暂的消费停顿。
- 应对方式:Kafka 提供了
enable.auto.commit
参数来控制偏移量的自动提交。消费者可以根据业务需求,合理设置自动提交间隔,减少因 Rebalance 导致的重复消费问题。同时,在应用层也可以通过幂等性处理来确保即使重复消费,业务逻辑也不会出现错误。
Broker 节点角度
- 架构设计维持容错性
- 副本管理:每个分区都有多个副本,其中一个是 leader 副本,其他是 follower 副本。leader 副本负责处理读写请求,follower 副本从 leader 副本同步数据。当 leader 副本所在节点出现网络分区,Kafka 会从 ISR 列表中选举新的 leader 副本,确保分区的可用性。
- Zookeeper 协调:Kafka 使用 Zookeeper 来管理集群元数据,包括节点状态、分区 leader 选举等。Zookeeper 的分布式特性保证了即使部分 Broker 节点出现网络分区,集群的元数据信息依然可以被其他节点获取,帮助 Kafka 进行故障恢复和重新选举。
- 面临的挑战及应对方式
- 挑战:网络分区可能导致副本同步延迟或中断,ISR 列表可能会发生变化,影响数据的一致性和可用性。
- 应对方式:Kafka 会动态调整 ISR 列表,当副本与 leader 的同步延迟超过一定时间(可配置),该副本会被移出 ISR 列表。当副本恢复同步后,会重新加入 ISR 列表。同时,在选举新 leader 时,会优先从 ISR 列表中选择,以尽量保证数据的一致性。