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
相关链接:
