消息队列------消息传输的可靠性
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都同步到消息之后,才认为本次写入成功了,如果没有满足这个条件,生产者会自动不断重试,重试无限次数