kafka面试题

kafka基本概念

  • Producer 生产者:负责将消息发送到 Broker
  • Consumer 消费者:从 Broker 接收消息
  • Consumer Group 消费者组:由多个 Consumer 组成。消费者组内每个消费者负责消费不同分区的数据,一个分区只能由一个组内消费者消费,消费者组之间互不影响
  • Broker:可以看做一个独立的 Kafka 服务节点或 Kafka 服务实例
  • Topic:一个逻辑上的概念,包含很多 partition,同一个 topic 下的 partition 的消息内容是不相同的
  • Partition:为了实现扩展性,一个非常大的 topic 可以分布到多个 broker 上,一个 topic 可以分为多个 partition,每个 partition 是一个有序的队列
  • Replica 副本:同一分区的不同副本保存的是相同的消息。为保证集群中的某个节点发生故障时,该节点上的 partition 数据不丢失,且 Kafka 仍然能够继续工作,Kafka 提供了副本机制,一个 topic 的每个分区都有若干个副本,一个 leader 和若干个 follower

kafka架构图

kafka面试题_第1张图片

如何确定当前能读到哪一条消息?

kafka面试题_第2张图片

分区相当于一个日志文件,我们需要知道几个概念

  • offset (消息偏移量)分别是 0~6
  • 0 代表这个日志文件的开始
  • HW(High Watermark)为 4。0~3 代表这个日志文件可以消费的区间,消费者只能消费到这 4 条消息
  • LEO 代表即将要写入消息的偏移量 offset

分区 ISR 集合中的每个副本都会维护自己的 LEO,而 ISR 集合中最小的 LEO 即为分区的 HW
kafka面试题_第3张图片
如上图所示,3 个分区副本都是 ISR 集合当中的。最小的 LEO 为 3,就代表分区的 HW 为3,所以,当前分区只能消费到 0~2 之间的 3 条数据

生产者发送消息有哪些模式?

  • 发后即忘
  • 同步
  • 异步

发送消息的分区策略有哪些?

  • 轮询
  • key指定
  • 自定义策略
  • 指定 Partiton 发送

Kafka 支持读写分离吗,为什么?

读写分离有两个缺点

  • 数据不一致的问题
  • 延时问题
    kafka不支持读写分离

Kafka 如何实现负载均衡?

  • kafka 独特的架构方式可以通过主写主读来实现负载均衡

Kafka 的可靠性是怎么保证的?

  • acks
    • acks = 1,默认为1。生产者发送消息,只要 leader 副本成功写入消息,就代表成功
    • acks = 0。生产者发送消息后直接算写入成功,不需要等待响应
    • acks = -1 或 acks = all。生产者发送消息后,需要等待 ISR 中的所有副本都成功写入消息后才能收到服务端的响应
  • 我们可以通过同步或者异步获取响应结果,失败做重试来保证消息的可靠性.
  • 手动提交位移
  • 通过副本LEO来确定分区HW

kafka为什么会重复消费消息?

  • 在kafka提交offset的时候,可能由网络延迟或者某些原因导致offset没有同步,导致其他consumer消费了已经消费的消息.

如何保证kafka消息被顺序消费

  • 如果消息需要被顺序消费,就需要将这类消息指定发送到一个partition中.

副本 leader 是怎么选举的

  • 优先副本选举:优先副本就是说在 AR 集合中的第一个副本

如何增强消费者的消费能力?

  • 可以考虑增加 topic 的分区数,并且同时提升消费组的消费者数量,消费者数=分区数
  • 如果是消费者消费不及时,可以采用多线程的方式进行消费,并且优化业务方法流程

Kafka 控制器是什么,有什么作用?

> 在 Kafka 集群中会有一个或多个 broker,其中有一个 broker 会被选举为控制器,它负责管理整个集群中所有分区和副本的状态,Kafka 集群中只能有一个控制器

  • 当某个分区的 leader 副本出现故障时,由控制器负责为该分区选举新的 leader 副本;
  • 当检测到某个分区的 ISR 集合发生变化时,由控制器负责通知所有 broker 更新其元数据信息
  • 当为某个 topic 增加分区数量时,由控制器负责分区的重新分配。

Kafka 为什么这么快?

  • 顺序读写
  • Page Cache
  • 零拷贝
  • 分区分段+索引
  • 批量读写
  • 批量压缩

什么情况下 kafka 会丢失消息?

Kafka 有三次消息传递的过程:生产者发消息给 Broker,Broker 同步消息和持久化消息,Broker 将消息传递给消费者。
这其中每一步都有可能丢失消息

  • 生产者发送数据

    • 当 acks 为 0,只要服务端写消息时出现任何问题,都会导致消息丢失
    • 当 acks 配置为 1 时,生产者发送消息,只要 leader 副本成功写入消息,就代表成功。这种方案的问题在于,当返回成功后,如果 leader 副本和 follower 副本还没有来得及同步,leader 就崩溃了,那么在选举后新的 leader 就没有这条消息,也就丢失了
  • Broker 存储数据

    • kafka 通过 Page Cache 将数据写入磁盘,Page Cache 就是当往磁盘文件写入的时候,系统会先将数据流写入缓存中,但是什么时候将缓存的数据写入文件中是由操作系统自行决定。所以如果此时机器突然挂了,也是会丢失消息的
  • 消费者消费数据

    • 在开启自动提交 offset 时,只要消费者消费到消息,那么就会自动提交偏移量,如果业务还没有来得及处理,那么消息就会丢失。

Kafka的哪些场景中使用了零拷贝

  • 基于mmap的索引
  • 日志文件读写所用的TransportLayer

你可能感兴趣的:(kafka,分布式)