Kafka 原理

Kafka 核心原理详解

🎯 面试重点

📖 核心概念

架构

/**
 * Kafka 架构
 */
public class KafkaArchitecture {
    // Broker
    /*
     * Kafka 服务器
     */
    
    // Topic
    /*
     * 消息主题
     * 分区存储
     */
    
    // Partition
    /*
     * 分区
     * 副本机制
     */
    
    // Producer / Consumer
    /*
     * 生产者/消费者
     */
    
    // Consumer Group
    /*
     * 消费者组
     * 同一组内负载均衡
     */
}

📖 面试真题

Q1: Kafka 如何保证消息不丢失?

答: Kafka 通过多层次的机制来保证消息不丢失,主要从生产者、Broker 和消费者三个角度进行保障。

1. 生产者端保证

// 生产者配置
Properties props = new Properties();
props.put("acks", "all");  // 所有副本确认
props.put("retries", 3);   // 重试次数
props.put("max.in.flight.requests.per.connection", 1);  // 防止乱序

// 发送消息
producer.send(record, new Callback() {
    @Override
    public void onCompletion(RecordMetadata metadata, Exception e) {
        if (e != null) {
            // 处理发送失败
        }
    }
});

2. Broker 端保证

3. 消费者端保证

// 消费者配置
Properties props = new Properties();
props.put("enable.auto.commit", "false");  // 手动提交
props.put("auto.offset.reset", "earliest"); // 从最早开始消费

// 消费消息
while (true) {
    ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));
    for (ConsumerRecord<String, String> record : records) {
        try {
            // 处理消息
            processMessage(record);
            // 手动提交 Offset(同步)
            consumer.commitSync();
        } catch (Exception e) {
            // 处理异常,不提交 Offset
            log.error("消费失败", e);
        }
    }
}

4. 数据可靠性配置组合

5. 监控与运维

6. 与其他消息队列对比

| 特性 | Kafka | RocketMQ | RabbitMQ | |——|——-|———-|———-| | 可靠性 | 高(副本机制) | 高(主从同步) | 高(镜像队列) | | 性能 | 极高(顺序写) | 高 | 中 | | 消息顺序 | Partition 内有序 | 队列内有序 | 队列内有序 | | 使用场景 | 大数据、日志 | 业务消息、事务 | 企业集成 |

总结:Kafka 通过生产者 ACK、Broker 副本机制和消费者手动提交 Offset 等多重保障,实现了高可靠的消息传输。在实际使用中,需要根据业务需求在可靠性和性能之间做出权衡。


⭐ 重点:Kafka 是大数据生态的核心