今天分享的这道面试题,是一个工作 2 年的小伙伴私信给我的。
我觉得这个问题比较简单,本来不打算说,但是,唉~ 作为新的 UP 主满足粉丝的基本要求,才能获得更多的点赞呀~是吧。
关于“ Kafka 如何保证消息不丢失 ”这个问题
一、面试解析
(如图)kafka 是一个用来实现异步消息通信的中间件,它的整个架构由 Producer、
Consumer、Broker 组成。
所以,对于 kafka 如何保证消息不丢失这个问题,可以从三个方面来考虑和实现。
首先是 Producer 端,需要确保消息能够到达 Broker 并实现消息存储,在这个层面,有可能出现网络问题,导致消息发送失败,所以,针对 Producer 端,可以通过 2 种方式来避免消息丢失
7. Producer 默认是异步发送消息,这种情况下要确保消息发送成功,有两个方法
a. 把异步发送改成同步发送,这样 producer 就能实时知道消息发送的结果。
b. 添加异步回调函数来监听消息发送的结果,如果发送失败,可以在回调中重试。
8. Producer 本身提供了一个重试参数 retries,如果因为网络问题或者 Broker 故障导致发送失败,Producer 会自动重试。然后是 Broker 端,Broker 需要确保 Producer 发送过来的消息不会丢失,也就是只需要把消息持久化到磁盘就可以了。
(如图)但是,Kafka 为了提升性能,采用了异步批量刷盘的实现机制,也就是说按照一定的消息量和时间间隔来刷盘,而最终刷新到磁盘的这个动作,是由操作系统来调度的,所以如果在刷盘之前系统崩溃,就会导致数据丢失。
(如图)Kafka 并没有提供同步刷盘的实现,所以针对这个问题,需要通过 Partition的副本机制和 acks 机制来一起解决。“我简单说一下 Partition 副本机制,它是针对每个数据分区的高可用策略,每个partition 副本集包含唯一的一个 Leader 和多个 Follower,Leader 专门处理事务类的请求,Follower 负责同步 Leader 的数据”。在这样的一种机制的基础上,kafka 提供了一个 acks 的参数,Producer 可以设置 acks参数再结合 Broker 的副本机制来个共同保障数据的可靠性。acks 有几个值的选择。
9. acks=0, 表示 producer 不需要等 Broker 的响应,就认为消息发送成功,这种情况会存在消息丢失。
10. acks=1,表示 Broker 中的 Leader Partition 收到消息以后,不等待其他 FollowerPartition 同步完,就给 Producer 返回确认,这种情况下 Leader Partition 挂了,会存在数据丢失。
11. acks=-1,表示 Broker 中的 Leader Parititon 收到消息后,并且等待 ISR 列表中的 follower 同步完成,再给 Producer 返回确认,这个配置可以保证数据的可靠性
最后,就是 Consumer 必须要能消费到这个消息,实际上,我认为,只要 producer和 broker 的消息可靠的到了保障,那么消费端是不太可能出现消息无法消费的问题,除非是 Consumer 没有消费完这个消息就直接提交了,但是即便是这个情况,也可以通过调整 offset 的值来重新消费。
以上就是我对这个问题的理解。
二、面试总结
从高手的回答可以发现,任何的技术问题,是可以按照请求的顺序,或者调用关系来逐层推导去回答的。当然,技术的底子要足够厚,至少像 kafka 里面这些副本、数据同步、分区、刷盘等功能,至少都要有深度的思考和研究。
好的,本期的普通人 VS 高手面试系列的视频就到这里结束了,喜欢的朋友记得点赞和收藏。
另外,有任何技术上的问题,职业发展有关的问题,都可以私信我,我会在第一时间回复。
我是 浮生,一个工作了 14 年的 Java 程序员,咱们下期再见。
三、粉丝福利
最近很多同学问我有没有java学习资料,我根据我从小白到架构师多年的学习经验整理出来了一份 50W字面试解析文档、简历模板、学习路线图、java必看学习书籍 、 需要的小伙伴 可以关注我
公众号:“ 灰灰聊架构 ”, 回复暗号:“ 321 ”即可获取