Kafka ACK机制详解!

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: 本文深入剖析了Kafka的ACK机制,涵盖其原理、源码分析及应用场景,并探讨了acks=0、acks=1和acks=all三种级别的优缺点。文中还介绍了ISR(同步副本)的工作原理及其维护机制,帮助读者理解如何在性能与可靠性之间找到最佳平衡。适合希望深入了解Kafka消息传递机制的开发者阅读。

嗨,你好呀,我是猿java

Kafka的 ACK机制是确保消息成功传递和处理的重要机制.这篇文章,我们将详细分析 Kafka ACK机制,包括其原理、源码分析、使用场景以及优缺点。

ACK 方式

Kafka的 ACK机制主要用于确保生产者发送的消息能够被可靠地写入到 Kafka集群的 Topic中。ACK机制的核心思想是生产者发送消息后,需要等待 Kafka集群的确认(ACK),才认为消息发送成功。

Kafka的 ACK机制主要有三种级别:

acks=0

生产者不等待服务器的确认,消息发送后即认为成功,不管消息是否真正写入 Kafka,这种方式效率最高,但可靠性最低,数据可能存在丢失。

kafka-ack-0.png

acks=1

生产者会等待来自 Leader分区的确认。Leader分区接收到消息并写入本地日志后即返回确认。这种方式在 Leader分区可用时可靠,但如果 Leader分区发生故障,可能会丢失数据。从 Kafka 2.0 开始,默认值是 acks=1

kafka-ack-1.png

acks=all(或-1)

生产者等待所有 ISR(In-Sync Replica,同步副本)分区的确认。只有当消息被写入所有同步副本后才返回确认,这种方式最可靠,但性能较低。

kafka-ack-all.png

ISR的工作原理

ISR,全称 In-Sync Replicas,翻译为同步副本,它是指某个分区中的一组与 Leader副本保持同步的副本,即这些副本包含了 Leader副本中的所有已确认消息。ISR是 Kafka 集群中用于保证数据可靠性的一个关键概念。

  • Leader和 Follower:在 Kafka中,每个分区都有一个 Leader和若干个 Follower,Leader负责处理所有的读写请求,而 Follower则从 Leader那里拉取数据并进行同步。

  • 同步副本(ISR):ISR是一个动态的集合,包含了 Leader和所有与 Leader保持同步的 Follower,只有在 ISR中的副本才被认为是可靠的,因为它们包含了与 Leader相同的数据。

  • ACK机制与 ISR:当生产者发送消息并设置acks=all时,Kafka只有在消息被写入 ISR中的所有副本后才会返回确认,这确保了消息即使在 Leader故障的情况下也不会丢失,因为 ISR中的其他副本可以选举为新的 Leader。

ISR的维护

Kafka通过以下机制来维护ISR:

  • 加入ISR:当一个 Follower副本成功地追上了 Leader副本的日志(即复制了 Leader的所有新的消息),它会被加入到 ISR中。

  • 移出ISR:当一个 Follower副本落后于 Leader超过一定的时间(由参数replica.lag.time.max.ms控制),它会被移出 ISR。

ISR源码分析

以下是 Kafka中维护ISR的关键代码片段(以 Kafka 2.x版本为例):

class Partition {
   
    private Set<Replica> isr; // 当前分区的ISR集合

    public void updateISR() {
   
        // 获取所有副本的状态
        List<Replica> replicas = getReplicas();

        // 计算新的ISR集合
        Set<Replica> newIsr = new HashSet<>();
        for (Replica replica : replicas) {
   
            if (replica.isInSync()) {
   
                newIsr.add(replica);
            }
        }

        // 更新ISR
        if (!newIsr.equals(this.isr)) {
   
            this.isr = newIsr;
            // 触发ISR变化的事件
            onISRChanged();
        }
    }
}

class Replica {
   
    public boolean isInSync() {
   
        // 判断该副本是否与Leader同步
        return this.logEndOffset >= leaderLogEndOffset - replicaLagMaxMessages;
    }
}

源码分析

以 Kafka的 Producer端代码为例,下面是简化后的发送消息时处理ACK机制的关键代码片段:

public Future<RecordMetadata> send(ProducerRecord<K, V> record, Callback callback) {
   
    // 构建请求
    ProduceRequest request = new ProduceRequest(record, callback);
    // 发送请求
    Future<RecordMetadata> future = this.sender.send(request);
    // 根据ACK配置处理确认
    if (this.acks == 0) {
   
        // 不等待确认,直接返回成功
        callback.onCompletion(null, null);
    } else if (this.acks == 1) {
   
        // 等待Leader确认
        RecordMetadata metadata = future.get();
        callback.onCompletion(metadata, null);
    } else if (this.acks == -1 || this.acks == "all") {
   
        // 等待所有ISR确认
        RecordMetadata metadata = future.get();
        callback.onCompletion(metadata, null);
    }
    return future;
}

优缺点

acks=0

  • 优点:性能最高,延迟最低。
  • 缺点:消息可能丢失,可靠性最低。

