Skip to content

Kafka面试题

1. Kafka的基本概念

问题:什么是Kafka?

答案

  • Kafka:Apache开源的分布式流处理平台。
  • 特点
    • 高吞吐量
    • 低延迟
    • 高可用性
    • 可扩展性
    • 持久化存储

2. Kafka的架构

问题:Kafka的架构有哪些组成部分?

答案

  • Producer:消息生产者。
  • Broker:Kafka服务器。
  • Topic:消息主题。
  • Partition:主题分区。
  • Consumer:消息消费者。
  • Consumer Group:消费者组。
  • Zookeeper:协调服务。

3. Kafka的Topic

问题:什么是Topic?

答案

  • Topic:消息的逻辑分类,类似于数据库中的表。
  • 特点
    • 可以有多个分区
    • 可以有多个副本
    • 可以设置保留时间

示例

bash
# 创建Topic
kafka-topics.sh --create --topic user-events --bootstrap-server localhost:9092 --partitions 3 --replication-factor 2

# 查看Topic
kafka-topics.sh --list --bootstrap-server localhost:9092

# 查看Topic详情
kafka-topics.sh --describe --topic user-events --bootstrap-server localhost:9092

4. Kafka的Partition

问题:什么是Partition?

答案

  • Partition:Topic的物理分区,用于提高并发和扩展性。
  • 特点
    • 每个Partition有序
    • 不同Partition无序
    • 分布在不同Broker上
  • 分区策略
    • 轮询
    • 随机
    • Key哈希

5. Kafka的Producer

问题:如何使用Producer?

答案

java
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");

Producer<String, String> producer = new KafkaProducer<>(props);

// 发送消息
ProducerRecord<String, String> record = new ProducerRecord<>("user-events", "key", "value");
producer.send(record);

// 异步发送
producer.send(record, new Callback() {
    @Override
    public void onCompletion(RecordMetadata metadata, Exception exception) {
        if (exception != null) {
            exception.printStackTrace();
        } else {
            System.out.println("Message sent to partition " + metadata.partition());
        }
    }
});

producer.close();

6. Kafka的Consumer

问题:如何使用Consumer?

答案

java
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("group.id", "user-group");
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");

Consumer<String, String> consumer = new KafkaConsumer<>(props);

// 订阅Topic
consumer.subscribe(Arrays.asList("user-events"));

// 拉取消息
while (true) {
    ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));
    for (ConsumerRecord<String, String> record : records) {
        System.out.println("Received message: " + record.value());
    }
}

consumer.close();

7. Kafka的Consumer Group

问题:什么是Consumer Group?

答案

  • Consumer Group:消费者组,多个消费者组成一个组。
  • 作用
    • 实现消息的负载均衡
    • 实现消息的容错
  • 特点
    • 同一个Group中的消费者不会重复消费
    • 不同Group中的消费者可以重复消费

8. Kafka的Offset

问题:什么是Offset?

答案

  • Offset:消息在Partition中的位置。
  • 特点
    • 每个Partition有自己的Offset
    • Offset由Consumer维护
    • 可以手动提交或自动提交
  • 提交方式
    • 自动提交
    • 手动提交
    • 同步提交
    • 异步提交

9. Kafka的消息可靠性

问题:如何保证消息可靠性?

答案

  • Producer端
    • 设置acks=all
    • 设置retries
    • 启用幂等性
  • Broker端
    • 设置replication-factor
    • 设置min.insync.replicas
  • Consumer端
    • 手动提交Offset
    • 处理重复消息

示例

java
// Producer配置
props.put("acks", "all");
props.put("retries", 3);
props.put("enable.idempotence", true);

// Consumer配置
props.put("enable.auto.commit", false);
// 手动提交
consumer.commitSync();

10. Kafka的消息顺序性

问题:如何保证消息顺序性?

答案

  • Partition内有序
    • 同一个Partition内的消息有序
  • 保证顺序性
    • 使用相同的Key发送消息到同一个Partition
    • 只有一个Consumer消费该Partition

示例

java
// 使用相同的Key
ProducerRecord<String, String> record = new ProducerRecord<>("user-events", "user-1", "value");

11. Kafka的消息重复

问题:如何处理消息重复?

答案

  • 原因
    • Producer重试
    • Consumer重复消费
  • 解决方案
    • 启用Producer幂等性
    • Consumer端去重
    • 使用数据库唯一约束

12. Kafka的消息积压

问题:如何处理消息积压?

答案

  • 原因
    • Consumer消费速度慢
    • Producer发送速度快
  • 解决方案
    • 增加Consumer数量
    • 优化Consumer消费逻辑
    • 增加Partition数量

13. Kafka的事务消息

问题:什么是事务消息?

答案

  • 事务消息:Kafka 0.11+支持的事务功能。
  • 作用
    • 保证多条消息的原子性
    • 实现Exactly-Once语义

示例

java
// 开启事务
producer.initTransactions();

