【ETCD】[源码阅读]深度解析 EtcdServer 的 processInternalRaftRequestOnce 方法
在分布式系统中,etcd 的一致性与高效性得益于其强大的 Raft 协议模块。而 processInternalRaftRequestOnce
是 etcd 服务器处理内部 Raft 请求的核心方法之一。本文将从源码角度解析这个方法的逻辑流程,帮助读者更好地理解 etcd 的内部实现。
方法源码
func (s *EtcdServer) processInternalRaftRequestOnce(ctx context.Context, r pb.InternalRaftRequest) (*applyResult, error) {ai := s.getAppliedIndex()ci := s.getCommittedIndex()if ci > ai+maxGapBetweenApplyAndCommitIndex {return nil, ErrTooManyRequests}r.Header = &pb.RequestHeader{ID: s.reqIDGen.Next(),}// check authinfo if it is not InternalAuthenticateRequestif r.Authenticate == nil {authInfo, err := s.AuthInfoFromCtx(ctx)if err != nil {return nil, err}if authInfo != nil {r.Header.Username = authInfo.Usernamer.Header.AuthRevision = authInfo.Revision}}data, err := r.Marshal()if err != nil {return nil, err}if len(data) > int(s.Cfg.MaxRequestBytes) {return nil, ErrRequestTooLarge}id := r.IDif id == 0 {id = r.Header.ID}ch := s.w.Register(id)cctx, cancel := context.WithTimeout(ctx, s.Cfg.ReqTimeout())defer cancel()start := time.Now()err = s.r.Propose(cctx, data)if err != nil {proposalsFailed.Inc()s.w.Trigger(id, nil) // GC waitreturn nil, err}proposalsPending.Inc()defer proposalsPending.Dec()select {case x := <-ch:return x.(*applyResult), nilcase <-cctx.Done():proposalsFailed.Inc()s.w.Trigger(id, nil) // GC waitreturn nil, s.parseProposeCtxErr(cctx.Err(), start)case <-s.done:return nil, ErrStopped}
}
方法解析
1. 校验状态与索引
ai := s.getAppliedIndex()
ci := s.getCommittedIndex()
if ci > ai+maxGapBetweenApplyAndCommitIndex {return nil, ErrTooManyRequests
}
getAppliedIndex
和 getCommittedIndex
分别获取当前节点的已应用索引和已提交索引。如果两者的差值过大,说明节点存在过多未应用的日志条目,可能导致性能问题,因此直接返回错误。
maxGapBetweenApplyAndCommitIndex
:定义了允许的最大索引差距。- 防止机制:避免提交速度过快导致内存积压。
2. 生成请求头
r.Header = &pb.RequestHeader{ID: s.reqIDGen.Next(),
}
每个请求分配一个唯一的 ID
,以便后续跟踪和处理。
3. 身份验证检查
if r.Authenticate == nil {authInfo, err := s.AuthInfoFromCtx(ctx)if err != nil {return nil, err}if authInfo != nil {r.Header.Username = authInfo.Usernamer.Header.AuthRevision = authInfo.Revision}
}
- 目的:除认证请求外,其他请求需要验证用户身份。
- 逻辑:
- 调用
AuthInfoFromCtx
从上下文中提取用户身份。 - 将身份信息写入请求头,供后续处理。
- 调用
4. 请求大小检查
if len(data) > int(s.Cfg.MaxRequestBytes) {return nil, ErrRequestTooLarge
}
- 目的:防止超大请求导致内存或网络问题。
- 机制:检查请求序列化后的大小是否超过配置的最大限制。
5. 注册请求等待通道
id := r.ID
if id == 0 {id = r.Header.ID
}
ch := s.w.Register(id)
- 注册通道:使用请求
ID
在s.w
(wait 组件)中注册一个等待通道,用于异步获取结果。
6. 发起 Raft 提案
cctx, cancel := context.WithTimeout(ctx, s.Cfg.ReqTimeout())
defer cancel()start := time.Now()
err = s.r.Propose(cctx, data)
- 发起提案:调用
s.r.Propose
将请求数据交给 Raft 模块进行分布式一致性处理。 - 超时控制:通过
Context.WithTimeout
设置提案的最大执行时间,避免长期阻塞。 - 错误处理:如果提案失败,增加失败计数,并触发通道清理。
7. 等待提案结果
select {
case x := <-ch:return x.(*applyResult), nil
case <-cctx.Done():proposalsFailed.Inc()s.w.Trigger(id, nil) // GC waitreturn nil, s.parseProposeCtxErr(cctx.Err(), start)
case <-s.done:return nil, ErrStopped
}
- 等待逻辑:
- 通道
ch
:正常返回应用结果。 - 上下文超时:处理超时错误,并清理等待通道。
- 服务关闭:直接返回停止错误。
- 通道
- 触发机制:使用
Trigger
清理通道,避免资源泄露。
8. 性能指标统计
proposalsPending.Inc()
:增加当前挂起的提案计数。proposalsFailed.Inc()
:统计失败提案次数。
关键逻辑总结
processInternalRaftRequestOnce
方法的核心逻辑可分为以下几个阶段:
- 预检查:检查索引状态、请求大小和用户认证。
- 请求处理:序列化请求并将其提交到 Raft 模块。
- 结果等待:通过通道或超时控制获取提案的处理结果。
流程图
zz总结
processInternalRaftRequestOnce
是 etcd 服务端处理内部 Raft 请求的重要方法,它结合了请求校验、身份认证、Raft 提案以及结果返回的完整逻辑链条。理解其实现,可以帮助我们深入掌握 etcd 的核心一致性协议和服务端处理流程。
相关文章:
【ETCD】[源码阅读]深度解析 EtcdServer 的 processInternalRaftRequestOnce 方法
在分布式系统中,etcd 的一致性与高效性得益于其强大的 Raft 协议模块。而 processInternalRaftRequestOnce 是 etcd 服务器处理内部 Raft 请求的核心方法之一。本文将从源码角度解析这个方法的逻辑流程,帮助读者更好地理解 etcd 的内部实现。 方法源码 …...
数据分析与机器学习全解析
一、数据分析基础要点 (一)数据收集 确定数据源:明确是内部数据库、外部公开数据、传感器采集还是用户调研等来源,不同来源数据质量与获取难度各异。例如内部销售数据可直接获取,而市场调研数据需设计问卷并投入人力收…...
Qt 一个简单的QChart 绘图
Qt 一个简单的QChart 绘图 先上程序运行结果图: “sample9_1QChart.h” 文件代码如下: #pragma once#include <QtWidgets/QMainWindow> #include "ui_sample9_1QChart.h"#include <QtCharts> //必须这么设置 QT_CHARTS_USE_NAME…...
力扣——322. 零钱兑换
给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。 你可以认为每种硬币的数量是无限的。 示…...
Qt之网络监测
在Qt中,网络监测通常涉及到检测网络连接状态、网络延迟、带宽使用情况等。Qt提供了一些类和模块来帮助开发者实现这些功能。以下是一些常用的方法和类: 1. 检测网络连接状态 QtNetwork模块中的QNetworkConfigurationManager类可以用来检测设备的网络连…...
抓包软件fiddler和wireshark使用手册
fiddler官方文档 Fiddler 抓包教程1 Fiddler 抓包教程2 wireshark抓包学习 2添加链接描述 ip 过滤 ip.src_host ip.dst_host ip.addr mac 过滤 eth.src eth.dst eth.addr 端口过滤 tcp.port tcp.srcport tcp.dstport 协议类型过滤 arp dhcp 规则组合 and or...
【从零开始入门unity游戏开发之——C#篇03】变量和常量
文章目录 一、变量1、什么是变量?2、申明变量的固定写法3、变量的类型值和引用类型的区别无符号和有符号位——表示变量所占用的内存空间的大小范围——表示变量的取值范围取值范围和存储单位的关系为什么byte的范围是 0 到 255?为什么 sbyte 的范围是 -…...
SpringBoot 手动实现动态切换数据源 DynamicSource (上)
大家好,我是此林。 在实际开发中,经常可能遇到在一个SpringBoot Web应用中需要访问多个数据源的情况。 下面来介绍一下多数据源的使用场景、底层原理和手动实现。 一、 多数据源经典使用场景 场景一:业务复杂,数据量过大 1. 业务…...
ERROR Error: command failed: yarnError: command failed: yarn
1、异常信息 2、解决 解决方法一: WinR进入命令行,重新安装npm(如果报镜像源问题建议镜像源也重新配置) 输入命令,重新安装npm/yarn #npm npm install#npm 配置镜像源 npm config set registry https://registry.npmmirror.com#npm 查看镜…...
【java】finalize方法
目录 1. 说明2. 调用过程3. 注意事项 1. 说明 1.finalize方法是Java中Object类的一个方法。2.finalize方法用于在对象被垃圾回收之前执行一些清理工作。3.当JVM(Java虚拟机)确定一个对象不再被引用、即将被回收时,会调用该对象的finalize方法…...
C++ 内存管理和模板与STL
此篇目是之后各种C库的基础 目录 内存管理 内存分布 内存管理方式 new和delete operator new 与 operator delete函数 实现原理 定位new表达式(placement-new) 模板基础 泛型编程 模板 函数模板 类模板 STL 组成部分 内存管理 内存分布 int globalVar 1; //全局变量 静…...
同一个局域网下的两台电脑实现定时或者实时拷贝数据
【亲测能用】 需求:从数据库服务器上将数据库备份文件*.bak,每天定时拷贝到局域网下另一台电脑上,实现异机备份。 本文中192.168.1.110是本机,192.168.1.130是异机(备份机)。需求是每天定时从192.168.1.1…...
Python毕业设计选题:基于django+vue的汽车租赁管理网站
开发语言:Python框架:djangoPython版本:python3.7.7数据库:mysql 5.7数据库工具:Navicat11开发软件:PyCharm 系统展示 用户管理 汽车品牌管理 汽车信息管理 汽车租赁管理 汽车商品信息管理 汽车租赁 购物…...
scrapy对接rabbitmq的时候使用post请求
之前做分布式爬虫的时候,都是从push url来拿到爬虫消费的链接,这里提出一个问题,假如这个请求是post请求的呢,我观察了scrapy-redis的源码,其中spider.py的代码是这样写的 1.scrapy-redis源码分析 def make_request_from_data(self, data):"""Returns a Reques…...
Netty 性能优化与调试指南
Netty 是一款高性能的网络通信框架,其高性能得益于良好的设计和优化。但是在实际使用中,如果配置或实现不当,可能会导致性能下降或调试困难。本文将从性能优化和调试两方面入手,详细讲解如何在使用 Netty 时提高应用性能和诊断问题…...
网络安全产品之认识WEB应用防火墙
随着B/S架构的广泛应用,Web应用的功能越来越丰富,蕴含着越来越有价值的信息,应用程序漏洞被恶意利用的可能性越来越大,因此成为了黑客主要的攻击目标。传统防火墙无法解析HTTP应用层的细节,对规则的过滤过于死板&#…...
R学习——因子
目录 1 定义因子(factor函数) 2因子的作用 一个数据集中的 只需要考虑可以用哪个数据来进行分类就可以了,可以用来分类就可以作为因子。 Cy1这个因子对应的水平level是4 6 8: 1 定义因子(factor函数) 要…...
2024 亚马逊云科技re:Invent:Werner Vogels架构哲学,大道至简 六大经验助力架构优化
在2024亚马逊云科技re:Invent全球大会第四天的主题演讲中,亚马逊副总裁兼CTO Dr.Werner Vogels分享了 The Way of Simplexity,繁简之道,浓缩了Werner在亚马逊20年构建架构的经验。 Werner表示,复杂性总是会“悄无声息”地渗透进来…...
【代码随想录day58】【C++复健】 117. 软件构建(拓扑排序);47. 参加科学大会(dijkstra(朴素版)精讲)
117. 软件构建(拓扑排序) 继续边看解析边做题,思考时的问题做个如下的总结: 1. 存边用什么数据结构? 在题目中,我们需要存储节点之间的依赖关系(边信息)。选择适合的数据结构非常重…...
单目深度估计模型 lite-mono 测试
lite-mono 使用工业数据集kitti 进行训练,目的使用单目摄像头实现物体深度预测,关于kitti数据集的介绍和下载参考 (二)一文带你了解KITTI数据集-CSDN博客文章浏览阅读2.7w次,点赞64次,收藏294次。文章介绍…...
JAVA基础学习笔记_网络编程
文章目录 网络编程网络编程三要素IPIPv4细节InetAddress 端口号协议 UDPUDP协议(发数据)UDP协议(接受数据)UDP聊天室单播,组播,广播 TCP中文乱码问题代码细节,三次握手和四次挥手 网络编程 计算机之间通过网络进行数据传输 软件结构 C/S,Client/Server,客户端服务器,精美但麻…...
说下JVM中一次完整的GC流程?
大家好,我是锋哥。今天分享关于【说下JVM中一次完整的GC流程?】面试题。希望对大家有帮助; 说下JVM中一次完整的GC流程? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在JVM中,垃圾回收(GC&am…...
鸿蒙NEXT开发案例:保质期计算
【引言】 保质期计算应用是一个基于鸿蒙NEXT框架开发的数字和文本统计组件。用户可以输入商品的生产日期和保质期天数,应用会自动计算并展示相关信息,包括保质状态、剩余天数、生产日期和到期日期。 【环境准备】 • 操作系统:Windows 10 …...
LLM并发加速部署方案(llama.cpp、vllm、lightLLM、fastLLM)
大模型并发加速部署 解析当前应用较广的几种并发加速部署方案! llama.cpp、vllm、lightllm、fastllm四种框架的对比: llama.cpp:基于C,①请求槽,②动态批处理,③CPU/GPU混合推理vllm:基于Pyth…...
用最小的代价解决mybatis-plus关于批量保存的性能问题
1.问题说明 问题背景说明,在使用达梦数据库时,mybatis-plus的serviceImpl.saveBatch()方法或者updateBatchById()方法的时候,随着数据量、属性字段的增加,效率越发明显的慢。 serviceImpl.saveBatch(); serviceImpl.updateBatch…...
蓝桥杯历届真题 --#递推 翻硬币(C++)
文章目录 思路完整代码结语 原题链接 思路 通过观察测试用例,我们猜测,从左到右依次对比每一个位置上的状态,如果不一样我们就翻一次,最终得到的答案即为正解。 完整代码 //这里是引入了一些常用的头文件,和一些常规操作 //第一…...
BurpSuite-8(FakeIP与爬虫审计)
声明:学习视频来自b站up主 泷羽sec,如涉及侵权马上删除文章 感谢泷羽sec 团队的教学 视频地址:IP伪造和爬虫审计_哔哩哔哩_bilibili 一、FakeIP 1.配置环境 BurpSuite是java环境下编写的,而今天的插件是python编写的,…...
JAVA8、Steam、list运用合集
Steam运用 Java Stream API为开发人员提供了一种函数式和声明式的方式来表达复杂的数据转换和操作,使代码更加简洁和富有表现力。 1、使用原始流以获得更好的性能【示例:求和】 使用 int、long 和 double 等基本类型时,请使用IntStream、LongStream 和 DoubleStream 等基本流…...
深入详解人工智能机器学习:强化学习
目录 强化学习概述 强化学习的基本概念 定义 关键组件 强化学习过程 常用算法 应用示例 示例代码 代码解释 应用场景 强化学习核心概念和底层原理 核心概念 底层原理 总结 强化学习概述 强化学习(Reinforcement Learning, RL)是机器学习中的…...
docker的简单使用
文章目录 docker简介docker架构镜像和容器镜像有关的常用命令容器相关常用命令 docker简介 Docker是一个开源的应用容器引擎,基于Go语言并遵从Apache2.0协议开源。 Docker可以让开方子打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到…...
启动的docker容器里默认运行dockerd
问题 已在Dockerfile里yum install docker 但docker run 启动容器后, docker ps等命令无法执行 ps -aux 没有dockerd 进程 临时解决 另开一个终端 docker exec -it 容器名 bash 手动启 dockerd 默认启动 分析 现在启动容器的默认命令是 /sbin/init sbin/init 是根文件系统…...
Python爬虫技术的最新发展
在互联网的海洋中,数据就像是一颗颗珍珠,而爬虫技术就是我们手中的潜水艇。2024年,爬虫技术有了哪些新花样?让我们一起潜入这个话题,看看最新的发展和趋势。 1. 异步爬虫:速度与激情 随着现代Web应用的复…...
什么是厄尔米特(Hermitian)矩阵?
厄米矩阵(Hermitian Matrix)定义 在数学和物理中,厄米矩阵是满足以下条件的复方阵: A A † \mathbf{A}\mathbf{A}^\dagger AA† 其中, A † \mathbf{A}^\dagger A†表示矩阵 A \mathbf{A} A的共轭转置,即…...
从零开始:Linux 环境下的 C/C++ 编译教程
个人主页:chian-ocean 文章专栏 前言: GCC(GNU Compiler Collection)是一个功能强大的编译器集合,支持多种语言,包括 C 和 C。其中 gcc 用于 C 语言编译,g 专用于 C 编译。 Linux GCC or G的安…...
Excel + Notepad + CMD 命令行批量修改文件名
注意:该方式为直接修改原文件的文件名,不会生成新文件 新建Excel文件 A列:固定为 renB列:原文件名称C列:修改后保存的名称B列、C列,需要带文件后缀,为txt文件就是.txt结尾,为png图片…...
1.1 android:监听并处理返回事件
在Android开发过程中,默认执行返回事件是结束当前界面,返回上一个界面,没有任何提示,但用户可能会误操作,这时出现一个提示界面对用户较为友好,接下来,让我们探究返回事件的处理。 一、onBackP…...
解决Ubuntu关机主板不断电的问题(其它使用GRUB的Linux发行版大概率也可用)
前言: 在某些主板上,Ubuntu20.04系统关机并不会连带主板一起断电。 猜测可能是主板太老了。无法识别较新的系统的关机信号,导致无法断电。连带着一些电脑周边设备也不会断电导致状态无法重置,后续会出现一些问题。 目标…...
【CTF-Web】文件上传漏洞学习笔记(ctfshow题目)
文件上传 文章目录 文件上传 What is Upload-File?Upload-File In CTF Web151 考点:前端校验解题: Web152 考点:后端校验要严密解题: Web153 考点:后端校验 配置文件介绍解题: Web154 考点&am…...
无法正常启动此程序,因为计算机丢失wlanapi.dll
wlanapi.dll丢失怎么办?有没有什么靠谱的修复wlanapi.dll方法_无法启动此程序,因为计算机中丢失wlanapi.dll-CSDN博客 wlanapi.dll是 Windows 操作系统中的一个动态链接库文件,主要与 Windows 无线 LAN (WLAN) API 相关。该DLL提供了许多必要的函数&…...
C++ webrtc开发(非原生开发,linux上使用libdatachannel库)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、libdatachannel库的下载和build二、开始使用 1.2.引入库3.开始使用 总结 前言 使用c开发webrtc在互联网上留下的资料甚少,经过我一段时间的探…...
vue-router路由传参的两种方式(params 和 query )
一、vue-router路由传参问题 1、概念: A、vue 路由传参的使用场景一般应用在父路由跳转到子路由时,携带参数跳转。 B、传参方式可划分为 params 传参和 query 传参; C、而 params 传参又可分为在 url 中显示参数和不显示参数两种方式&#x…...
VBA高级应用30例应用在Excel中的ListObject对象:向表中添加注释
《VBA高级应用30例》(版权10178985),是我推出的第十套教程,教程是专门针对高级学员在学习VBA过程中提高路途上的案例展开,这套教程案例与理论结合,紧贴“实战”,并做“战术总结”,以…...
github操作学习笔记(杂乱版)
git开源的分布式版本控制系统: 每次修改文件提交后,都会自动创建一个项目版本 查看git版本看有没有安装成功:git --version 把默认编辑器设置成vim:git config --global core.editor "vim" 1、设置昵称和邮箱ÿ…...
TaskBuilder SQL执行工具
为了方便开发者连接当前任擎服务器上配置的各个数据源对应的数据库进行相关操作,TaskBuilder提供了一个SQL执行工具,点击系统侧边栏里的执行SQL图标 ,即可打开该工具,界面如下图所示: 该工具从上至下分为三个区域&a…...
快速掌握Quartz.Net计划任务调度框架,轻松实现定时任务
前言 Quartz.Net是一个开源的作业调度框架,可以用于管理计划任务和定期执行。Quartz.Net提供了丰富的作业计划选项,例如精确或模糊时间表达式、日期和时间限制等。Quartz.Net采用分布式架构,允许在多个计算机上运行任务。 Quartz.Net架构设…...
Linux ufw命令丨Linux网络防火墙ufw命令详解
ufw(Uncomplicated Firewall)是Ubuntu系统上默认的防火墙组件,它为轻量化配置iptables而开发,提供了一个非常友好的界面用于创建基于IPv4和IPv6的防火墙规则 ufw在Ubuntu 8.04 LTS后的所有发行版中默认可用,它通过命令…...
shell编程(完结)
shell编程(完结) 声明! 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章 笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其…...
深入了解Text2SQL开源项目(Chat2DB、SQL Chat 、Wren AI 、Vanna)
深入了解Text2SQL开源项目(Chat2DB、SQL Chat 、Wren AI 、Vanna) 前言1.Chat2DB2.SQL Chat3.Wren AI4.Vanna 前言 在数据驱动决策的时代,将自然语言查询转化为结构化查询语言(SQL)的能力变得日益重要。无论是小型创业…...
【Linux】报错:cannot create directory ‘test’: Read-only file system
1 报错 ❤️在使用mkdir test命令创建文件夹的时候,报错如下: mkdir:cannot create directory ‘test’:Read-only file system 2 解决方法 mount -o remount,rw / 🦋上述命令在Linux系统中用于重新挂载(root)文件系统,并将其从只读模式切换到读写模式。 ■ 下面是对…...
python mat是什么文件
.mat就是matlab的文件格式,一般用于matlab和python间的数据传输,python中numpy和scipy提供了一些函数,可以很好的对.mat文件的数据进行读写和处理。 在python中可以使用scipy.io中的函数loadmat()读取mat文件,函数savemat保存文…...