1. 什么是kafka
- 分布式发布-订阅 消息系统
2. 为什么要使用 kafka,为什么要使用消息队列
- 缓冲和削峰: 上游数据有突发流量,下游可能扛不住,kafka在中间可以起到一个缓冲的作用,把消息暂存在kafka中,下游服务就可以按照自己的节奏进行慢慢处理。
- 解耦和扩展性:消息队列可以作为一个接口层,解耦重要的业务流程。只需要遵守约定,针对数据编程即可获取扩展能力。
- 冗余:可以采用一对多的方式,一个生产者发布消息,可以被多个订阅topic的服务消费到,供多个毫无关联的业务使用。
- 健壮性:消息队列可以堆积请求,所以消费端业务即使短时间死掉,也不会影响主要业务的正常进行。
- 异步通信:很多时候,用户不想也不需要立即处理消息。消息队列提供了异步处理机制,允许用户把一个消息放入队列,但并不立即处理它。想向队列中放入多少消息就放多少,然后在需要的时候再去处理它们。
3. kafka中的broker 是干什么的?
- 消息中间件处理节点
- 一个Kafka节点就是一个broker,一个或者多个Broker可以组成一个Kafka集群
4. kafka中的 zookeeper 起到什么作用,可以不用zookeeper么?
- zookeeper 是一个分布式的协调组件
- broker依然依赖于ZK,zookeeper 在kafka中还用来选举controller 和 检测broker是否存活
5. kafka follower如何与leader同步数据
- Kafka的复制机制既不是完全的同步复制,也不是单纯的异步复制
- Follower可以批量的从Leader 复制数据, 而且Leader充分利用磁盘顺序读以及send file(zero copy)机制,这样极大的提高复制性能,内部批量写磁盘,大幅减少了Follower与Leader的消息量差
6. 什么情况下一个 broker 会从 isr中踢出去
- leader会维护一个与其基本保持同步的Replica列表,该列表称为ISR(in-sync Replica),每个Partition都会有一个ISR,而且是由leader动态维护
- 如果一个follower比一个leader 落后太多 ,或者 超过一定时间未发起数据复制请求,则leader将其重ISR中 移除 。
7. kafka 为什么那么快
- 页缓存
- 顺序写
- 零拷技术减少拷贝次数
- 批量处理
- Pull 拉模式 使用拉模式进行消息的获取消费,与消费端处理能力相符
8. kafka producer 打数据,ack 为 0, 1, -1 的时候代表啥?
- 1是:生产者将数据发送到Kafka后,经过leader成功接收消息的确认,就算是发送成功了。
- 0是:生产者将数据发送出去就不管了,不去等待任何返回
- -1是:需要等待ISR中的所有follower都确认接收到数据后才算一次发送完成,可靠性最高
9. Kafka中的消息是否会丢失?怎么解决?
- acks=0,不与Kafka集群进行消息接收确认,则当网络异常、缓冲区满了等情况时,消息可能丢失;
- acks=1、同步模式下,只有Leader确认接收成功后但挂掉了,副本没有同步,数据可能丢失;
- 解决:
- 发送方:ack设置成all或者-1,把min.insync.replicas配置成分区备份数
- 消费方:把自动提交改成手动提交(消费完成之后在手动提交)
10. Kafka中的消息重复消费怎么解决?
保证消费消息的幂等性:
- mysql中加业务id,并设置为主键,唯一
- 使用redis或者zk分布式锁
11. 如何做到顺序消费?
- 发送方:确保消息是按顺序发送的,ack不能设置成0,关闭重试,使用同步发送,等待成功发送,再发送下一条。
- 消费方:消息是发送到一个分区中,只能有一个消费组的消费者来接收消息,因此会牺牲性能
12. 解决消息积压问题?
- 提升一个消费者的消费能力:在一个消费者中启动多个线程
- 启动多个消费者,部署在不同的服务器上
- 让一个消费者去把收到的消息发往另一个topic上,另一个topic设置多个分区和多个消费者,进行具体的业务消费
13. 延迟队列?
- 消息进入延迟队列之后暂时不能被消费,等超过了设定的时间才能被消费者进行消费
- 生产者,发送消息到相应的topic,并带上消息的发送时间
- 消费者订阅相应的topic,消费时轮询消费整个topic中的消息
- 创建时间和当前时间是否超过30分钟
- 超过:去数据库中修改订单状态为已取消
- 未超过:记录当前消息的offset,并不再继续消费之后的消息,等待 1分钟后,再次向kafka拉取该offset及之后的消息,继续进行判断,以此 反复。