kafka怎么避免重复消费 万方
问:kafka重复消费的原因
- 答:如果自动提交的偏移量小于客户端处理的最后一个消息的偏移量,那么处于两个偏移量之间的消息就会被重复处理,
假设我们采用了自动提交,且提交时间间隔为5s,在最近一次提交之后的3s发生了再均衡,再均衡之后,消费者从最后一次提交的偏移量位置开始读取消息。这个时候偏移量已经落后了3s,所以在这3s内到达的消息会被重复处理。可以通过修改提交时间间隔来更频繁地提交偏移量,减小可能出现重复悄息的时间窗,不过这种情况是无也完全避免的。
问:Kafka重复消费数据
- 答:从消息发送和消息消费两个方面去说。
「 ACK 」
0:producer不等待broker的ack,这一操作提供了一个最低的延迟,broker一接收到还没有写入磁盘就已经返回,当broker故障时有可能丢失数据。
1:producer等待broker的ack,partition的leader落盘成功后返回ack,如果在follower同步成功之前leader故障,那么将会丢失数据。
-1:producer等待broker的ack,partition的leader和follower全部落盘成功后才返回ack。但是如果在follower同步完成后,broker发送ack之前,leader发生故障,那么会造成数据重复。
「消费」
写入sink没有提交offset,下次消费还从处理过的offset消费。这个时候要么做到幂等不影响下游。要么就是事务+两阶段提交。
在消费者处理数据慢的时候(消费能力低),消费者会重复消费某个局部数据。在消费能力不变的情况下,陷入死循环。只有在消费能力增强后,才会跳出这个重复消费的死循环。
原理解析:
上图就是完整的kafka消费的过程,在consumer里面配置了一个超时时间。如果步骤2处理消息超时,那么consumer进行第3步会失败。这时候再次进入步骤1拉取重复的数据,如此往复。
问:kafka消费的三种模式是什么?
- 答:at most onece模式
基本思想是保证每一条消息commit成功之后,再进行消费处理。
设置自动提交为false,接收到消息之后,首先commit,然后再进行消费。
at least onece模式
基本思想是保证每一条消息处理成功之后,再进行commit。
设置自动提交为false;消息处理成功之后,手动进行commit。
采用这种模式时,最好保证消费操作的“幂等性”,防止重复消费。
exactly onece模式
核心思想是将offset作为唯一id与消息同时处理,并且保证处理的原子性。
设置自动提交为false;消息处理成功之后再提交。
比如对于关系型数据库来说,可以将id设置为消息处理结果的唯一索引,再次处理时,如果发现该索引已经存在,那么就不处理。
本文来源: https://www.lw00.cn/article/5682d014606f0cf59509309c.html