浅析Kafka面试题

2022-04-12  本文已影响0人  CoderInsight

1,浅析消息队列面经

这里我们通过讲解一些常见的面试题和其变种的问法来熟悉消息队列中的一些核心的概念,然后深挖其中知识点,以此来进行拓展,在这个文档中最好只是做简单但确的总结性质的语言来讲述,其他完整的回答,根据相应的模块整理起来即可:

  • 1.1,消息队列应用场景?
    • 为什么使用消息队列?
    • 使用消息队列有哪些好处和坏处?
    • 消息队列的优缺点?
  • 1.2,常见的消息队列有哪些,以及他们的对比?
    • MQ的技术选型?
  • 1.3,消息模型有哪些?
  • 1.4,MQ框架是如何实现高吞吐量的?
  • 2.1,如何解决MQ的消息丢失?
  • 2.2,如何解决消息的重复消费?
    • ExactlyOnce语义?
    • 消息的幂等性?
    • 重复出现的原因是什么?
  • 2.3,如何保证MQ的消息是有序的?
  • 3,如果出现消息积压,应该怎么办?
  • 4,如何保证数据的一致性问题?
  • 5,事务消息是如何实现的?
  • 6,MQ框架如何做到高可用?

(1),消息队列应用场景?

消息队列中的一些其他的特点等信息需要查看另外的文档,做了详细的整理。

(2),常见的几种消息队列,以及技术选型?

(3),如何解决消息的重复消费?

(4),如果出现消息积压,应该怎么办?

(5),如何保证数据的一致性问题?

关于数据的一致性问题,这里通过“解耦”场景举例:比如电商场景中,下单成功之后,再通知库房扣减库存。

那么这个时候,我们在同一个事务空间中,先处理下单的数据库操作,然后发送MQ消息;剩下的扣减库存的操作交给消费者进行。

另外在消费的环节,也可能会出现数据不一致的情况,那么我们可以采用最终一致性原则,增加重试的机制。

(6),MQ框架是如何实现高吞吐量的?

(7),MQ事务消息是如何实现的?

这里的实现方式类似于“两阶段提交”,在MySQL的事务中也是处理的。


消息队列核心逻辑整理-关于消息队列的事务.drawio.png

2,浅析Kafka面试题

(1),Kafka为什么不支持读写分离?

如果使用读写分离的策略,必然会有主和副本之间数据同步,要保证其一致性,另外副本在同步的时候如何保证实时性。

(2),MQ如何实现高可用?

这里直接以Kafka举例的,其他基本是类似的。

简单来说,就是几个节点之间,选举出主节点(Leader),那么这个时候如果主节点宕机了,可以从其他的节点中进行重新选举。另外每个节点在保存的数据的时候,会在从节点(Follower)中保存相应的副本,通过多副本机制,又是另一个高可用的体现。

(3),如何保证MQ的消息是有序的?

这里的讲解主要是以Kafka为例进行讲解的。

(4),如何解决MQ的消息丢失?

这里是针对Kafka进行分析的,其他的框架也会有类似的:

(5),补充一些常见的面试题

这里主要是题目描述一下,然后简答写一些回答的关键字。

墙裂推荐大家仔细阅读,并可以关注其公众号。:从面试角度一文学完 Kafka

1),什么是分布式消息中间件?

简单说是一个消息流的管道。

2),消息中间件的作用是什么?

解耦、异步、削峰。

3),消息中间件的使用场景是什么?

除了上述笼统的说法,从实际的业务中描述的话,可以用在一些秒杀的场景中、两个系统的耦合性太高的话,可以去做拆分。

4),消息中间件选型?

主要看业务场景是追求数据的可靠性(事务),还是追求吞吐量。

5),简单讲下 Kafka 的架构?

生产者 --> Broker集群(Topic、Partition(Leader、Follower)、Zookeeper集群) --> 消费者

6),Kafka 中 Zookeeper 的作用?

