kafka面试总结
Posted worldchinalee
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了kafka面试总结相关的知识,希望对你有一定的参考价值。
kafka 面试题
1、如何获取 topic 主题的列表
bin/kafka-topics.sh --list --zookeeper localhost:2181
2、生产者和消费者的命令行是什么?
bin/kafka-console-producer.sh --broker-list 192.168.43.49:9092 --topic myTopic
bin/kafka-console-consumer.sh --zookeeper localhost:2181 --topic myTopic --from-beginning
3、consumer 是推还是拉?
kafka的consumer采用了拉的方式。
采用pull方式的主要原因有两个:
第一个是消费者可以根据自己的消费速度来决定拉取的速率
第二个是消费者可以根据自己的消费速度来决定批量拉取的消息条数
缺点是如果broker中没有可供消费的消息,将导致consumer不断在循环中轮询,直到消息到达。为了避免这点,kafka有个参数
可以让consumer阻塞,直到新消息到达(当然也可以阻塞直到消息的条数达到某个特定的量)。
4、讲讲 kafka 维护消费状态跟踪的方法
大部分消息系统在broker端维护被消费的记录:一个消息被分发到consumer后broker就马上进行标记或者等待consumer的通知后进行标记,这样在消息消费后马上删除以减少空间占用。
但是这样会有一些问题,如果一条消息发送出去之后就立即被标记为消费过的,一旦consumer处理消息时失败了
8、数据传输的事务定义有哪三种?
最多一次:消息不会被重复发送,最多被传输一次,可能会丢失
最少一次:消息不会被漏传,最少被传输一次,可能会重复
精确一次:不会漏传也不会重复传输,每个消息都被传输一次而且仅仅被传输一次
9、Kafka 判断一个节点是否还活着有那两个条件?
10、Kafka 与传统 MQ 消息系统之间有三个关键区别
11、讲一讲 kafka 的 ack 的三种机制
参数request.required.acks,有三个值-1,0,1
0:生产者不会等待broker的ack,这个延迟最低,存储保证性最弱
1:生产者会等待ack,leader副本确认接收到消息后发送ack,但是leader挂掉后不确保follower是否复制完数据,
新的leader可能会丢失数据
-1:leader会等待所有的follower副本都复制完成之后,才会向生产者发送ack,存储保证性最强
13、消费者故障,出现活锁问题如何解决?
14、如何控制消费的位置
15、kafka 分布式(不是单机)的情况下,如何保证消息的顺序消费?
16、kafka 的高可用机制是什么?
17、kafka 如何减少数据丢失
kafka到底会不会丢失数据(data loss)?通常不会,但有些情况的确可能会发生。下面的参数配置及best practice列表可以较好地保证数据的持久性(当然是trade off,牺牲了吞吐量)。
- block.on.buffer.full = true
- acks = all
- retries = MAX_VALUE
- max.in.flight.requests.per.connection = 1
- 使用KafkaProducer.send(record, callback)
- callback逻辑中显式地关闭producer:close(0)
- unclean.leader.election.enable = false
- replication.factor = 3
- min.insync.replicas = 2
- replication.factor > min.insync.replicas
- enable.auto.commit = false
- 消息处理完之后再提交
18、kafka 如何不消费重复数据?比如扣款,我们不能重复的扣。
其实还得结合业务来思考,我这里给几个思路:
比如你拿个数据要写库,你先根据主键查一下,如果这数据都有了,你就别插入了,update一下好了。
比如你是写redis,那就没问题了,反正每次都是set,天然幂等性。
比如你不是上面两个场景,那做的稍微复杂一点,你需要让生产者发送每条数据的时候,里面加一个全局唯一的id,类似订单id之类的东西,然后你这里消费到了之后,先根据这个id去比如redis里查一下,之前消费过吗?如果没有消费过,你就处理,然后这个id写redis。如果消费过了,那你就别处理了。
比如基于数据库的唯一键来保证重复数据不会插入多条,因为有唯一键约束了,重复数据插入只会报错,不会导致数据中出现脏数据。
以上是关于kafka面试总结的主要内容,如果未能解决你的问题,请参考以下文章