Kafka 常见面试题
Survive by day and develop by night.
talk for import biz , show your perfect code,full busy,skip hardness,make a better result,wait for change,challenge Survive.
happy for hardess to solve denpendies.
目录
概述
Kafka 常见面试题
需求:
- Kafka 消息队列的一次性语义
设计思路
实现思路分析
1.什么是一次性语义?
at-most-once:至多一次【允许为0次,可能数据丢失】
at-least-once:至少一次【至少一次,允许多次,可能数据重复】
exactly-once:有且仅有一次【只有一次,精准数据传输】
2.:Kafka 如何保证生产一次性语义?
数据丢失场景:生产者将数据发送给Kafka,数据在网络传输过程中可能丢失
ACK + 重试机制:生产者生产数据写入Kafka,等待Kafka返回ack确认,收到ack,生产者发送下一条
3.ACK机制:acks = 0/1/all/-1
0:不等待ack,直接发送下一条
优点:快;
缺点:数据易丢失
1:生产者将数据写入Kafka,Kafka 等待这个分区的 Leader 副本返回ack,发送下一条
优点:性能和安全做了中和的选项;
缺点:依旧存在一定概率的数据丢失的情况
all/-1:生产者将数据写入Kafka,Kafka 等待这个分区所有ISR 【可用】副本同步成功才返回ack,发送下一条
优点:安全
缺点:性能比较差
问题:如果ISR中只有leader一个,leader写入成功,直接返回,leader故障数据丢失怎么办?
解决:搭配min.insync.replicas来使用,并且 >= 2
min.insync.replicas:表示最少要有几个ISR的副本
4.重试机制
retries = 3 #发送失败的重试次数
数据重复的情况:ACK丢失
Step1 : 生产发送一条数据 A 给 Kafka
Step2 :Kafka 存储数据 A,返回Ack 给生产者
Step3 :如果ack丢失,生产者没有收到 ack,超时,生产者认为数据丢失没有写入 Kafka
Step4 : 生产者基于重试机制重新发送这条数据 A,Kafka 写入数据 A,返回 ack
Step5 : 生产者收到 ack ,发送下一条B
问题: A 在 Kafka 中写入两次,产生数据重复的问题
解决:
实现:生产者在生产数据的过程中会在每条数据中增加一个数据id,当前这一条数据会比上一条数据id多1 。由Kafka服务端进行判断,会根据id进行判断是否写过该数据:
如果没有写入:写入Kafka;
如果已经写入:直接返回ack.
参考资料和推荐阅读
- https://www.jianshu.com/p/dab60fcd672d
欢迎阅读,各位老铁,如果对你有帮助,点个赞加个关注呗!~