深入Kafka broker

一、协议设计

  1. 颗粒度, PRODUCE和FETCH中支持topic,partion等层级的颗粒度;
  2. 测试友好, 基于session_id和epoch确定一条拉取链路的fetch session;
  3. 全量增量结合, FetchRequest中的全量拉取和增量拉取;
  4. 基本结构: header+body。 常见header: api_key, api_version, corelation_id, client_id。与网络协议类似, Kafka本身的协议也是分层读取, header中保留必要的分类和标识信息, body中为具体的消息内容。

request format

在这里插入图片描述

response format

在这里插入图片描述

二、延时操作

与定时操作的比较

  1. 都有超时时间, 但延迟操作如果超时时间内没有完成, 则需要强制执行;
  2. 定时操作通常必须在固定时间段之后执行, 延时操作可以在固定时间点之前执行;
  3. 为了能够提前完成操作, 延时操作支持提前执行(外部触发);

Kafka使用场景

  1. 延时生产: leader节点完成消息写入之后, 等待所有follower节点同步完成, 然后响应客户端;
  2. 延时拉取: follower向leader节点拉取数据, 但此时并没有新消息写入, Kafka并不是立即返回, 而是基于延时操作来处理。一来减少空拉取消耗资源, 二来如果在超时时间窗口内有新消息进入, 则可以立刻拉取到, 保证时效性;

时间轮结构

TimeWheel是一个存储延时任务的环形队列, 底层采用数组实现。数组中的每个元素存放一个定时任务列表(TimerTaskList)。列表本身为环形双向链表, 每个元素为任务项(TimerTaskEntry), 内部封装了定时任务TimerTask。
时间轮(数组)上的每个位置表示相同的时间间隔tickMs, 间隔数量由wheelSize确定, 因此一周代表的时间为tickMs*wheelSize。时间轮还有个表盘指针, currentTime是tickMs的整数倍, 将时间轮划分为到期部分和未到期部分。
时间轮可以级联。Kafka中基于层级时间轮, 类似钟表的时、分、秒。秒级延迟的任务在秒级轮, 分级任务在分级轮, 时级任务在时级轮。一个时级任务会从一开始在时级轮, 到分级轮, 最后到秒级轮。

在时间推进上, Kafka基于JDK中的DelayQueue。DelayQueue中的元素为, 时间轮上的TimerTaskList。DelayQueue会按照工期时间排序, 最先过期的任务放在最前面。超时任务处理线程, 从DelayQueue中获取过期的TimerTaskList, 然后执行时间轮推进或者执行任务中的超时处理。既降低超时任务添加和删除的复杂度, 又能够做到精准推进(按照超时时间超越推进, 而不是按固定时间步进)。

单轮示意

在这里插入图片描述

层级轮示意

在这里插入图片描述

延时操作示意

在这里插入图片描述

三、组控制器

Kafka有多个broker, 某个broker会被选举为controller, 负责管理所有分区和副本状态。具体包括如下三个方面:

  1. 当分区leader副本变化时, 由其进行leader副本选举;
  2. 当分区ISR集合变化时, 由其通知所有的broker更新元数据;
  3. 当更新Topic分区数量时, 尤其负责分区重分配;

Controller选举和异常恢复

  1. 基于zookeeper的临时节点/controller, 如果某个broker创建成功, 则该broker成功成为controller。其他失败节点进入状态同步阶段, 设置activieBrokerId。
  2. 如果该节点异常, 则会进入新一轮的竞争;
  3. 此外还有一个永久节点/controller_epoch, 记录本轮controller选举的纪元, 用于辅助选举;

Controller职责与zk节点

  1. topic变化, /brokers/topics, /admin/delete_topics
  2. partition变化, /admin/ressign_partitions, /isr_change_notification, /admin/prefered-replica-election
  3. broker变化, /brokers/ids
  4. 启动分区状态机和副本状态机;
  5. 更新集群元数据信息;
  6. 维护分区优先副本选举的均衡;

Controller内部的事件处理模型

在这里插入图片描述

优雅关闭broker

