acks

  • producer 配 acks = 0 at-most-once
    不和Kafka集群进行消息接受确认,当网络发生异常等情况时,存在消息丢失的可能
  • producer 配 acks = 1 exactly-once
    当Leader副本接收成功后,返回接收成功确认信息;只有Leader确认接收成功后但挂掉了,副本没有同步,数据可能丢失;
  • producer 配 acks = all(-1) at-least-once
    当Leader和Follower副本都接收成功后,返回接收成功确认信息,可能重复;
    数据发送到 leader 后 ,部分 ISR 的副本同步,leader 此时挂掉。比如 follower1h 和 follower2 都有可能变成新的 leader, producer 端会得到返回异常,producer 端会重新发送数据,数据可能会重复。

acks 与 retries

官方说当 acks=0 时,retries参数失效。

场景

消息丢失情况

  • producer 把消息发送给 broker,因为网络抖动,消息没有到达 broker,且开发人员无感知

    解决方案:producer设置acks参数,消息同步到master之后返回ack信号,否则抛异常使应用程序感知到并在业务中进行重试发送。这种方式一定程度保证了消息的可靠性,producer等待broker确认信号的时延也不高。

  • producer把消息发送给broker-master,master接收到消息,在未将消息同步给follower之前,挂掉了,且开发人员无感知。

    解决方案:producer设置acks参数,消息同步到master且同步到所有follower之后返回ack信号,否则抛异常使应用程序感知到并在业务中进行重试发送。这样设置,在更大程度上保证了消息的可靠性,缺点是producer等待broker确认信号的时延比较高。

  • 某个broker消息尚未从内存缓冲区持久化到磁盘,就挂掉了,这种情况无法通过ack机制感知。

    解决方案:设置参数,加快消息持久化的频率,能在一定程度上减少这种情况发生的概率。但提高频率自然也会影响性能。


消费重复
启动kafka的幂等性,需要修改配置文件: enable.idempotence=true

相关链接:

  1. https://blog.csdn.net/lbh199466/article/details/89918251