Kafka在controller的代码设计

主要的核心类如下:

controller :

根据相关的上下文,创建KafkaController对象,引入多个监听器监听broker,topic,partition以及副本的状态变化。

ZookeeperLeaderElector:

主要负责选举当前broker为lead的过程,同时,如果出现异常情况转移lead选举权。

ReplicaStateMachine:

主要负责broker的副本状态变化跟踪与重新分配的工作

PartitionStateMachine:

主要负责topic与partition的状态变化跟踪与重新分配的工作

ZookeeperLeaderElector详解

当前broker节点成为控制节点的流程

1.注册controller epoch 的监听者,用来监控epoch的选举

2.增加controller epoch的值

3.初始化 controller的上下文,用来缓存当前的topics,活着的broker与每个online的partitions的leader

4.启动controller的channel manager

5.启动  replica state machine

6.启动 partition state machine

如果在这个过程中出现异常情况,此节点将放弃成为controller。其他的broker将触发选举动作,将接替成为controller。

ReplicaStateMachine详解

将会启动broker副本状态变化监听程序

1.当OnlinePartition状态变化例如(新建partition,offlinepartition),将触发状态变化通知

2.检查是否有需要重新分配的partition给最近启动的broker,从而进行分配调整。

在此过程中,不会更新topic/partition的leader/isr缓存,原因在于PartitionStateMachine会被触发,他会去负责相关工作。

partition state machine详解

1.创建新的topic

a)partitionStateMachine注册topic信息

b)创建新的partition,将partition设置为NewPartition 状态,再讲其NewPartition->OnlinePartition 状态

2.分区调整

partition state machine将注册一个reassigned
partitions监听器,用来调整partition。当admin开始调整分区的时候,会创建zk的/admin
/reassign_partitions,从而会触发zk此目录的监听器,开始进行分区调整

1)用OAR + RAR副本组修改并分配副本列表.

2)当处于OAR + RAR时,发送LeaderAndIsr请求给每个副本.

3)副本处于RAR – OAR -> 调用方法NewReplica

4)等待直到新的副本加入isr中

5)副本处于RAR -> 调用方法OnlineReplica

6)设置AR to RAR并写到内存中,将RAR扩容

7)如果当前的lead不再RAR中,从RAR中选举一个新lead,并发送LeaderAndIsr信息。

8)对于处于OAR – RAR的副本 -> Offline (强制这些副本从isr重剔除)

9)将处于OAR – RAR的副本 ->NonExistentReplica ,并在物理硬盘上面删除对应的文件数据

10)在zk上修改AR到RAR中。

11)更新/admin/reassign_partitions下面的信息,将删除对应的partition信息

12)当新的lead选完之后,同时,也会将更新的副本与isr的信息的变化信息,通知给每一个broker

例子:

例如, if OAR = {1, 2, 3} and RAR = {4,5,6}, 在zk上重分配副本和领导者/is这些值可能经历以下转化。

AR                  leader/isr

{1,2,3}            1/{1,2,3}           (初始化状态)

{1,2,3,4,5,6}   1/{1,2,3}           (step 2)

{1,2,3,4,5,6}   1/{1,2,3,4,5,6}  (step 4)

{1,2,3,4,5,6}   4/{1,2,3,4,5,6}  (step 7)

{1,2,3,4,5,6}   4/{4,5,6}           (step 8)

{4,5,6}            4/{4,5,6}           (step 10)

时间: 2024-11-05 16:07:21

Kafka在controller的代码设计的相关文章

Kafka的broker核心代码设计

主要的核心类如下: KafkaServer: 根据相关的上下文,创建KafkaServer对象,负责启动broker对象 启动过程 zkClient 初始化=>logManager  start()=> socketServer start()=>requestHandlerPool 初始化=>replicaManager start() => kafkaController start() =>topicConfigManager start() => kafk

