• Kafka是如何保证消息不丢失


    Apache Kafka通过多种机制来确保消息不丢失,包括数据复制(Replication)、持久化(Persistence)、确认机制(Acknowledgments)、幂等生产者(Idempotent Producer)、事务性发送(Transactional Messaging)等。以下是这些机制的详细介绍和代码示例,但要注意,源码层面的分析非常复杂,因此仅能提供一些关键组件和流程的简要说明。

    数据复制(Replication)

    在Kafka中,数据在多个broker上进行复制,确保即使某些broker失败,数据依然可用。

    关键配置:

    • replication.factor:指定主题的副本数量。

    代码示例:

    # 创建一个复制因子为3的主题
    kafka-topics.sh --create --bootstrap-server localhost:9092 \
                    --replication-factor 3 --partitions 1 \
                    --topic my-safe-topic
    
    • 1
    • 2
    • 3
    • 4

    持久化(Persistence)

    Kafka使用日志文件将消息持久化到磁盘,确保消息不会因为系统故障而丢失。

    关键组件:

    • Log:Kafka中的日志组件,负责消息的存储。

    代码示例:

    // Kafka的生产者客户端配置
    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");
    props.put("acks", "all"); // 等待所有副本的确认
    KafkaProducer<String, String> producer = new KafkaProducer<>(props);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    确认机制(Acknowledgments)

    生产者发送消息后可以根据配置等待确认,从而知道消息是否已经被成功处理。

    关键配置:

    • acks:可以设置为0(不等待确认)、1(只等待领导副本确认)或all(等待所有副本确认)。

    代码示例:

    // 生产者发送消息并等待确认
    ProducerRecord<String, String> record = new ProducerRecord<>("my-safe-topic", "key", "value");
    producer.send(record).get();
    
    • 1
    • 2
    • 3

    幂等生产者(Idempotent Producer)

    启用幂等性可以防止网络等问题导致的重复消息。

    关键配置:

    • enable.idempotence:设置为true启用幂等性。

    代码示例:

    // 生产者客户端配置
    props.put("enable.idempotence", true);
    
    • 1
    • 2

    事务性发送(Transactional Messaging)

    Kafka事务可以跨多个分区和主题原子性地写入消息。

    关键配置:

    • transactional.id:标识事务性生产者的ID。

    代码示例:

    // 初始化事务性生产者
    props.put("transactional.id", "my-transaction-id");
    KafkaProducer<String, String> producer = new KafkaProducer<>(props);
    
    // 开启事务、发送消息和提交事务
    producer.initTransactions();
    try {
        producer.beginTransaction();
        for (int i = 0; i < 100; i++) {
            producer.send(new ProducerRecord<>("my-safe-topic", Integer.toString(i), Integer.toString(i)));
        }
        producer.commitTransaction();
    } catch (Exception e) {
        producer.abortTransaction();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    源码层面的详细解析

    在源码层面,Kafka的高可靠性主要由以下几个关键组件提供:

    • KafkaProducer: Kafka客户端的生产者API,负责发送消息到Kafka集群。
    • RecordAccumulator: 生产者用于缓存即将发送到服务器的消息。
    • Sender: 生产者的内部线程,负责将缓存的消息发送到Kafka。
    • KafkaServer: Kafka服务端的主体,处理生产者和消费者的请求。
    • ReplicaManager: 负责处理副本的创建、复制和领导权转移。
    • Log: Kafka的核心存储模块,将消息写入本地日志文件。

    注意事项

    虽然Kafka提供了这些机制确保消息不丢失,但依然需要慎重考虑配置选项,并根据具体场景调整,例如调整replication.factoracksmin.insync.replicas等。此外,确保Kafka集群本身的稳定性和性能也是防止消息丢失的重要因素。系统监控、日志审计和定期的压力测试可以帮助维护Kafka集群的健康状态。

  • 相关阅读:
    openGauss学习笔记-124 openGauss 数据库管理-设置账本数据库-查看账本历史操作记录
    华为云云耀云服务器L实例评测 | Linux系统宝塔运维部署H5游戏
    接口测试及常用接口测试工具
    java毕业设计大学生专业分配推荐系统Mybatis+系统+数据库+调试部署
    java中类型通配符上限定(? extends T)指什么呢?
    【ENOVIA 服务包】知识重用解决方案 | 达索系统百世慧®
    毫米波V2I网络的链路层仿真研究(Matlab代码实现)
    【Java-LangChain:使用 ChatGPT API 搭建系统-4】评估输入-分类
    区块链(8):p2p去中心化之websoket服务端实现业务逻辑
    2023网络钓鱼状况报告:ChatGPT等工具致网络钓鱼电子邮件数量激增1265%
  • 原文地址:https://blog.csdn.net/qq_43012298/article/details/135882725