• kafka中的acks参数 struggler


    首先这个acks参数,是在KafkaProducer,也就是生产者客户端里设置的也就是说,你往kafka写数据的时候,就可以来设置这个acks参数。

    这个参数实际上有三种常见的值可以设置,分别是:0、1 和 all。

    第一种选择是把acks参数设置为0

    我的KafkaProducer在客户端,只要把消息发送出去,不管那条数据有没有在哪怕Partition Leader上落到磁盘,我就不管他了,直接就认为这个消息发送成功了。
    如果你采用这种设置的话,那么你必须注意的一点是,可能你发送出去的消息还在半路。结果呢,Partition Leader所在Broker就直接挂了,然后结果你的客户端还认为消息发送成功了,此时就会导致这条消息就丢失了。

    第二种选择是设置 acks = 1

    只要Partition Leader接收到消息而且写入本地磁盘了,就认为成功了,不管他其他的Follower有没有同步过去这条消息了。
    这种设置其实是kafka默认的设置,大家请注意,划重点!这是默认的设置
    也就是说,默认情况下,你要是不管acks这个参数,只要Partition Leader写成功就算成功。
    但是这里有一个问题,万一Partition Leader刚刚接收到消息,Follower还没来得及同步过去,结果Leader所在的broker宕机了,此时也会导致这条消息丢失,因为人家客户端已经认为发送成功了。

    最后一种情况,就是设置acks=all

    Partition Leader接收到消息之后,还必须要求ISR列表里跟Leader保持同步的那些Follower都要把消息同步过去,才能认为这条消息是写入成功了。
    如果说Partition Leader刚接收到了消息,但是结果Follower没有收到消息,此时Leader宕机了,那么客户端会感知到这个消息没发送成功,他会重试再次发送消息过去。
    此时可能Partition 2的Follower变成Leader了,此时ISR列表里只有最新的这个Follower转变成的Leader了,那么只要这个新的Leader接收消息就算成功了。

    acks=all 就可以代表数据一定不会丢失了吗?
    当然不是,如果你的Partition只有一个副本,也就是一个Leader,任何Follower都没有,你认为acks=all有用吗?
    当然没用了,因为ISR里就一个Leader,他接收完消息后宕机,也会导致数据丢失。
    所以说,这个acks=all,必须跟ISR列表里至少有2个以上的副本配合使用,起码是有一个Leader和一个Follower才可以。
    这样才能保证说写一条数据过去,一定是2个以上的副本都收到了才算是成功,此时任何一个副本宕机,不会导致数据丢失。

  • 相关阅读:
    windows下误修改了环境变量path怎么办
    mysql 常见问题
    初入博客园
    卷积神经网络的“卷积”操作不等于数学上定义的卷积操作
    无需循环合并list里的所有numpy.array
    将进程绑定在CPU上运行
    categorical_crossentropy和sparse_categorical_crossentropy的区别:实例讲解
    RNN神经网络层的输出格式和形状
    Batch Normalization和Layer Normalization的区别
    AttributeError: module 'tensorflow_core._api.v2.config' has no attribute 'list_physical_devices'
  • 原文地址:https://www.cnblogs.com/mjhblog/p/15896660.html
Copyright © 2020-2023  润新知