当前位置:   article > 正文

道路千万条,Kafka可靠性之ACK应答机制占一条!_kafka ack batch 矛盾

kafka ack batch 矛盾

道路千万条,安全第一条,丢不丢数据,数据的安全,我们时刻关注,那么我们一起看看Kafka中,数据可靠性是如何保证的。今天我们的主角就是ACK应答机制。

一、回顾发送流程

图片

● batch.size:只有数据积累到batch.size之后,sender才会发送数据。默认16k。

 linger.ms:如果数据迟迟未达到batch.size,sender等待linger.time之后就会发送数据。单位ms,默认值是0ms,表示没有延迟。

0:生产者发送过来的数据,不需要等数据落盘应答。

1:生产者发送过来的数据,Leader收到数据后应答。

-1(all)生产者发送过来的数据,Leader+和isr队列里面的所有节点收齐数据后应答。-1和all等价。

二、ack应答原理

acks:

0:生产者发送过来的数据,不需要等数据落盘应答

图片

1:生产者发送过来的数据,Leader收到数据后应答。

图片

-1(all):生产者发送过来的数据,Leader和ISR队列里面的所有节点收齐数据后应答。

图片

思考:Leader收到数据,所有Follower都开始同步数据,但有一个Follower,因为某种故障,迟迟不能与Leader进行同步,那这个问题怎么解决呢?

Leader维护了一个动态的in-sync replica set(ISR),意为和Leader保持同步的Follower+Leader集合(leader:0,isr:0,1,2)。

如果Follower长时间未向Leader发送通信请求或同步数据,则该Follower将被踢出ISR。该时间阈值由replica.lag.time.max.ms参数设定,默认30s。例如2超时,(leader:0, isr:0,1)。

这样就不用等长期联系不上或者已经故障的节点。

数据可靠性分析:

如果分区副本设置为1个,或者ISR里应答的最小副本数量( min.insync.replicas 默认为1)设置为1,和ack=1的效果是一样的,仍然有丢数的风险(leader:0,isr:0)。

数据完全可靠条件 = ACK级别设置为-1 + 分区副本大于等于2 + ISR里应答的最小副本数量大于等于2       

ACK应答级别

可靠性总结:

acks=0,生产者发送过来数据就不管了,可靠性差,效率高;

acks=1,生产者发送过来数据Leader应答,可靠性中等,效率中等;

acks=-1,生产者发送过来数据Leader和ISR队列里面所有Follwer应答,可靠性高,效率低;

在生产环境中,acks=0很少使用;acks=1,一般用于传输普通日志,允许丢个别数据;acks=-1,一般用于传输和钱相关的数据,对可靠性要求比较高的场景。

数据重复分析:

acks:-1(all):生产者发送过来的数据,Leader和ISR队列里面的所有节点收齐数据后应答。

图片

三、代码配置

package com.bigdata.kafka.producer;

import org.apache.kafka.clients.producer.KafkaProducer;

import org.apache.kafka.clients.producer.ProducerRecord;

import java.util.Properties;

public class CustomProducerAck {

public static void main(String[] args) throws InterruptedException {

// 1. 创建kafka生产者的配置对象

Properties properties = new Properties();

// 2. 给kafka配置对象添加配置信息:bootstrap.servers

properties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "hadoop102:9092");

// key,value序列化(必须):key.serializer,value.serializer

properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());

properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());

// 设置acks

properties.put(ProducerConfig.ACKS_CONFIG, "all");

// 重试次数retries,默认是int最大值,2147483647

properties.put(ProducerConfig.RETRIES_CONFIG, 3);

// 3. 创建kafka生产者对象

KafkaProducer<String, String> kafkaProducer = new KafkaProducer<String, String>(properties);

// 4. 调用send方法,发送消息

for (int i = 0; i < 5; i++) {

kafkaProducer.send(new ProducerRecord<>("first","bigdata " + i));

}

// 5. 关闭资源

kafkaProducer.close();

}

}

总结

由此我们知道,通过ACKS的配置,acks=0,可靠性差,效率高;acks=1,可靠性中等,效率中等;acks=-1,可靠性高,效率低;大家根据生产环境需要做出合适配置吧,道路千万条,安全第一条,今天的知识,你Get到了吗?

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Li_阴宅/article/detail/759296
推荐阅读
相关标签
  

闽ICP备14008679号