起到一个注册中心的作用,其本身也是一个分布式的集群管理工具,主要的作用便是管理集群、负责Leader节点的选举;

  • Zookeeper是怎么作用Leader选举的?

    类似与FIFO,也就是先到先得;另外如果主节点挂掉了之后,会从Follower节点中重新进行一轮筛选。

  • 了不了解Zab协议?

    原子·崩溃协议:其中的原子,是指原子广播协议,用来保证Server之间的同步,从而保证数据的一致性;崩溃,是指支持崩溃恢复,即如果出现服务器宕机重启之后,重新选举主节点,同时Follower节点与Leader节点的同步,来完成崩溃恢复。

  • Zookeeper存储方式?

    基于ACL的策略控制方式实现树状的存储,另外他是存储在内存中,并以此来保证高吞吐和低延迟。

7),Kafka 是推模式还是拉模式,推拉的区别是什么?

生产者是推模式,消费者是拉模式;

区别的话,主要就是一个主动拉取数据,另一个是被动接收数据把,通过主动拉取数据的方式可以自己管理消费的Offset,从而提高可控性和读取的性能。

8),Kafka的Offset是什么?

这里的Offset即消息的位移,或者说是偏移量,其本质上是有两种含义:

一是,Broker当中最新消息的Offset的值;

二是,消费者消费到了哪一条的数的Offset的值。

9),Kafka 如何广播消息?

广播是指发送消息给所有的消费者,也就是消费者组的概念。

同一条消息只能被同一个消费者组中一个消费者消费,但是可以被多个消费者组同时消费。

10),Kafka 的消息是否是有序的?

Topic是无序的,但是每个分区内是有序的。

11),Kafka 是否支持读写分离?

不支持,所有的读写操作都在Leader节点上;

Follower节点做镜像节点,负责同步和备份数据,当主节点Down掉后,会从Follower节点中重新选举主节点,从而实现HA;

12),Kafka 如何保证高可用?

高可用体现在集群的高可用和数据的高可用两个方面:

  • 集群的高可用体现Leader节点在Down之后可以重新从Follower节点中重新选择;
  • 数据的高可用体现在“多副本机制”、“ISR列表”、“HW”、“Leader Epoch
    • 通过配置acks=all实现多个副本都复制成功的时候才算数据接收成功;
    • ISR列表指的是达到数据同步标准的Follower节点;
    • HW是High Water Mark 高水位,防止消费者读到未同步的数据;
    • Leader Epoch 是解决的HW错位导致的数据不一致的问题:
      • 1,Epoch:是一个单调递增的版本号;
      • 2,Start Offset:是我们下一次需要从哪开始访问的位移;

13),是否支持事务?

在0.11之后是支持事务的。

14),分区数是否可以减少?

不能啊,会导致数据丢失。

15),Kafka 有哪些命令行工具?你用过哪些?

/bin 目录下的脚本文件;

管理 kafka 集群、管理 topic、模拟生产者和消费者等等

16),Kafka Producer 的执行过程?

1,Producer生产消息 --> 2,从Zookeeper找到Partition的Leader --> 3,推送消息 --> 4,通过ISR列表通知给Follower --> 5, Follower从Leader拉取消息,并发送ack --> 6,Leader收到所有副本的ack,更新Offset,并向Producer发送ack,表示消息写入成功。

17),Kafka Producer 有哪些常见配置?

acks的配置(acks=all)、异常重试的配置(retries)、提升消息吞吐量(设置缓冲区的大小、开启消息压缩(compression.typ))的配置

18),如何让 Kafka 的消息有序?

Kafka 在 Topic 级别本身是无序的,只有 partition 上才有序,所以为了保证处理顺序,可以自定义分区器,将需顺序处理的数据发送到同

19),一个 Partition Producer 如何保证数据发送不丢失?

ack机制(acks=all),重试机制

20),如何提升 Producer 的性能?

批量,异步,压缩

21),如果同一 group 下 consumer 的数量大于 part 的数量,kafka 如何处理?

多余的 consumer 将处于无用状态,不消费数据。

