面试官:说说Kafka控制器事件处理全流程(下)

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 面试官:说说Kafka控制器事件处理全流程(下)

UpdateMetadataRequest

更新Broker上的元数据。

Controller事件处理线程会把事件封装成对应的请求,然后将请求写入对应的Broker的请求阻塞队列,然后RequestSendThread不断从阻塞队列中获取待发送的请求。


image.png


先解释下controllerBrokerStateInfo,它就是个 POJO类,可以理解为集群每个broker对应一个controllerBrokerStateInfo.


image.png


然后再看下ControllerChannelManager,从名字可以看出它管理Controller和集群Broker之间的连接,并为每个Broker创建一个RequestSendThread线程。


image.png


再小结一下


接着上个小结,事件处理线程将事件队列里面的事件处理之后再进行对应的请求封装,塞入需要通知的集群Broker对应的阻塞队列中,然后由每个Broker专属的requestSendThread发送请求至对应的Broker

总的步骤如下图:


image.png


现在应该已经清楚Controller大概是如何运作的,整体看起来还是生产者-消费者模型

接下来就进入源码环节。


Controller选举流程源码分析


事件处理的流程都是一样的,只是具体处理的事件逻辑不同,我们从Controller选举入手,来走一遍处理流程。


ControllerChangeHandler

选举会触发此handler,可以看到直接往ControllerEventManager的事件队列里塞。

image.png


这个QueueEventControllerEventManager,我们先来看看是啥。不过在此之前先了解下ControllerEventControllerEventProcessor


ControllerEvent:事件

image.png


ControllerEventProcessor : 事件处理接口

此接口的唯一实现类是 KafkaController

image.png


ControllerEventManager:事件处理器

此类主要用来管理事件处理线程和事件队列。

image.png


QueuedEvent:封装了ControllerEvent的类

主要是记录了下入队时间,并且提供了事件需要调用的方法。

image.png


ControllerEventThread:事件处理线程

整体而言还是很简单的,从队列拿事件,然后处理。


image.png


KafkaController#process

就是个switch,根据事件调用对应的processXXXX方法。

image.png

image.png

image.png

image.png


最后我们来看下元数据到底有啥和KafkaController的一些字段。


ControllerContext:元数据

主要有运行中的Broker、所有主题信息、主题分区副本信息等。

image.png


KafkaController

基本上关键的字段都解释了,关于状态机那一块篇幅有限,之后再说。

image.png


最后


整体的流程就是将Controller相关操作都封装成一个个事件,然后将事件入队,由一个事件处理线程来处理,保证数据的安全(从这也可以看出,不是多线程就是好,有利有弊最终还是看场景)。

最后在通知集群中Broker的过程是每个Broker配备一个发送线程,因为发送是同步的,因此每个Broker线程隔离可以防止某个Broker阻塞而导致整体都阻塞的情况。

前面有说到Kafka Controller 强依赖 ZooKeeper。但是现在社区打算移除 ZooKeeper,因为ZooKeeper不适合频繁写,并且是CP的。而且用Kafka还需要维护ZooKeeper集群,提升了系统的复杂度和运维难度,降低了系统的稳定性。

像位移信息,已经通过内部主题的方式保存,绕开了ZooKeeper

社区打算通过类 Raft 共识算法来选举Controller,并且把元数据存储在 Log 中的方式来做。

我是 yes,从一点点到亿点点,我们下篇见


相关文章
|
1月前
|
消息中间件 存储 监控
Kafka 面试题及答案整理,最新面试题
Kafka 面试题及答案整理,最新面试题
141 3
|
1月前
|
消息中间件 负载均衡 Kafka
【Kafka面试演练】那Kafka消费者手动提交、自动提交有什么区别?
嗯嗯Ok。分区的作用主要就是为了提高Kafka处理消息吞吐量。每一个topic会被分为多个分区。假如同一个topic下有n个分区、n个消费者,这样的话每个分区就会发送消息给对应的一个消费者,这样n个消费者负载均衡地处理消息。同时生产者会发送消息给不同分区,每个分区分给不同的brocker处理,让集群平坦压力,这样大大提高了Kafka的吞吐量。面试官思考中…
67 4
|
3月前
|
消息中间件 存储 Kafka
程序员的27大Kafka面试问题及答案
程序员的27大Kafka面试问题及答案
|
1月前
|
消息中间件 Kafka
面试官:你说说Kafka是怎么保证消息可靠性的
面试官:那要是Kafka消费堆积了怎么办。每个topic是分为多个分区给不同Broker处理,要合理分配分区数量来提高Broker的消息处理能力。比如3个Broker2个分区,可以改为3个Broker3个分区
49 1
面试官:你说说Kafka是怎么保证消息可靠性的
|
1月前
|
消息中间件 算法 Java
面试官:Kafka和ES选主有什么区别?
Kafka 和 ES,作为大数据处理的中间件,分别用于流处理和全文检索。它们的选主(Kafka 的 Controller 和 ES 的 Master)都基于 Raft 算法实现一致性。Raft 算法通过选举确保分布式系统数据一致性,涉及领导者、追随者和候选人间的身份转换。当超过一半的节点投票给同一候选节点时,该节点成为新领导者。Kafka 和 ES 在此基础上可能有各自优化调整。更多关于 Raft 算法的详细流程和选举规则见原文。
44 2
|
1月前
|
网络协议 编译器 调度
【Qt 面试题】深入剖析QT TCP通讯流程及应用实例
【Qt 面试题】深入剖析QT TCP通讯流程及应用实例
30 0
|
2月前
|
消息中间件 存储 监控
美团面试:Kafka如何处理百万级消息队列?
美团面试:Kafka如何处理百万级消息队列?
135 1
|
2月前
|
敏捷开发 测试技术 持续交付
面试题1: 测试常见工作流程
面试题1: 测试常见工作流程
|
3月前
|
消息中间件 存储 缓存
Kafka - 3.x 图解Broker总体工作流程
Kafka - 3.x 图解Broker总体工作流程
72 0
|
3月前
|
消息中间件 Kafka API
Kafka - 图解生产者消息发送流程
Kafka - 图解生产者消息发送流程
64 0