文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

关于Kafka ACK机制的详解!

2024-11-29 19:43

关注

ACK 方式

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

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

1.acks=0

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

2.acks=1

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

3.acks=all(或-1)

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

ISR的工作原理

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

1.ISR的维护

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

2.ISR源码分析

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

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

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

        // 计算新的ISR集合
        Set 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 send(ProducerRecord record, Callback callback) {
    // 构建请求
    ProduceRequest request = new ProduceRequest(record, callback);
    // 发送请求
    Future 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:

缺点:

适用场景

总结

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

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

来源:猿java内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