try {
    producer.beginTransaction();
    
    // 发送多条消息
    producer.send(new ProducerRecord<>("topic1", "key1", "value1"));
    producer.send(new ProducerRecord<>("topic2", "key2", "value2"));
    
    producer.commitTransaction();
} catch (Exception e) {
    producer.abortTransaction();
}

14. Kafka的Exactly-Once语义

问题:如何实现Exactly-Once语义?

答案

  • Exactly-Once语义:消息只被处理一次。
  • 实现方式
    • Producer端:启用幂等性
    • Broker端:事务消息
    • Consumer端:手动提交Offset + 去重

15. Kafka的持久化

问题:Kafka如何持久化消息?

答案

  • 持久化方式
    • 消息存储在磁盘上
    • 使用日志文件存储
    • 支持消息回溯
  • 配置
    • log.retention.hours:消息保留时间
    • log.retention.bytes:消息保留大小
    • log.segment.bytes:日志段大小

16. Kafka的压缩

问题:Kafka支持哪些压缩算法?

答案

  • 压缩算法
    • none:不压缩
    • gzip:GZIP压缩
    • snappy:Snappy压缩
    • lz4:LZ4压缩
    • zstd:ZSTD压缩

示例

java
// Producer配置
props.put("compression.type", "gzip");

17. Kafka的高可用

问题:如何实现Kafka高可用?

答案

  • Broker集群
    • 多个Broker组成集群
    • 数据分布在多个Broker上
  • 副本机制
    • 每个Partition有多个副本
    • 副本分布在不同的Broker上
  • Leader选举
    • Leader故障时自动选举新的Leader

18. Kafka的监控

问题:如何监控Kafka?

答案

  • 监控工具
    • Kafka Manager
    • Burrow
    • Kafka Monitor
    • Prometheus + Grafana
  • 监控指标
    • 消息积压
    • 消息吞吐量
    • Consumer延迟
    • Broker状态

19. Kafka的KSQL

问题:什么是KSQL?

答案

  • KSQL:Kafka的流处理SQL。
  • 作用
    • 使用SQL处理Kafka消息
    • 实现实时流处理
    • 无需编写代码

示例

sql
-- 创建流
CREATE STREAM user_events (
  user_id VARCHAR,
  event_type VARCHAR,
  event_time VARCHAR
) WITH (
  KAFKA_TOPIC = 'user-events',
  VALUE_FORMAT = 'JSON'
);

-- 查询流
SELECT user_id, COUNT(*) FROM user_events GROUP BY user_id;

20. Kafka的Kafka Streams

问题:什么是Kafka Streams?

答案

  • Kafka Streams:Kafka的流处理库。
  • 作用
    • 处理Kafka消息
    • 实现流转换
    • 实现流聚合
  • 特点
    • 轻量级
    • 易于使用
    • 高性能

21. Kafka的连接器

问题:什么是Kafka Connect?

答案

  • Kafka Connect:Kafka的连接器框架。
  • 作用
    • 连接外部系统
    • 数据导入导出
  • 类型
    • Source Connector:数据导入
    • Sink Connector:数据导出

22. Kafka的配置优化

问题:如何优化Kafka性能?

答案

  • Producer优化
    • 增加batch.size
    • 增加linger.ms
    • 启用压缩
  • Broker优化
    • 增加num.network.threads
    • 增加num.io.threads
    • 调整log.flush.interval.messages
  • Consumer优化
    • 增加fetch.min.bytes
    • 增加max.poll.records
    • 调整fetch.max.wait.ms

23. Kafka的常见问题

问题:Kafka常见问题有哪些?

答案

  • 消息丢失
    • Producer未收到确认
    • Broker故障
    • Consumer未提交Offset
  • 消息重复
    • Producer重试
    • Consumer重复消费
  • 消息积压
    • Consumer消费慢
    • Producer发送快
  • 消息顺序乱序
    • 多个Partition
    • 多个Consumer

24. Kafka的Zookeeper

问题:Zookeeper在Kafka中的作用?

答案

  • 作用
    • 存储Broker元数据
    • 存储Topic信息
    • 存储Consumer Group信息
    • 协调Leader选举
  • KRaft模式
    • Kafka 2.8+支持去Zookeeper
    • 使用Kafka内部协调

25. Kafka的最佳实践

问题:使用Kafka的最佳实践有哪些?

答案

  • 合理设置Partition数量。
  • 合理设置副本数量。
  • 使用Consumer Group实现负载均衡。
  • 手动提交Offset保证消息可靠性。
  • 启用压缩减少网络传输。
  • 合理配置批量发送提高性能。
  • 使用监控及时发现和解决问题。
  • 合理设置消息保留时间。
  • 使用事务消息实现Exactly-Once。
  • 使用幂等性处理重复消息。
  • 定期清理过期消息。
  • 合理配置线程池。
  • 使用Kafka Connect连接外部系统。
  • 使用Kafka Streams处理流数据。