Kafka本身显然是一个有状态依赖的服务, 因此每个组成服务的broker本身会维护一堆的状态。关闭某个运行中的broker节点对集群状态是有影响的。因此集群要能处理两种关闭, 失控关闭和受控关闭。失控关闭比如broker节点被kill -9 或者节点突然掉电, 这种应对方案只能通过关闭前已持久化的信息进行恢复。受控关闭则是在消除对集群本身的影响之后再关闭。

受控关闭示意如下:
在这里插入图片描述

分区leader选举

由controller从AR中找到第一个ISR副本作为leader副本。当然, 此处还需要考虑leader副本所在的节点不是一个正在关闭的节点。

小结

本文深入Kafka broker节点内部, 探讨Kafka协议设计,延迟操作和组控制器的设计与实现, 结合之前的存储结构,建立起Kakfa broker的整体结构框架。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/642998.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

opencv中的几个重要函数

对于我们经常使用python的同学,尤其还习惯使用numpy库,突然上手opencv c时,就会感觉想要一个结果,python一行代码搞定,但是c却无处下手,因此特总结遇到的几个重要opencv函数,方便能够快速获取跟…

8.前端--CSS-显示模式

元素的显示模式 元素显示模式就是元素&#xff08;标签&#xff09;以什么方式进行显示&#xff0c;比如<div>自己占一行&#xff0c;比如一行可以放多个<span>。 1.块元素 常见的块元素 常见的块元素&#xff1a;<h1>~<h6>、<p>、<div>、…

SQLyog的使用

快捷键功能备注对象浏览器窗口及查询执行快捷键  F5刷新对象浏览器窗口 CtrlB 切换鼠标光标焦点至对象浏览器窗口&#xff1b; F8执行当前行SQL&#xff0c;并允许编辑查询结果 F9执行查询/执行当前行的SQL 连接  CtrlM创建新连接 CtrlN以当前连接属性创建新连接 Ctr…

如何预防服务器IP被劫持,危害有什么?

服务器IP被劫持是一种严重的网络安全问题&#xff0c;攻击者通过篡改服务器的IP地址&#xff0c;将网络流量重定向到恶意服务器或网站&#xff0c;导致用户无法正常访问目标服务器&#xff0c;并可能面临数据泄露、恶意软件感染等安全风险。了解服务器IP被劫持的危害和预防措施…

理解Java中的AQS

一、定义 AQS:AbstractQueuedSynchronizer(抽象队列同步器)&#xff0c;是一个用于构建锁和同步器的抽象的同步框架。AQS 提供了一种可扩展的基础&#xff0c;允许开发者实现各种形式的同步控制机制。 例如&#xff1a;独占锁&#xff08;ReentrantLock&#xff09;、共享锁&a…

Jumpserver中安装httpx

查看已安装的包 pip freeze # python -V # Python 2.7.5安装anyio 刚开始直接pip install httpx&#xff0c;未设置版本号&#xff0c;因已有idna2.7&#xff0c;所以出现版本不兼容的现象 anyio 3.0.0 requires idna>2.8, but you have idna 2.7 which is incompatible.…

船的最小载重量-算法

说明&#xff1a;题解完全是从leetCode上拉下来的&#xff0c;在这里只是作为一个备份&#xff0c;怕之后找不着了。同时也分享给大家&#xff0c;这个题目用了一个我之前从未遇到的思路。 原题&#xff1a;船的最小载重量-leetCode1101 题目&#xff08;看懂题目了吗&#xff…

STM32 I2C的多设备通信协议设计与实现

在STM32微控制器上使用I2C进行多设备通信需要设计合适的通信协议&#xff0c;以确保每个设备能够正确识别并响应主设备的命令。在本文中&#xff0c;我们将针对STM32的I2C多设备通信协议进行设计与实现&#xff0c;并展示如何使用代码来实现此协议。 要实现STM32的I2C多设备通…

JavaScript快速入门四

