面试总结——kafka

导读:本篇文章讲解 面试总结——kafka,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

1. 什么是kafka

  1. 分布式发布-订阅 消息系统

2. 为什么要使用 kafka,为什么要使用消息队列

  1. 缓冲削峰上游数据有突发流量下游可能扛不住,kafka在中间可以起到一个缓冲的作用,把消息暂存在kafka中,下游服务就可以按照自己的节奏进行慢慢处理
  2. 解耦和扩展性:消息队列可以作为一个接口层解耦重要的业务流程。只需要遵守约定,针对数据编程即可获取扩展能力。
  3. 冗余:可以采用一对多的方式,一个生产者发布消息,可以被多个订阅topic的服务消费到,供多个毫无关联的业务使用。
  4. 健壮性:消息队列可以堆积请求,所以消费端业务即使短时间死掉,也不会影响主要业务的正常进行。
  5. 异步通信:很多时候,用户不想也不需要立即处理消息。消息队列提供了异步处理机制,允许用户把一个消息放入队列,但并不立即处理它。想向队列中放入多少消息就放多少,然后在需要的时候再去处理它们。

3. kafka中的broker 是干什么的?

  1. 消息中间件处理节点
  2. 一个Kafka节点就是一个broker,一个或者多个Broker可以组成一个Kafka集群

4. kafka中的 zookeeper 起到什么作用,可以不用zookeeper么?

  1. zookeeper 是一个分布式的协调组件
  2. broker依然依赖于ZK,zookeeper 在kafka中还用来选举controller 和 检测broker是否存活

5. kafka follower如何与leader同步数据

  1. Kafka的复制机制既不是完全的同步复制,也不是单纯的异步复制
  2. Follower可以批量的从Leader 复制数据, 而且Leader充分利用磁盘顺序读以及send file(zero copy)机制,这样极大的提高复制性能,内部批量写磁盘,大幅减少了Follower与Leader的消息量差

6. 什么情况下一个 broker 会从 isr中踢出去

  1. leader会维护一个与其基本保持同步的Replica列表,该列表称为ISR(in-sync Replica),每个Partition都会有一个ISR,而且是由leader动态维护
  2. 如果一个follower比一个leader 落后太多 ,或者 超过一定时间未发起数据复制请求,则leader将其重ISR中 移除

7. kafka 为什么那么快

  1. 页缓存
  2. 顺序写
  3. 零拷技术减少拷贝次数
  4. 批量处理
  5. Pull 拉模式 使用拉模式进行消息的获取消费,与消费端处理能力相符

8. kafka producer 打数据,ack 为 0, 1, -1 的时候代表啥?

  1. 1是:生产者将数据发送到Kafka后,经过leader成功接收消息的确认,就算是发送成功了。
  2. 0是:生产者将数据发送出去就不管了不去等待任何返回
  3. -1是:需要等待ISR中的所有follower都确认接收到数据后才算一次发送完成,可靠性最高

9. Kafka中的消息是否会丢失?怎么解决?

  1. acks=0,与Kafka集群进行消息接收确认,则当网络异常、缓冲区满了等情况时,消息可能丢失
  2. acks=1、同步模式下,只有Leader确认接收成功后但挂掉了,副本没有同步,数据可能丢失
  3. 解决:
    1. 发送方:ack设置成all或者-1,把min.insync.replicas配置成分区备份数
    2. 消费方:把自动提交改成手动提交(消费完成之后在手动提交)

10. Kafka中的消息重复消费怎么解决?

保证消费消息的幂等性

  1. mysql中加业务id,并设置为主键,唯一
  2. 使用redis或者zk分布式锁

11. 如何做到顺序消费?

  1. 发送方:确保消息是按顺序发送的,ack不能设置成0关闭重试,使用同步发送,等待成功发送,再发送下一条。
  2. 消费方:消息是发送到一个分区中只能有一个消费组的消费者来接收消息,因此会牺牲性能

12. 解决消息积压问题?

  1. 提升一个消费者的消费能力:在一个消费者中启动多个线程
  2. 启动多个消费者,部署在不同的服务器上
  3. 让一个消费者去把收到的消息发往另一个topic上,另一个topic设置多个分区和多个消费者,进行具体的业务消费

13. 延迟队列?

  1. 消息进入延迟队列之后暂时不能被消费,等超过了设定的时间才能被消费者进行消费
  2. 生产者,发送消息到相应的topic,并带上消息的发送时间
  3. 消费者订阅相应的topic,消费时轮询消费整个topic中的消息
  4. 创建时间和当前时间是否超过30分钟
    1. 超过:去数据库中修改订单状态为已取消
    2. 未超过:记录当前消息的offset,并不再继续消费之后的消息等待 1分钟后,再次向kafka拉取该offset及之后的消息,继续进行判断,以此 反复

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由半码博客整理,本文链接:https://www.bmabk.com/index.php/post/65605.html

(0)
小半的头像小半

相关推荐

半码博客——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!