ecmall中static变量的使用-model模型代码设计

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 function &m($model_name, $params = array(), $is_new = false) {     <span style="backg

WPF换肤之四:界面设计和代码设计分离

原文:WPF换肤之四:界面设计和代码设计分离 说起WPF来,除了总所周知的图形处理核心的变化外,和Winform比起来,还有一个巨大的变革,那就是真正意义上做到了界面设计和代码设计的分离.这样可以让美工和程序分开进行,而不是糅合在一块,这样做的好处当然也是显而易见的:提高了开发效率. 原先的设计方式 在我们之前设计的代码中,每当添加一个新的窗体的时候,我总是会在这个新的窗体的XAML文件中加入如下的代码,以便使样式能够应用上去: <Window x:Class="WpfApplicatio

团队型代码设计规则

团队型代码设计,应该基于需求接口分类进行.这意味着不会有成千上万甚至第二个人接管.修改一个人的代码,每一个功能都有具体的需求接口记录,每一个功能都由一个程序员写出,如果功能代码需要更新.修改则必须由它的创造者负责,如果程序员更换,则由新程序员创建新的功能代码来实现接口服务.这需要一个代码总管进行需求接口的分类和制定.只有这样的秩序才能提供高效和方便的工作环境.

【tool】利用测试概念进行代码设计时的七条基本原则

跟其它编码原则一样,这些原则也不是不容置疑或不可改变的教条.有时候打破这些规则也是必要的.因此,理解每条原则背后的动机和判断何时这些动机不适用(或应让位给更关心的问题)的能力是很重要的. 原则 1. 到 GUI 视图的外面去 尽可能把代码移到 GUI 视图的外面.然后各种 GUI 动作就能成了模型上的简单方法调用.为什么您需要这样做呢? 对 GUI 测试者来说,通过方法调用测试功能比间接地测试功能容易的多. 另一个好处是它使修改程序功能而不影响视图变的更容易. 当然,视图中也可能存在错误.在理想

易于跨引擎和测试的游戏客户端代码设计方法

一.前言 本文讲的设计方法,不涉及算法.优化.接口讲解等技术介绍. 该设计方法基于MVC设计模式(主要是抽出控制类),而且本文主要面向游戏开发的一些问题. 该设计方法样例由python编写,但是实际上都是伪代码,有一点代码基础的问基本看得懂. 该设计方法由师兄教授,在项目使用过之后,感觉确实不错,特地提取一个方法论出来以记录. 二.MVC简介 在游戏开发中,目前用到架构主要分为MVC和ESC架构(这部分如有异议欢迎指正,有其他架构也希望能提出,博主也可以学习). 在一个功能复杂的模块中,通常会有

少量代码设计一个登录界面(二) – .NET CORE(C#) WPF开发

微信公众号:Dotnet9,网站:Dotnet9,问题或建议:请网站留言, 如果对您有所帮助:欢迎赞赏. 阅读导航 本文背景 代码实现 本文参考 源码 1. 本文背景 同上篇文章<少量代码设计一个登录界面>,本篇介绍另一种登录界面设计风格. 2. 代码实现 使用 .NET CORE 3.1 创建名为 "Login" 的WPF模板项目,添加1个Nuget库:MaterialDesignThemes.3.1.0-ci981. 解决方案主要文件目录组织结构: Login App.

基于UDP的客户端和服务器端的代码设计

实验平台 linux 实验内容 编写UDP服务器和客户端程序,客户端发送消息,服务器接收消息,并打印客户端的IP地址和端口号. 实验原理 UDP是无需连接的通信,其主要实现过程如下: 同样,我们可以按照上一篇博客:基于TCP的客户端和服务器端的代码设计 的办法,将服务器代码分成两部分,一个是初始化,一个是收发数据.但是UDP服务器初始化较为简单,也可以直接写在main函数里. UDP和TCP在读写数据上较为不同的是,sendto()和recvfrom(),这两个函数较为复杂.通过man手册查询得

Linux内核中的GPIO系统之(3):pin controller driver代码分析--devm_kzalloc使用【转】

转自:http://www.wowotech.net/linux_kenrel/pin-controller-driver.html 一.前言 对于一个嵌入式软件工程师,我们的软件模块经常和硬件打交道,pin control subsystem也不例外,被它驱动的硬件叫做pin controller(一般ARM soc的datasheet会把pin controller的内容放入GPIO controller的章节中),主要功能包括: (1)pin multiplexing.基于ARM core