文章目录 事件事件的绑定事件监听机制常见事件点击事件焦点事件加载事件鼠标事件键盘事件选择和改变表单事件 事件 概述&#xff1a;某些组件被执行了某些操作后&#xff0c;触发了某些代码的执行 事件的绑定 方法一&#xff1a;直接在 HTML 标签上&#xff0c;指定事件的属性…

自定义通用返回对象

目的&#xff1a;给返回对象补充一些信息&#xff0c;告诉前端这个请求在业务层面上是成功还是失败&#xff0c;以及具体的描述信息。 我们需要自定义错误码&#xff08;因为前端的HTTP状态码默认的值比较少&#xff09;和正常错误返回类。 ErrorCode &#xff1a; package …

python基础 - 变量

知识点1&#xff1a; print函数里可以用英文逗号, 分隔字符和变量&#xff0c;字符串要用双引号引起来&#xff0c;而变量名不用引起来&#xff0c;同时print的时候也可以直接写数学运算公式 知识点2&#xff1a; python里和用户交互的函数是input&#xff0c;但它有一个特点&…

街机模拟游戏逆向工程(HACKROM)教程:[18]分析的思路

在之前的文章,我们已经提及,得到玩家的血量,可以用这个分析出哪些想要的东西: 1、被敌人攻击 - 得到敌人某个技能的攻击力,自身的防御力。 2、被队友攻击 - 得到队友的攻击力。 3、被道具击中 - 得到道具的攻击力。 4、使用扣血技能 - 得到使用技能扣除的血量值。 5、…

pikachu_csrf通关攻略

csrf&#xff08;get&#xff09; 打开pikachu靶场&#xff1a; 1. 根据提示给的账户密码进行登录 2. 打开代理拦截数据包将拦截数据发送到已打开的burp中&#xff1a; 修改数据进行发包&#xff1a; 从上面的url可见&#xff0c;修改用户信息的时候&#xff0c;是不带任何不…

网易云音乐JS逆向分析

文章目录 页面分析抓包分析JS逆向分析代码编写 页面分析 先来分析一下页面 当我们点击播放按钮的时候&#xff0c;音乐开始播放。实际上这个逻辑背后的原理是这个按钮后面对应的是一个url&#xff0c;这个地址是通过ajax来进行局部刷新的。 所以我们可以通过抓包工具&#…

everything的使用技巧

搜索 如何使用布尔运算符&#xff1f; AND 是默认布尔运算符。 例如&#xff0c;搜索 abc 和 123&#xff0c;您可以&#xff1a; abc 123 OR搜索两个搜索项中任意一个&#xff0c;在两项中加上 | 。 例如&#xff0c;搜索 .jpg 或 .bmp&#xff0c;您可以&#xff1a; …

软件开发:大厂中的灰度发布到底是什么样的一个流程

前言 灰度发布是一种软件发布的策略&#xff0c;也被称为渐进式发布或部分用户发布。在灰度发布中&#xff0c;新版本的软件不会立即对所有用户进行全面发布&#xff0c;而是先选择一小部分用户进行测试和试用。这样可以在生产环境中逐步引入新功能或修复bug&#xff0c;以降低…

K8S搭建(centos)四、安装K8S

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

第二百八十三回

文章目录 1. 概念介绍2. 方法与细节2.1 实现方法2.2 具体细节 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何混合选择多个图片和视频文件"相关的内容&#xff0c;本章回中将介绍如何通过相机获取视频文件.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. …

linux环境开发工具---yum与vim

1.Linux软件包管理器yum 1.1什么是软件包 在学习linux过程中&#xff0c;我们常常会遇到某些指令用不了的时候&#xff0c;原因除了权限问题外&#xff0c;还有可能是你当前的linux环境并没有安装相应的软件包。而在Linux下载安装软件的办法有两个&#xff0c;一个是先下载所需…

Aspx漏洞总结

第一部分&#xff0c;.NET项目当中的dll都可以进行反编译&#xff1a; 在java中有很多jar包&#xff0c;而在.NET框架中的bin中对应有很多DLL文件&#xff0c;bin下面都是可执行文件&#xff0c;这些文件都是很多代码封装的&#xff0c;想要查看源码&#xff0c;都需要通过反编…