22),Kafka Consumer 是否是线程安全的?

不安全;所以在Consumer端采用的是 单线程消费,多线程处理

23),讲一下你使用 Kafka Consumer 消费消息时的线程模型,为何如此设计?

Thread-Per-Consumer Model,这种多线程模型是利用Kafka的topic分多个partition的机制来实现并行:每个线程都有自己的consumer实例,负责消费若干个partition。各个线程之间是完全独立的,不涉及任何线程同步和通信,所以实现起来非常简单。

其他的详细信息可以看上述连接

24),Kafka Consumer 的常见配置?

心跳时间的配置、一次Poll返回数据的最大条数、是否自动提交位移 等等

25),Consumer 什么时候会被踢出集群?

崩溃,网络异常,处理时间过长提交位移超时

26),当有 Consumer 加入或退出时,Kafka 会作何反应?

进行 Rebalance

27),什么是 Rebalance,何时会发生 Rebalance?

组成员发生变化;

订阅的主题发生变更;

定于主题的分区数发生变更;

28),Kafka 的交付语义?

  • at most once:最多一次,即不会产生重复数据,但可能会丢数据
  • at least once:至少一次,即可能会产生重复数据,但不会丢数据
  • exactly once:准确的一次,不多也不少

29),Replic 的作用?

通过Replic(副本)来保证数据的高可用性

30),为什么 Follower 副本不提供读服务?

这个问题,本质上来说是对性能和一致性的取舍。假设follower也提供读写服务,固然会提高性能,但是同时也会出现类似于数据库中幻读、脏读等问题。出现这一情况,主要是因为他们之间的同步的不一定是完全一致的。

31),Leader 和 Follower 是什么?

Partition分区中,分为两种节点:Leader、Follower,这两者之间是主备关系,当Leader节点挂了的时候,会通过选择在Follower节点中生成新的Leader节点。

  • Leader:所有的读写操作都发生在Leader分区上。
  • Follower:所有的Follower节点都需要从Leader节点上同步消息,并做为Leader的备份节点。

32),什么是 AR,ISR?

AR:All Replication,所有分配的副本列表

ISR:In-Sync Replication管理的Follower副本同步的列表,我们会配置一个可容忍的延迟数量,只有大于等于这个数量的Follower才会进入到ISR列表中,同时如果Leader节点挂掉之后,会从ISR列表中重新选举新的Leader。

33),Kafka 中的 LSO、LEO、LW、HW 等分别代表什么?

LSO:是log Start Offset,表示第一消息的offset

LEO:是Log End Offset日志末端位移的概念,指的是每个副本最后一个 offset + 1

LW:是Low Watermark的缩写,俗称“低水位”,代表AR集合中最小的logStartOffset值

HW:是High Watermark的缩写,俗称“高水位”,指的是消费者能见到的最大的 offset,ISR 列表中最小的 LEO。

35),Kafka 为保证优越的性能做了哪些处理

  • Partition并发
  • 顺序读写磁盘:每个分区文件在本地实行分段(Segment)存储,每个段都采用append追加的方式存储。
  • 零拷贝:是指减少了一次数据从内核区到用户缓冲区的拷贝。
  • PageCache:页缓存
  • 批量读写
  • 消息压缩

3,餐饮系统消息队列应用专题分析

本部分的整理内容是来自《苏三说技术-我用kafka两年踩过的非比寻常的坑》,墙裂推荐大家仔细阅读,并可以关注其公众号。

参考连接

1,MQ那点破事!消息丢失、重复消费、消费顺序、堆积、事务、高可用....

2,MQ消息队列的重复消费问题的通用解决办法以及幂等性的原理

3,苏三说技术-我用kafka两年踩过的非比寻常的坑

4,从面试角度一文学完 Kafka

首先很感谢一些博主的分享,也代表着本文部分参考其他博主的一些文档,如果有侵权,还请及时提醒,我会积极配合!!谢谢您~~~

上一篇下一篇

猜你喜欢

热点阅读