Kafka中的KRaft算法
我们之前的Kafka值依赖于Zookeeper注册中心来启动的,往里面注册我们节点信息
Kafka是什么时候不依赖Zookeeper节点了
在Kafka2.8.0开始就可以不依赖Zookeeper了
可以用KRaft模式代替Zookeeper管理Kafka集群
KRaft Controller和KRaft Leader的关系
两者关系
- Leader 是 Controller 的选举结果:KRaft Controller 负责 Kafka 集群的管理,如主题管理、分区分配、副本管理等重要任务。在 KRaft 架构下,Controller 节点是从所有 Broker 节点中通过 KRaft 选举机制选出的,当选的这个 “Controller Broker” 节点内部存在一个 Leader 角色, 这个 Leader 负责在 Controller 节点内部以及与其他 Broker 节点之间协调和同步集群元数据等关键信息 也就是说,KRaft Leader 是在 KRaft Controller 选举过程中确定的,用于主导 Controller 相关工作的执行以及与其他节点交互。
- 数据交互:从数据流转角度看,如图片中展示的,KRaft Controller 会从 KRaft Leader 拉取数据,这是因为 KRaft Leader 维护着最新的集群元数据状态等信息,其他 Controller 需要通过从 Leader 拉取数据来保证自身拥有的集群元数据的一致性和及时性,进而正常执行集群管理职责
Controller 与 Leader 的协作关系
- 元数据同步:Controller 会将集群的元数据信息同步给各个分区的 Leader,使 Leader 能够根据最新的元数据来处理客户端的请求。例如,当分区的副本数量发生变化时,Controller 会将新的副本信息通知给 Leader,以便 Leader 进行数据同步等操作。
- 故障处理:当 Leader 出现故障时,Controller 会触发新的 Leader 选举流程,并确保新的 Leader 能够尽快接管工作,保证数据的可用性和一致性。同时,Controller 也会与新的 Leader 协作,更新集群元数据,让其他 Broker 和客户端能够及时获取到最新的状态信息
人话
我们会选出一个Broker作为管理集群的Controller,它有一个单分区的内部主题_cluster_metadata
存储元数据信息
然后还会选几个备用Broker,里面有存储元数据信息的单分区的内部主题_cluster_metadata的副本
所以并不是每一个Borker都是Controller
为什么用KRaft代替Zookeeper管理kafka集群元数据之Broker扩展差
Zookeeper管理集群流程
Kafka中会有一个Broker节点被选为控制器Controller,去管理整个集群
如果有一个Broker节点出现故障
那么Controller将负责为故障Broker节点上的分区重新选出新的Leader副本
Kafka的Broker节点都默认接收受控关机
受控关机的好处:尽量减少对客户端服务的中断
假设我们要关闭Broker0
我们会向Broker0发送一个SIG_TERM信号
然后在Broker0关闭之前,我们要向控制器Controller发送一个ControllerShutDownRequet
然后控制器Controller完成分区的重新选主和ISR列表收缩工作
然后Broker0同步阻塞,等待控制器Controller的回复
收缩
然后这个收缩成{2,3}
这里的蓝色表示ISR信息还没有持久化到Zookeeper集群中
然后我们的Controller会在这两个副本中选择一个Partition-的Leader副本
最后把ISR列表信息以及Leader副本信息持久化到Zookeeper集群中
ISR列表为红色,说明已经持久化到Zookeeper集群中了
发送LeaderAndlsrRequest请求
收到该请求的Broker节点将从LeaderAndlsrRequest请求中解析出Leader和ISR列表信息
Kafka1.1.0之前,必须在一个Broker节点明确回复收到数据之后,控制器才会向下一个Broker节点发送LeaderAndlsrRequest请求
Broker从请求中解析出Leader等元数据信息之后,并且把数据存储在本地之后,它才会给Controller一个响应,告知Controller元数据信息是否写入成功
只有Controller收到响应成功之后,他才会向下一个节点例如Broker-3发送LeaderAndlsrRequest请求
Kafka1.0之前,所有的同步元数据操作都是单线程同步阻塞进行的
甚至在关闭之前,Controller一次只会移动一个Leader分区
整个过程都是同步阻塞进行的
当这个节点都迁移完之后
我们的Controller才会向Broker-0节点发送ControlledShutdownResponse响应,Broker-0才会关闭自身服务
总结
- 1个控制器需要向ZK单线程更新写入每个分区的最新元数据
- 关闭一个Broker服务因为这个单线程写入模式,可能会导致耗时很长
- 分区在重新选举Leader的时候,会暂停对外提供读写服务
KRaft模式中Kafka的Controller节点的日志同步过程
在KRaft中将Kafka工作产生的日志都放到了一个单分区的内部主题_cluster_metadata中
这个主题中存储的数据是原来Zookeeper集群管理Kafka的时候,在Zookeeper的zNode节点中存储的元数据
PS:这个主题是一个单分区主题
只有一个分区的好处是,可以保证数据的全局有限性
因为一旦Controller产生的日志顺序出现错乱后果是相当严重
因此这是一个Kafka的内部单分区主题
但是这个主题是可以有多个副本的
其中Leader副本存储的是Active Controller节点直接写入的数据
相当于:你配置了多少个Controller角色,这个_cluster_metadata主题就可以自动生成多少个分区的副本
写入数据
例如我们用命令创建主题或者修改分区的时候,Kafka的后台会向Active状态的Controller节点发送元数据信息
并且我们的元数据写入的时候我们还会有任期编号,例如这个蓝色的1
这个编号的目的:表示这条消息是在哪个任期产生的
复制数据
我们的KRaft采用的是拉模式来复制日志
然后我们的日志进行异步提交
提交日志
然后Leader节点会告诉Follower节点,让他们也向日志提交相应的内容
移动高水位
蓝色那条线移动了
KRaft的提交是多数原则,而不是ISR机制
records 的 commit 依据是 quorum 而不是 ISR”,Kafka 传统副本复制中,消息的提交(commit)依赖 ISR(In - Sync Replica,同步副本集)机制。
ISR 是指与 Leader 副本保持同步的 Follower 副本集合,当 Leader 接收到消息并写入本地日志后,只要 ISR 中的多数副本确认收到消息,该消息就可以被标记为已提交
而在 KRaft 中,records 的提交依据是 quorum(法定人数)原则。quorum 指的是在一个分布式系统中,为了达成共识或者完成某个操作所需要的最少节点数量。在 KRaft 的场景下,当满足 quorum 数量的节点确认收到并持久化了 records,这些 records 就会被提交。这与 Kafka 传统副本复制的 ISR 机制在确认消息提交的方式上有所不同,quorum 机制更强调分布式系统中的多数节点的认可,以实现数据的一致性和可靠性
KRaft是多数副本机制,ISR是多数ISR机制(ISR中不一定是全部副本,例如我们副本有5个,ISR中有3个,我们是以ISR中多数确认为主而不是多数副本确认为主,ISR中副本数不等于总副本数)
- ISR:消息提交并不一定基于多数节点认可。只要 Leader 副本收到 ISR 中所有副本的 ACK 确认(即使 ISR 成员可能少于副本总数的一半 ),就可将消息标记为已提交。 例如,若一个分区有 5 个副本,ISR 集合中有 3 个副本,只要这 3 个副本都确认收到消息,消息就提交,不要求是副本总数的多数。
- quorum:严格遵循多数节点认可原则。在一个有 n 个节点的分布式系统中,通常需要超过 n/2 的节点认可才能完成相关操作(如消息提交 )。例如,在 5 个节点的系统中,需要至少 3 个节点认可
Raft和KRaft有什么不同?
在Kafka2.8.0开始就可以不依赖Zookeeper了
可以用KRaft代替Zookeeper管理Kafka集群
Raft算法使用推模式
KRaft算法使用拉模式
在KRaft管理模式中,可以部署奇数个Controller节点
并且有且只有一个Controller节点是Leader节点,也就是Active状态
只有Active状态的Leader节点才可以对外提供服务
其他的节点都是Follower节点
这些Follower状态的Controller节点都是从Active状态的Leader节点拉取元数据,并备份到本地的KRaft log文件中
Kraft的拉模式和Raft的推模式具体有哪些不同呢?各有什么优缺点
在元数据不大的情况下,推模式不是元数据备份的实时性更好吗?为什么要改造成拉模式呢?
因为一开始Kafka的架构就是每个Partition的分区副本都是Follower从Leader副本同步数据
为了遵循一开始的使用架构Kafka才对Raft日志的复制部分进行了改造,改造成了拉模式
其他不同
任期时间
Raft模式中的Leader的任期时间是term
而在KRaft中,Leader的任期时间是epoch
新的状态节点
这个Observer节点不会参与Leader选举
它只是负责发现并从Leader节点中拉取元数据信息
每个Broker节点都充当Observer
控制器节点就充当Leader和Follower
Broker节点会按照需求从Leader节点中拉取本地不存在的元数据信息
全文总结-Zookeeper管理和Raft和KRaft管理的区别
Zookeeper中Broker受控关机时间长
Kafka1.1.0之前是单线程同步阻塞执行
之后是异步非阻塞执行
- 1个控制器需要向ZK单线程更新写入每个分区的最新元数据
- 关闭一个Broker服务因为这个单线程写入模式,可能会导致耗时很长
- 分区在重新选举Leader的时候,会暂停对外提供读写服务
KRaft和Zookeeper的管理元数据区别
在KRaft中将Kafka工作产生的日志都放到了一个单分区的内部主题_cluster_metadata中
这个主题中存储的数据是原来Zookeeper集群管理Kafka的时候,在Zookeeper的zNode节点中存储的元数据
KRaft和Zookeeper的日志提交区别
Zookeeper机制下,我们使用的是ISR机制
KRaft模式下,我们使用的是多数投票机制
KRaft和Zookeeper的备用Controller机制
Zookeeper 管理 Kafka 中的 Controller(只有一个Controller)
- 选举恢复机制:如前面所说,Kafka 依靠 Zookeeper 进行 Controller 选举,当当前 Controller 节点故障时,Zookeeper 通过删除 “/controller” 节点触发新的选举流程,其他 Broker 竞争成为新的 Controller。这个过程中没有专门预先设定好的备用 Controller 节点,所有非 Controller 的 Broker 都有机会参与选举。
- 潜在问题:在选举期间,可能会有短暂的集群管理空白期,并且如果有大量 Broker 同时竞争 Controller,可能会导致选举过程不稳定或产生 “脑裂” 等问题,影响 Kafka 集群的正常运行。
KRaft 中的 Controller(有一个Active Controller和多个备用Controller)
- 备用机制:KRaft 中有类似备用 Controller 的概念。在 KRaft 协议中,会有一个 Leader 作为主要的 Controller 负责管理和协调工作,同时存在多个 Follower 节点可以在 Leader 出现故障时快速切换成为新的 Leader(即新的 Controller)。 这些 Follower 节点会实时同步 Leader 的状态和数据,相当于备用的 Controller,能够在故障发生时迅速接管工作,减少集群管理的中断时间。
- 优势:这种机制相比 Zookeeper 管理 Kafka 的 Controller 选举方式,故障切换速度更快,因为备用节点已经在持续同步数据和状态,不需要像 Zookeeper 管理 Kafka 那样重新进行选举流程,从而提高了集群的稳定性和可靠性
KRaft和Raft的区别
Raft模式下,我们是Leader向Follower推数据来进行日志同步
KRaft模式下,我们是Follower向Leader拉数据来进行日志同步
KRaft中有个新角色,是和Zookeeper管理集群的时候一样的角色,也就是Observer
Observer按照需求从Leader节点中拉取本地不存在的元数据信息
Observer 的存在可以帮助集群在不增加选举投票负担的情况下,扩展获取元数据的能力,提升系统的读性能
参考文章:bilibli码上加薪
相关文章:
Kafka中的KRaft算法
我们之前的Kafka值依赖于Zookeeper注册中心来启动的,往里面注册我们节点信息 Kafka是什么时候不依赖Zookeeper节点了 在Kafka2.8.0开始就可以不依赖Zookeeper了 可以用KRaft模式代替Zookeeper管理Kafka集群 KRaft Controller和KRaft Leader的关系 两者关系 Lea…...
C++20新特性
作者:billy 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 前言 C20 是 C 标准中的一个重要版本,引入了许多新特性和改进,包括模块(Modules)、协程…...
[LUA ERROR] bad light userdata pointer
Cocos2d项目,targetSdkVersion30,在 android 13 设备运行报错: [LUA ERROR] bad light userdata pointer ,导致黑屏。 参考 cocos2dx 适配64位 arm64-v8a 30 lua 提示 bad light userdata pointer 黑屏-CSDN博客的方法 下载最新的Cocos2dx …...
Maven 安装配置(完整教程)
文章目录 一、Maven 简介二、下载 Maven三、配置 Maven3.1 配置环境变量3.2 Maven 配置3.3 IDEA 配置 四、结语 一、Maven 简介 Maven 是一个基于项目对象模型(POM)的项目管理和自动化构建工具。它主要服务于 Java 平台,但也支持其他编程语言…...
JAVA:CloseableHttpClient 进行 HTTP 请求的技术指南
1、简述 CloseableHttpClient 是 Apache HttpComponents 提供的一个强大 HTTP 客户端库。它允许 Java 程序与 HTTP/HTTPS 服务交互,可以发送 GET、POST 等各种请求类型,并处理响应。该库广泛用于 REST API 调用、文件上传和下载等场景。 2、特性 Close…...
WebRTC 客户端与ZLMediaKit通讯
1 web浏览器js方式 要使用 WebRTC 客户端与 ZLMediaKit 通讯,您需要设置一个 WebRTC 客户端并与 ZLMediaKit 进行连接。以下是一个基本的步骤和示例代码,帮助您实现这一目标。 ### 步骤 1. **安装 ZLMediaKit**:确保您已经在服务器上安装并…...
openssl使用
openssl使用 提取密钥对 数字证书pfx包含公钥和私钥,而cer证书只包含公钥。提取需输入证书保护密码 openssl pkcs12 -in xxx.pfx -nocerts -nodes -out pare.key提取私钥 openssl rsa -in pare.key -out pri.key提取公钥 openssl rsa -in pare.key -pubout -ou…...
stm32小白成长为高手的学习步骤和方法
我们假定大家已经对STM32的书籍或者文档有一定的理解。如不理解,请立即阅读STM32的文档,以获取最基本的知识点。STM32单片机自学教程 这篇博文也是一篇不错的入门教程,初学者可以看看,讲的真心不错。 英文好的同学…...
支持多种网络数据库格式的自动化转换工具——VisualXML
一、VisualXML软件介绍 对于DBC、ARXML……文件的编辑、修改等繁琐操作,WINDHILL风丘科技开发的总线设计工具——VisualXML,可轻松解决这一问题,提升工作效率。 VisualXML是一个强大且基于Excel表格生成多种网络数据库文件的转换工具&#…...
Linux学习笔记16---高精度延时实验
延时函数是很常用的 API 函数,在前面的实验中我们使用循环来实现延时函数,但是使用循环来实现的延时函数不准确,误差会很大。虽然使用到延时函数的地方精度要求都不会很严格( 要求严格的话就使用硬件定时器了 ) ,但是延时函数肯定…...
【kafka实战】05 Kafka消费者消费消息过程源码剖析
1. 概述 Kafka消费者(Consumer)是Kafka系统中负责从Kafka集群中拉取消息的客户端组件。消费者消费消息的过程涉及多个步骤,包括消费者组的协调、分区分配、消息拉取、消息处理等。本文将深入剖析Kafka消费者消费消息的源码,并结合…...
20240817 联想 笔试
文章目录 1、选择题1.11.21.31.41.51.61.71.81.91.101.111.121.131.141.151.161.171.181.191.202、编程题2.12.2岗位:Linux开发工程师 题型:20 道选择题,2 道编程题 1、选择题 1.1 有如下程序,程序运行的结果为 (D) #include <stdio.h>int main() {int k = 3...
Maven 中常用的 scope 类型及其解析
在 Maven 中,scope 属性用于指定依赖项的可见性及其在构建生命周期中的用途。不同的 scope 类型能够影响依赖项的编译和运行阶段。以下是 Maven 中常用的 scope 类型及其解析: compile(默认值): 这是默认的作用域。如果…...
【电机控制器】STC8H1K芯片——低功耗
【电机控制器】STC8H1K芯片——低功耗 文章目录 [TOC](文章目录) 前言一、芯片手册说明二、IDLE模式三、PD模式四、PD模式唤醒五、实验验证1.接线2.视频(待填) 六、参考资料总结 前言 使用工具: 1.STC仿真器烧录器 提示:以下是本…...
PHP 运算符
PHP 运算符 概述 PHP 是一种广泛使用的开源服务器端脚本语言,它具有丰富的运算符集,这些运算符是编写 PHP 程序的基础。运算符用于执行各种数学、逻辑和比较操作。本篇文章将详细介绍 PHP 中常用的运算符,包括算术运算符、比较运算符、逻辑运算符、赋值运算符等。 算术运…...
【自然语言处理】利用Memory Layer替换Transformer中的FFN
论文地址:https://arxiv.org/pdf/2412.09764 相关博客 【自然语言处理】利用Memory Layer替换Transformer中的FFN 【自然语言处理】【大模型】BitNet:用1-bit Transformer训练LLM 【自然语言处理】BitNet b1.58:1bit LLM时代 【自然语言处理】…...
【设计模式】【行为型模式】策略模式(Strategy)
👋hi,我不是一名外包公司的员工,也不会偷吃茶水间的零食,我的梦想是能写高端CRUD 🔥 2025本人正在沉淀中… 博客更新速度 📫 欢迎V: flzjcsg2,我们共同讨论Java深渊的奥秘 …...
报错:no matching host key type found
no matching host key type found. Their offer: ssh-rsa,ssh-dss scp: Connection closed 可能发生在scp或其他方式连接服务器时 报错原因: 服务器只支持较老的加密算法(如 ssh-rsa 或 ssh-dss),而本地客户端由于安全原因默认禁…...
LVGL4种输入设备详解(触摸、键盘、实体按键、编码器)
lvgl有触摸、键盘、实体按键、编码器四种输入设备 先来分析一下这四种输入设备有什么区别 (1)LV_INDEV_TYPE_POINTER 主要用于触摸屏 用到哪个输入设备保留哪个其他的也是,保留触摸屏输入的任务注册,其它几种种输入任务的注册&…...
VirtualBox中Ubuntu 22.04网卡配置以及解决过程中遇到的问题
1.添加网卡(仅主机) 2.启动虚拟机,查看新添加网卡信息 #查看网卡 ip addr # 查看网络信息,发现新网卡(enp0s8)未分配 ifconfig -a3.使用netplan进行网络配置 3.1 配置 DHCP获取IP # 进入netplan 文件夹 cd /etc/netplan #查看文件夹下yaml ls -al # 编…...
【Vue】在Vue3中使用Echarts的示例 两种方法
文章目录 方法一template渲染部分js部分方法一实现效果 方法二template部分js or ts部分方法二实现效果 贴个地址~ Apache ECharts官网地址 Apache ECharts示例地址 官网有的时候示例显示不出来,属于正常现象,多进几次就行 开始使用前,记得先…...
【在线优化】【有源程序】基于遗传算法(GA)和粒子群优化(PSO)算法的MPPT控制策略
目录 一、背景 二、源程序及结果 2.1 simulink仿真程序 2.2 GA模块源程序 2.3 PSO模块源程序 三、程序运行结果 3.1 基于GA优化的MPPT 3.2 基于PSO优化的MPPT 一、背景 MPPT策略能够显著提高光伏、风电等发电效率,节省大量成本。该策略的经典算法是…...
Excel大数据量导入导出
github源码 地址(更详细) : https://github.com/alibaba/easyexcel 文档:读Excel(文档已经迁移) B 站视频 : https://www.bilibili.com/video/BV1Ff4y1U7Qc 一、JAVA解析EXCEL工具EasyExcel Java解析、生成Excel比较…...
Blocked aria-hidden on an element because its descendant retained focus.
在使用el-popover和el-radio-group实现弹窗选择数据后调用el-popover的doClose()方法时一直报错! 经过分析发现el-popover及el-radio__original有aria-hidden属性,具体aria-hidden属性应用自行搜索了解。既然是这个玩意引起的,则在显示时将a…...
MIT开源7B推理模型Satori:用行动思维链进行强化学习,增强自回归搜索
自OpenAI的o1发布以来,研究社区为提升开源LLM的高级推理能力做出了诸多努力,包括使用强大的教师模型进行蒸馏、蒙特卡洛树搜索(MCTS)以及基于奖励模型的引导搜索等方法。 本研究旨在探索一个新的研究方向:使LLM具备自回…...
神经网络|(九)概率论基础知识-泊松分布及python仿真
【1】引言 在前序学习进程中,我们已经知晓二项分布是多重伯努利分布,二伯努利分布对应的是可以无限重复、结果只有两种可能的随机试验。 相关文章链接为: 神经网络|(八)概率论基础知识-二项分布及python仿真-CSDN博客 上述文章还调用nump…...
机器学习 —— 深入剖析线性回归模型
一、线性回归模型简介 线性回归是机器学习中最为基础的模型之一,主要用于解决回归问题,即预测一个连续的数值。其核心思想是构建线性方程,描述自变量(特征)和因变量(目标值)之间的关系。简单来…...
vs封装dll 给C#使用
一,vs创建控制台应用 创建控制台应用得好处时,我们可以自己测试接口,如果接口没有问题,改成dll重新编译一遍就可以。 二, 创建一个c 类,将所需提供得功能 封装到类中。 这样可以将 所有功能,进…...
V8 引擎:深入理解 JavaScript 的执行环境
🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…...
JDK 9新特性学习大纲
第1部分:引言与背景 第1章:JDK 9的诞生与目标 1.1 JDK 9的核心目标与设计哲学 1.2 JDK 9的重要更新概览 1.3 兼容性与升级策略 第2部分:模块化系统(Project Jigsaw) 第2章:模块化基础 2.1 模块化的背景…...
DeepSeek从入门到精通:全面掌握AI大模型的核心能力
文章目录 一、DeepSeek是什么?性能对齐OpenAI-o1正式版 二、Deepseek可以做什么?能力图谱文本生成自然语言理解与分析编程与代码相关常规绘图 三、如何使用DeepSeek?四、DeepSeek从入门到精通推理模型推理大模型非推理大模型 快思慢想&#x…...
MySQL数据库(七)SQL 优化
目录 一 插入数据 1 批量插入 2 手动提交事务 3 主键顺序插入 4* 使用load插入指令数据 二 主键优化 1 数据组织方式 2 页分裂 编辑3 页合并 4* 主键设计原则 三 order by 优化 四 group by 优化 五 limit 优化 六 count优化 七 update优化 一…...
Oracle数据连接 Dblink
拓展: oracle远程登陆数据库 1.oracle客户端或者服务端 2.修改你的电脑如下路径文件(服务器IP,服务器的数据库名,服务器的数据库端口号) c:\oracle\product\10.2.0\db_1\NETWORK\ADMIN\tnsnames.ora orcl_109 (DESCRIPTION …...
基于 Nginx 的 CDN 基础实现
概览 本文是对基于Nginx的CDN网络的学习笔记,阅读的代码为:https://github.com/leandromoreira/cdn-up-and-running 其中,先确定CDN中的一些基础概念: Balancer:负载均衡,即请求数据的流量最开始打到Bal…...
网络编程基础1
七层协议模型和四层协议模型 七层协议模型:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层 四层协议模型:链路层、网络层、传输层、应用层 TCP通信流程 服务器端 (1)创建socket(socket) (2)绑定自己的IP(bind) (3)监听客户端连接(liste…...
Web3 跨链技术:构建互联互通的虚拟世界
随着区块链技术的蓬勃发展,我们正站在 Web3 时代的门槛上。Web3 不仅仅是技术的革新,它更是一场关于数据所有权和互联网自由的革命。然而,区块链技术的一个核心挑战是如何打破不同链之间的壁垒,实现信息和资源的自由流动。跨链技术…...
【专题】2025年我国机器人产业发展形势展望:人形机器人量产及商业化关键挑战报告汇总PDF洞察(附原数据表)
原文链接:https://tecdat.cn/?p39668 机器人已广泛融入我们生活的方方面面。在工业领域,它们宛如不知疲倦的工匠,精准地完成打磨、焊接等精细工作,极大提升了生产效率和产品质量;在日常生活里,它们是贴心…...
FPGA VGA timing
概念 VGA(Video Graphics Array)时序是控制VGA接口显示图像的关键参数,它主要包括行时序和场时序两部分。以下是对VGA时序的详细解释: 一、VGA接口简介 VGA接口是IBM公司在1987年推出的一种使用模拟信号的视频传输标准,具有成本低、结构简单、应用灵活等优点,至今仍被广…...
[7] 游戏机项目说明
[7] 游戏机项目说明 在这节课中,我们将学习如何基于FreeRTOS开发一个简单的游戏项目。我们会使用一个开源项目nwatch,它是一个基于STM32的开源手表,包含了三个游戏。我们的目标是将这个游戏移植到我们的开发板上,并逐步使用FreeR…...
UE学习日志#25、26 C++笔记#11 智能指针
注:本篇内容主要为《C20高级编程》的学习笔记 当智能指针离开作用域或被重置时,会自动释放所占用的资源。智能指针可用于管理在函数作用域内(或作为类的数据成员)动态分配的资源。也可以通过函数实参来传递动态分配的资源的所有权…...
Spring AI -使用Spring快速开发ChatGPT应用
前言 Spring在Java生态中一直占据大半江山。最近我发现Spring社区推出了一个Spring AI项目,目前该项目还属于Spring实验性项目,但是我们可以通过该项目,可以非常快速的开发出GPT对话应用。 本篇文章将会对SpringAI进行简单的介绍和使用&#…...
windows通过网络向Ubuntu发送文件/目录
由于最近要使用树莓派进行一些代码练习,但是好多东西都在windows里或虚拟机上,就想将文件传输到树莓派上,但试了发现u盘不能简单传送,就在网络上找到了通过windows 的scp命令传送 前提是树莓派先开启ssh服务,且Window…...
大语言模型需要的可观测性数据的关联方式
可观测性数据的关联方式及其优缺点 随着现代分布式架构和微服务的普及,可观测性(Observability)已经成为确保系统健康、排查故障、优化性能的重要组成部分。有效的可观测性数据关联方式不仅能够帮助我们实时监控系统的运行状态,还…...
python连点器
要实现一个用于抖音点赞的鼠标连点工具,可以通过编程或现有软件实现。以下是两种常见方法(但请注意:频繁自动化操作可能违反平台规则,需谨慎使用): 方法 1:使用现成工具(如 AutoClic…...
Nginx部署Umi React前端项目标准配置
文章目录 概要前端Umi项目配置文件请求后端Api打包 后端项目Nginx配置配置文件 错误信息 概要 使用UmiJs开发的前端项目打包部署在Nginx,主要是Umi中项目的配置和Nginx的配置 前端Umi项目 基于"umijs/max": "^4.3.24", "react": &…...
Ubuntu20.4软件应用打不开
安装 snap-store: 确保 Snap 已安装: Snap 是一个包管理系统,需要先确保 snapd 已经安装。如果系统中没有安装,可以通过以下命令来安装 Snap: sudo apt update sudo apt install snapd安装 snap-store: 使…...
如何在Vscode中接入Deepseek
一、获取Deepseek APIKEY 首先,登录Deepseek官网的开放平台:DeepSeek 选择API开放平台,然后登录Deepseek后台。 点击左侧菜单栏“API keys”,并创建API key。 需要注意的是,生成API key复制保存到本地,丢失…...
apisix的real-ip插件使用说明
k8s集群入口一般都需要过负载均衡,然后再到apisix。 这时候如果后台业务需要获取客户端ip,可能拿到的是lb或者网关的内网ip。 这里一般要获取真实ip需要做几个处理。 1. 负载均衡上,一般支持配置获取真实ip参数,需要配置上。然…...
基于 Ollama+Docker+OpenWebUI 的本地化部署deepseek流程
搭建deepseek 安装Ollama Ollama官方下载地址 下载完成后双击打开Ollama进行安装,点击install 安装完成后系统会弹出下图提示代表安装成功并且已启动 验证安装 ollama -v安装完成后,cmd 打开命令行窗口,输入 “ollama -v” 测试,显示 olla…...
打家劫舍3
今天和打家讲一下打家劫舍3 题目: 题目链接:337. 打家劫舍 III - 力扣(LeetCode) 小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为root。 除了 root 之外,每栋房子有且只有一个“父“…...