kafka的解决方式

1.消费者弄丢了数据

          唯一可能导致消费者弄丢消息的情况是消费者自动提交了 offset消息,kafka认为你已经消费了这个消息,但是你刚刚处理的过程中,自己就挂掉了,那么这个消息就丢失了

        那么大家都知道,kafka能够自己自动提交offset,那么只要关闭自动提交offset,在处理完之后自己手动提交offset,就可以保证数据不会丢失,但是可能会被重复消费,自己保证幂等性就好啦

 

 

生产环境:

  kafka 消费者消费到数据之后,写入内存 queue 先缓存一下,结果有时候,你刚把消息写入内存queue,消费者就自动提交offset

       但是,我们手动重启系统时候,内部消息队列数据消失,

因此我们应该手动提交offset

2.kafak弄丢了数据

    

消息队列------消息传输的可靠性_数据

生产者写了一条数据过去

生产者,写入leader

但是  leader 还没能同步过去就宕机了

    follower 变为 leader 但是不存在数据1  

数据1 丢失啦

kafka生产环境丢消息

   之前 ,kafka的leader 机器宕机了,切换到follower 为leader 之后,发现数据丢失

解决方案:

 

需要给kafka设置参数:

给 这个topic 设置 replication . fcator 参数

这个值必须大于1,要求每个partition 必须有两个副本

 

 

在kafka 服务端设置 min.insync.replicas参数

这个值必须大于1,这个是要求leader 至少感知一个follower 

还跟自己保持联系,没有掉队,这个才能确保leader 挂了,还有一个follower

 

 

在生产者端设置    acks=all;

这个认为每个数据必须是写入所有repllica之后,才认为是写成功了

在produce 端设置retrise=MAX,一旦写入失败就无限重试

   但是会导致卡,

 这种配置能够保证至少一个,备份,当leader发生故障之后,进行leader切换的时候,数据不会丢失

 

3.生产者会不会弄丢数据

       如果按照以上思路,生产者并不会弄丢数据,  ack=all,要求是 你们的leader接受数据消息,所有备份follower都同步到消息之后,才认为本次写入成功了,如果没有满足这个条件,生产者会自动不断重试,重试无限次数