ack应答机制
ACK
在 Kafka 中,ack(Acknowledgment)机制是指用于确认生产者发送的消息已经被成功写入到 Kafka 分区中的一种机制。生产者可以通过 ack 参数来控制这个机制,以便根据自己的需求进行设置。
ACK应答级别
0:生产者发送过来的数据,不需要等数据落盘应答。
1:生产者发送过来的数据,Leader 收到数据后应答。
-1(all):生产者发送过来的数据,Leader+和 isr 队列里面的所有节点收齐数据后应答。默认值是-1,-1 和 all 是等价的。
可靠性总结:
acks=0,生产者发送过来数据就不管了,可靠性差,效率高;
acks=1,生产者发送过来数据Leader应答,可靠性中等,效率中等;
acks=-1,生产者发送过来数据Leader和ISR队列里面所有Follwer应答,可靠性高,效率低;
注:在生产环境中,acks=0很少使用;acks=1,一般用于传输普通日志,允许丢个别数据;acks=-1,一般用于传输和钱相关的数据,
对可靠性要求比较高的场景。
acks = all 数据重复分析
当 Kafka 生产者的 acks 参数设置为 all 时,只有在所有的 ISR(In-Sync Replicas,同步副本)都确认接收并成功写入数据后,生产者才会收到成功的响应。但是,由于网络等原因,可能会出现某些 ISR 没有及时接收到数据的情况。此时,生产者会重发数据,以保证所有的 ISR 都能接收到数据。
在 Kafka 中,当生产者发送一条消息到分区时,分区中的所有 ISR 都会尝试接收该消息并写入到本地磁盘上。如果某些 ISR 没有接收到该消息,或者该消息在某些 ISR 上写入失败,那么这些 ISR 就会发出请求要求重新发送该消息。生产者会根据请求重新发送消息,确保所有的 ISR 都能接收到该消息并将其写入到本地磁盘上。
消息重复解决方案
在 Kafka 中,可以采取以下几种方式来解决消息重复的问题:
增加消息唯一标识符:在消息体中增加唯一标识符,例如 UUID,应用程序在处理消息时可以根据标识符判断是否已经处理过该消息,避免重复处理。
手动提交消费者的 offset:消费者可以使用手动提交 offset 的方式,即在处理完一条消息后手动提交offset,避免在消息处理失败时自动提交 offset 导致消息被重复消费。Kafka 提供了两种手动提交 offset的方式:同步提交和异步提交。
设置消费者的 auto.offset.reset 参数:当消费者第一次订阅主题或者当前的 offset已经被删除时,消费者需要从哪个 offset 开始拉取消息是由 auto.offset.reset 参数来决定的。如果该参数被设置为earliest,则消费者将从最早的可用 offset 开始消费消息,如果该参数被设置为 latest,则消费者将从最新的 offset开始消费消息。
设置 Kafka 的 deduplication 策略:Kafka 支持基于时间窗口的 deduplication 策略,可以在 Kafka Broker 中进行配置。该策略会在指定的时间窗口内对消息进行去重,避免重复消费。