kafka丢失数据和重复消费数据

先处理消费端的丢失数据和重复消费

这俩种情况都是 消息偏移offset的问题导致的,只是场景不同。

offset位移提交一般有俩种方式,自动位移提交和手动位移提交。用enable.auto.commit这个配置属性去控制

丢失消息一般是自动提交的问题,所以切换成手动位移提交就可以。手动位移提交分成同步提交和异步提交俩种。具体看下图。

 

重复消费的处理

 对于消费端消息的重复消费问题,如果消费端拉取了一部分数据,消费完毕后,准备执行手动提交(或自动提交)时,消费者挂掉了!此时offset还未提交呢,那么当服务重启时,还是会拉取相同的一批数据重复处理!造成消息重复消费

所以可以用redis等工具进行原子性事务操作来处理。

接下来看一下生产者的数据重复和丢失问题

1.数据重复

发送消息如果配置了重试机制,比如由于网络波动,生产者未得到broker收到了消息的响应,就会触发重试机制,3秒后再次发送此消息。broker之前已经收到过这个消息,但生产者由于触发了重试机制,就导致了消息的重复发送。那么broker就会在磁盘缓存多条同样的消息,消费端从broker拉取消息时,就会造成重复消费。

注意:kafka新版本已经在broker中保证了接收消息的幂等性(比如2.4版本),只需在生产者加上参数 props.put(“enable.idempotence”, true) 即可,默认是false不开启。

2. 数据丢失

生产者消息丢失
        生产者在发送消息时,会有一个ack机制,当ack=0 或者 ack=1时,都可能会丢消息。如下所示:

1.acks=0
表示producer不需要等待任何broker确认收到消息的回复,就可以继续发送下一条消息。性能最高,但是最容易丢消息。大数据统计报表场景,对性能要求很高,对数据丢失不敏感的情况可以用这种。
2.acks=1
至少要等待leader已经成功将数据写入本地log,但是不需要等待所有follower是否成功写入。就可以继续发送下一条消息。这种情况下,如果follower没有成功备份数据,而此时leader又挂掉,则消息会丢失。
3.acks=-1或all
这意味着leader需要等待所有备份(min.insync.replicas配置的备份个数)都成功写入日志,这种策略会保证只要有一个备份存活就不会丢失数据。这是最强的数据保证。一般除非是金融级别,或跟钱打交道的场景才会使用这种配置。当然如果min.insync.replicas配置的是1则也可能丢消息,跟acks=1情况类似

posted @   习惯了蓝  阅读(1056)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示