acks=1

  • 优点:在性能和可靠性之间取得平衡。
  • 缺点:如果领导者在消息写入后但未同步给副本前崩溃,消息可能丢失。

acks=all

  • 优点:最高的可靠性,确保消息被所有同步副本确认。
  • 缺点:性能较低,延迟较高。

缺点

  • 性能影响:更高的ACK级别会带来更高的延迟,降低吞吐量。
  • 复杂性:需要根据具体应用场景选择合适的ACK配置,增加了系统设计的复杂性。

适用场景

  • acks=0:适用于对消息丢失不敏感且追求高吞吐量的场景,例如日志收集、监控数据等。
  • acks=1:适用于对消息有一定可靠性要求,但对性能要求较高的场景,例如实时数据处理。
  • acks=all:适用于对消息可靠性要求极高且可以接受较低吞吐量的场景,例如金融交易、订单处理等。

总结

本文我们分析了 Kafka的 ACK机制以及 ISR机制,从全局来看, Kafka 和 RocketMQ有着异曲同工之妙,Kafka的 ack=all 对应 RocketMQ的同步发送,ack=1 对应 RocketMQ的异步发送,ack=0 对应 RocketMQ的单向发送。

总体来说,Kafka的 ACK机制为消息的可靠传递提供了不同级别的保障,开发者可以根据具体的应用需求选择合适的 ACK配置,以在性能和可靠性之间取得平衡。

交流学习

如果你觉得文章有帮助,请帮忙转发给更多的好友,或关注:猿java,持续输出硬核文章。

目录
相关文章
|
1月前
|
消息中间件 Java 大数据
Kafka ISR机制详解!
本文详细解析了Kafka的ISR(In-Sync Replicas)机制,阐述其工作原理及如何确保消息的高可靠性和高可用性。ISR动态维护与Leader同步的副本集,通过不同ACK确认机制(如acks=0、acks=1、acks=all),平衡可靠性和性能。此外,ISR机制支持故障转移,当Leader失效时,可从ISR中选取新的Leader。文章还包括实例分析,展示了ISR在不同场景下的变化,并讨论了其优缺点,帮助读者更好地理解和应用ISR机制。
48 0
Kafka ISR机制详解!
|
3月前
|
消息中间件 负载均衡 Java
揭秘Kafka背后的秘密!Kafka 架构设计大曝光:深入剖析Kafka机制,带你一探究竟!
【8月更文挑战第24天】Apache Kafka是一款专为实时数据处理及流传输设计的高效率消息系统。其核心特性包括高吞吐量、低延迟及出色的可扩展性。Kafka采用分布式日志模型,支持数据分区与副本,确保数据可靠性和持久性。系统由Producer(消息生产者)、Consumer(消息消费者)及Broker(消息服务器)组成。Kafka支持消费者组,实现数据并行处理,提升整体性能。通过内置的故障恢复机制,即使部分节点失效,系统仍能保持稳定运行。提供的Java示例代码展示了如何使用Kafka进行消息的生产和消费,并演示了故障转移处理过程。
52 3
|
3月前
|
消息中间件 Java Kafka
如何在Kafka分布式环境中保证消息的顺序消费?深入剖析Kafka机制,带你一探究竟!
【8月更文挑战第24天】Apache Kafka是一款专为实时数据管道和流处理设计的分布式平台,以其高效的消息发布与订阅功能著称。在分布式环境中确保消息按序消费颇具挑战。本文首先介绍了Kafka通过Topic分区实现消息排序的基本机制,随后详细阐述了几种保证消息顺序性的策略,包括使用单分区Topic、消费者组搭配单分区消费、幂等性生产者以及事务支持等技术手段。最后,通过一个Java示例演示了如何利用Kafka消费者确保消息按序消费的具体实现过程。
123 3
|
3月前
|
Kubernetes 监控 Perl
在k8S中,自动扩容机制是什么?
在k8S中,自动扩容机制是什么?
|
3月前
|
存储 网络安全 API
【Azure Service Bus】 Service Bus如何确保消息发送成功,发送端是否有Ack机制 
【Azure Service Bus】 Service Bus如何确保消息发送成功,发送端是否有Ack机制 
|
3月前
|
Kubernetes Java 调度
在K8S中,Pod突然挂掉,K8S有什么机制或功能自动清除Pod?
在K8S中,Pod突然挂掉,K8S有什么机制或功能自动清除Pod?
|
3月前
|
Kubernetes 安全 Linux
在k8S中,PodSecurityPolicy 机制能实现哪些安全策略?
在k8S中,PodSecurityPolicy 机制能实现哪些安全策略?
|
3月前
|
Kubernetes 安全 调度
在k8S中, PodSecurityPolicy机制是什么?
在k8S中, PodSecurityPolicy机制是什么?
|
3月前
|
Kubernetes 监控 Perl
在K8S中,RC的机制是什么?
在K8S中,RC的机制是什么?
|
3月前
|
消息中间件 Java Kafka
SpringBoot Kafka SSL接入点PLAIN机制收发消息
SpringBoot Kafka SSL接入点PLAIN机制收发消息
38 0