侧边栏壁纸
博主头像
落叶人生博主等级

走进秋风,寻找秋天的落叶

  • 累计撰写 130562 篇文章
  • 累计创建 28 个标签
  • 累计收到 9 条评论
标签搜索

目 录CONTENT

文章目录

18道kafka高频面试题哪些你还不会?(含答案和思维导图)

2022-06-27 星期一 / 0 评论 / 0 点赞 / 58 阅读 / 8323 字

原文:https://www.cnblogs.com/starcrm/p/10552183.html前言Kafka是最初由Linkedin公司开发,是一个分布式、支持分区的(partition)、多副

原文:https://www.cnblogs.com/starcrm/p/10552183.html

前言

..Kafka是最初由Linkedin公司开发,是一个分布式、支持分区的(partition)、多副本的(replica),基于zookeeper协调的分布式消息系统,它的最大的特性就是可以实时的处理大量数据以满足各种需求场景:比如基于hadoop的批处理系统、低延迟的实时系统、storm/Spark流式处理引擎,web/nginx日志、访问日志,消息服务等等,用scala语言编写,Linkedin于2010年贡献给了Apache基金会并成为顶级开源 项目。..

关于Kafka的知识总结了个思维导图

..........

5、讲一下主从同步

..Kafka允许topic的分区拥有若干副本,这个数量是可以配置的,你可以为每个topci配置副本的数量。Kafka会自动在每个个副本上备份数据,所以当一个节点down掉时数据依然是可用的。....Kafka的副本功能不是必须的,你可以配置只有一个副本,这样其实就相当于只有一份数据。..

6、为什么需要消息系统,mysql 不能满足需求吗?

..(1)解耦:....允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束。....(2)冗余:....消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险。许多消息队列所采用的”插入-获取-删除”范式中,在把一个消息从队列中删除之前,需要你的处理系统明确的指出该消息已经被处理完毕,从而确保你的数据被安全的保存直到你使用完毕。....(3)扩展性:....因为消息队列解耦了你的处理过程,所以增大消息入队和处理的频率是很容易的,只要另外增加处理过程即可。....(4)灵活性 & 峰值处理能力:....在访问量剧增的情况下,应用仍然需要继续发挥作用,但是这样的突发流量并不常见。如果为以能处理这类峰值访问为标准来投入资源随时待命无疑是巨大的浪费。使用消息队列能够使关键组件顶住突发的访问压力,而不会因为突发的超负荷的请求而完全崩溃。....(5)可恢复性:....系统的一部分组件失效时,不会影响到整个系统。消息队列降低了进程间的耦合度,所以即使一个处理消息的进程挂掉,加入队列中的消息仍然可以在系统恢复后被处理。....(6)顺序保证:....在大多使用场景下,数据处理的顺序都很重要。大部分消息队列本来就是排序的,并且能保证数据会按照特定的顺序来处理。(Kafka 保证一个 Partition 内的消息的有序性)....(7)缓冲:....有助于控制和优化数据流经过系统的速度,解决生产消息和消费消息的处理速度不一致的情况。....(8)异步通信:....很多时候,用户不想也不需要立即处理消息。消息队列提供了异步处理机制,允许用户把一个消息放入队列,但并不立即处理它。想向队列中放入多少消息就放多少,然后在需要的时候再去处理它们。..

7、Zookeeper 对于 Kafka 的作用是什么?

..Zookeeper 是一个开放源码的、高性能的协调服务,它用于 Kafka 的分布式应用。....Zookeeper 主要用于在集群中不同节点之间进行通信....在 Kafka 中,它被用于提交偏移量,因此如果节点在任何情况下都失败了,它都可以从之前提交的偏移量中获取除此之外,它还执行其他活动,如: leader 检测、分布式同步、配置管理、识别新节点何时离开或连接、集群、节点实时状态等等。....8、数据传输的事务定义有哪三种?....和 MQTT 的事务定义一样都是 3 种。....(1)最多一次: 消息不会被重复发送,最多被传输一次,但也有可能一次不传输....(2)最少一次: 消息不会被漏发送,最少被传输一次,但也有可能被重复传输.....(3)精确的一次(Exactly once): 不会漏传输也不会重复传输,每个消息都传输被一次而且仅仅被传输一次,这是大家所期望的..

9、Kafka 判断一个节点是否还活着有那两个条件?

..(1)节点必须可以维护和 ZooKeeper 的连接,Zookeeper 通过心跳机制检查每个节点的连接....(2)如果节点是个 follower,他必须能及时的同步 leader 的写操作,延时不能太久..

10、Kafka 与传统 MQ 消息系统之间有三个关键区别

..(1).Kafka 持久化日志,这些日志可以被重复读取和无限期保留....(2).Kafka 是一个分布式系统:它以集群的方式运行,可以灵活伸缩,在内部通过复制数据提升容错能力和高可用性....(3).Kafka 支持实时的流式处理..

11、讲一讲 kafka 的 ack 的三种机制

..request.required.acks 有三个值 0 1 -1(all)....0:生产者不会等待 broker 的 ack,这个延迟最低但是存储的保证最弱当 server 挂掉的时候就会丢数据。....1:服务端会等待 ack 值 leader 副本确认接收到消息后发送 ack 但是如果 leader挂掉后他不确保是否复制完成新 leader 也会导致数据丢失。....-1(all):服务端会等所有的 follower 的副本受到数据后才会受到 leader 发出的ack,这样数据不会丢失...

12、消费者如何不自动提交偏移量,由应用提交?

...将 auto.commit.offset 设为 false,然后在处理一批消息后 commitSync() 或者异步提交 commitAsync()....即:..
ConsumerRecords<> records = consumer.poll();for (ConsumerRecord<> record : records){	。。。	tyr{		consumer.commitSync()	}	。。。}

13、消费者故障,出现活锁问题如何解决?

..出现“活锁”的情况,是它持续的发送心跳,但是没有处理。为了预防消费者在这种情况下一直持有分区,我们使用 max.poll.interval.ms 活跃检测机制。 在此基础上,如果你调用的 poll 的频率大于最大间隔,则客户端将主动地离开组,以便其他消费者接管该分区。 发生这种情况时,你会看到 offset 提交失败(调用commitSync()引发的 CommitFailedException)。这是一种安全机制,保障只有活动成员能够提交 offset。所以要留在组中,你必须持续调用 poll。....消费者提供两个配置设置来控制 poll 循环:....max.poll.interval.ms:增大 poll 的间隔,可以为消费者提供更多的时间去处理返回的消息(调用 poll(long)返回的消息,通常返回的消息都是一批)。缺点是此值越大将会延迟组重新平衡。....max.poll.records:此设置限制每次调用 poll 返回的消息数,这样可以更容易的预测每次 poll 间隔要处理的最大值。通过调整此值,可以减少 poll 间隔,减少重新平衡分组的....对于消息处理时间不可预测地的情况,这些选项是不够的。 处理这种情况的推荐方法是将消息处理移到另一个线程中,让消费者继续调用 poll。 但是必须注意确保已提交的 offset 不超过实际位置。另外,你必须禁用自动提交,并只有在线程完成处理后才为记录手动提交偏移量(取决于你)。 还要注意,你需要 pause 暂停分区,不会从 poll 接收到新消息,让线程处理完之前返回的消息(如果你的处理能力比拉取消息的慢,那创建新线程将导致你机器内存溢出)。............

最后

..欢迎大家一起交流,喜欢文章记得关注我点个赞哟,感谢支持!..


.
.

广告 广告

评论区