kafka消息丢失问题

kafka在生产端发送消息 和 消费端消费消息 时都可能会丢失一些消息

1. 生产者消息丢失

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

acks=0: 表示producer不需要等待任何broker确认收到消息的回复就可以继续发送下一条消息。性能最高,但是最容易丢消息。大数据统计报表场景,对性能要求很高,对数据丢失不敏感的情况可以用这种。

acks=1: 至少要等待leader已经成功将数据写入本地log,但是不需要等待所有follower是否成功写入就可以继续发送下一条消息。这种情况下,如果follower没有成功备份数据,而此时leader又挂掉,则消息会丢失。

acks=-1或all: 这意味着leader需要等待所有备份(min.insync.replicas配置的备份个数)都成功写入日志,这种策略会保证只要有一个备份存活就不会丢失数据。一般除非是金融级别,或跟钱打交道的场景才会使用这种配置。当然如果min.insync.replicas配置的是1则也可能丢消息,跟acks=1情况类似。

2. 消费端消息丢失

消费端丢消息最主要体现在消费端offset的自动提交,如果开启了自动提交,万一消费的数据还没处理完,此时你consumer直接宕机了,未处理完的数据丢失了,下次也消费不到了,因为offset已经提交完毕,下次会从offset出开始消费新消息。

解决办法是采用消费端的手动提交

        //手动提交offset
        /**
         * 注意如果要使用手动提交offset,需要以下三点
         * ①:配置文件配置手动提交方式
         * ②:加上参数Acknowledgment ack
         * ③:方法中使用ack.acknowledge();手动提交
         */
        ack.acknowledge();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章