常见问题
一、核心概念和架构
1. Topic 如何实现高吞吐与负载均衡
2. Partition 的副本机制及数据同步原理?
3. ISR 的作用是什么?如何判断副本是否在 ISR 中?
4. 副本滞后时如何处理?replica.lag.time.max.ms 的作用?
5. HW 如何保证消费者读取一致性?LEO 如何影响生产者写入?
1.如何避免消息丢失
消息丢失主要是在这几种场景:
Producer:Producer 发送到 Broker 丢失,消息没有成功投递
- 使用带回调通知的发送 API,不要用 Fire and forget 模式
- 发送时设置重试次数
Broker:Broker 保存消息(持久化)丢失
- Kafka 收到消息后会先存储在也缓存中(Page Cache)中,之后由操作系统根据自己的策略进行刷盘或者通过 fsync 命令强制刷盘。如果系统挂掉,在 PageCache 中的数据就会丢失。
- acks=0:消息很可能会丢
- acks=1:如果 follower 没有收到 leader 同步的消息,leader 就挂了,消息会丢失
- acks=-1(all),只有所有副本全挂才会丢,基本不可能,可认为已经持久化
- Kafka 收到消息后会先存储在也缓存中(Page Cache)中,之后由操作系统根据自己的策略进行刷盘或者通过 fsync 命令强制刷盘。如果系统挂掉,在 PageCache 中的数据就会丢失。
Consumer:Consumer 消费消息丢失
唯一原因:Consumer 没有正确消费消息,就把 Offset 提交了,导致 Kafka 认为该消息已经被消费了,从而导致消息丢失。
不要开启自动提交,手动提交位移,确保休息消费完再提交
2.如何避免重复消费
3.消息传递语义
消息传递语义:Producer 和 Consumer 之间消息传递保证性,分为三种
at-least-once
: 至少一次,消息不会丢,但可能重复传递- 默认 Kafka 保障,Producer ACK 机制 + Broker Replica 机制
at-most-once
: 最多一次,消息可能丢,但不会重复传递- 用户在处理消息之前保存 Offset,实现该语义
exactly-once
: 精准一次,消息不会丢,也不会重复传递- 用户自己实现幂等
如何实现 exactly-once 语义
4.Rebalance 触发时机
- 组成员数量发生变化
- 订阅主题数量发生变化,如正则匹配到了更多主题
- 订阅主题的分区数发生变化
Reference
[1] Top 35+ Most Asked Kafka Interview Questions and Answers