基于Raft分布式Kv存储:RPC
在这个项目里RPC 可以理解为整个分布式 KV 系统的“远程通信层”。它负责让不同进程、不同端口上的对象能够互相调用方法。RPC 本身不实现 Raft 算法也不存储 KV 数据它负责把请求送过去、调用正确的方法再把结果送回来。一、项目中有两类 RPC客户端 Clerk │ Get / Put / Append ▼ KVServer │ RequestVote / AppendEntries / InstallSnapshot ▼ 其他 Raft 节点对应两份.proto通信双方RPC 服务方法Clerk → KVServerkvServerRpcGet、PutAppendRaft → RaftraftRpcRequestVote、AppendEntries、InstallSnapshot1. Clerk 与 KVServer 之间的 RPC接口定义在 [kvServerRPC.proto (line 43)](C:/Users/LENOVO/Desktop/KVstorageBaseRaft-cpp-main/src/raftRpcPro/kvServerRPC.proto:43)service kvServerRpc { rpc PutAppend(PutAppendArgs) returns(PutAppendReply); rpc Get(GetArgs) returns(GetReply); }它负责把用户的 KV 操作发送给远程服务器。GetRPC客户端请求message GetArgs { bytes Key 1; bytes ClientId 2; int32 RequestId 3; }作用分别是Key要查询的键。ClientId客户端唯一标识。RequestId该客户端的请求序号用于重试和去重。bool ok m_servers[server]-Get(args, reply);这个调用看起来像普通 C 函数但m_servers[server]代表远程服务器实际会经过网络发送。PutAppendRPC客户端可以发起两种修改Put(key, value); Append(key, value);最终都被转换成PutAppend(key, value, Put); PutAppend(key, value, Append);请求中包含message PutAppendArgs { bytes Key 1; bytes Value 2; bytes Op 3; bytes ClientId 4; int32 RequestId 5; }ClientId RequestId很重要。因为 RPC 可能超时客户端可能重发同一个请求。如果没有请求编号一个Append请求重试两次就可能真的追加两次。RPC 负责传递编号KVServer 负责判断是否重复执行。2. RPC 帮助客户端寻找 LeaderClerk 一开始不一定知道哪个服务器是 Leader。在 [clerk.cpp (line 21)](C:/Users/LENOVO/Desktop/KVstorageBaseRaft-cpp-main/src/raftClerk/clerk.cpp:21) 中它会循环请求服务器bool ok m_servers[server]-Get(args, reply); if (!ok || reply.err() ErrWrongLeader) { server (server 1) % m_servers.size(); continue; }这里有两种失败!okRPC 通信失败例如连接失败、服务器宕机。ErrWrongLeader网络通信成功但请求发给了 Follower。这两种失败不能混为一谈。ok true只表示请求成功发出并成功收到了可解析的响应不表示业务操作一定成功。Clerk 会继续尝试其他服务器找到 Leader 后缓存其编号到m_recentLeaderId下次优先联系它。3. KV 请求最终会进入 RaftKVServer 收到PutAppendRPC 后不会直接修改本地数据库。Op op; op.Operation args-op(); op.Key args-key(); op.Value args-value(); op.ClientId args-clientid(); op.RequestId args-requestid(); m_raftNode-Start(op, raftIndex, term, isLeader);执行过程是Clerk 发起 Put RPC ↓ Leader KVServer 收到请求 ↓ 把请求转换成 Op ↓ Raft::Start() 写入 Leader 日志 ↓ 通过 AppendEntries RPC 复制到其他节点 ↓ 多数节点复制成功 ↓ 日志提交并发送到 applyCh ↓ KVServer 执行 Put ↓ 通过 RPC 向 Clerk 返回成功所以客户端 RPC 和 Raft RPC 是串联起来的。读取也经过共识顺序有助于提供线性一致性读取。二、Raft 节点之间的 RPCservice raftRpc { rpc AppendEntries(AppendEntriesArgs) returns(AppendEntriesReply); rpc InstallSnapshot(InstallSnapshotRequest) returns(InstallSnapshotResponse); rpc RequestVote(RequestVoteArgs) returns(RequestVoteReply); }这三个 RPC 基本覆盖了 Raft 节点间的全部通信。1.RequestVote选举 Leader当 Follower 长时间没有收到 Leader 心跳就会Follower ↓ 选举超时 Candidate ↓ currentTerm 向所有其他节点发送 RequestVote RPC请求携带Term CandidateId LastLogIndex LastLogTerm接收节点检查Candidate 的任期是否足够新。当前任期是否已经投票。Candidate 的日志是否至少和自己一样新。响应包含Term VoteGranted候选人获得超过半数的票后成为 Leader。没有RequestVoteRPC各节点就无法跨进程完成投票和 Leader 选举。2.AppendEntries心跳和日志复制这是项目里使用最频繁的 Raft RPC作用有两个。作为心跳Leader 周期性发送没有日志的AppendEntriesEntries 空它告诉 FollowerLeader 还活着不要发起新选举。Follower 收到合法心跳后会重置选举定时器。作为日志复制客户端提交命令后Leader 把日志通过AppendEntries发给 FollowerTerm LeaderId PrevLogIndex PrevLogTerm Entries LeaderCommitFollower 检查上一条日志是否匹配本地 PrevLogIndex 位置的 term 请求中的 PrevLogTerm匹配则追加日志不匹配则返回失败。Leader 根据返回结果更新m_nextIndex[server] m_matchIndex[server]如果复制失败Leader 会调整nextIndex再次发送更早的日志。当一条日志被多数节点确认后Leader 推进commitIndex这条命令才真正提交。3.InstallSnapshot同步快照如果某个 Follower 落后太多Leader 需要的旧日志可能已经被压缩成快照。这时不能再用普通AppendEntries补日志而要发送InstallSnapshot RPC请求携带LeaderId Term LastSnapShotIncludeIndex LastSnapShotIncludeTerm Data其中Data是 KV 数据、客户端去重信息等序列化后的快照。Follower 收到后会安装快照数据。删除快照覆盖的旧日志。更新快照索引和任期。更新commitIndex、lastApplied。把快照交给上层 KVServer 恢复状态。它解决的是“落后节点快速追赶”的问题。三、底层 RPC 框架具体做了什么业务代码只需要写stub-AppendEntries(controller, args, response, nullptr);底层实际完成了很多工作。1. 定义统一消息格式message RpcHeader { bytes service_name 1; bytes method_name 2; uint32 args_size 3; }一次请求大致是Header长度 RpcHeader protobuf序列化后的请求参数例如service_name raftRpc method_name AppendEntries args_size 120 args AppendEntriesArgs的二进制数据2. 客户端序列化并发送从方法描述符获取服务名和方法名。序列化请求参数。构造 RPC 请求头。连接目标 IP 和端口。通过 TCP 发送数据。阻塞等待响应。将响应反序列化到reply。通过RpcController记录通信错误。3. 服务端注册和查找服务KVServer 启动时同时注册两个服务provider.NotifyService(this); provider.NotifyService(this-m_raftNode.get());也就是KvServer对象 → Get、PutAppend Raft对象 → RequestVote、AppendEntries、InstallSnapshotRpcProvider保存服务名、方法名、服务对象之间的映射。4. 服务端反序列化和方法分发解析 RpcHeader ↓ 得到 service_name ↓ 得到 method_name ↓ 找到注册的 Service 对象 ↓ 创建对应的 request 和 response ↓ 反序列化 request ↓ service-CallMethod(...)protobuf 生成的CallMethod再把请求分发到正确的重写方法。5. 把响应发回来业务函数填写response后执行done-Run();它会调用RpcProvider::SendRpcResponse(...)将响应序列化并通过 TCP 发送给调用者。四、RPC 不负责什么RPC 只是通信机制它不负责决定谁是 Leader。判断是否应该投票。检查日志是否匹配。决定日志何时提交。修改 KV 数据。处理重复客户端请求。制作或应用快照。这些分别由 Raft、KVServer 和 Clerk 的业务逻辑负责。最准确的划分是RPC把某个对象的方法调用跨网络送到另一个进程 Raft保证多个节点对命令顺序达成一致 KVServer执行命令并维护键值数据 Clerk发起请求、寻找 Leader、失败重试

相关新闻

AVRDUDESS终极指南:3步轻松搞定AVR单片机编程

AVRDUDESS终极指南:3步轻松搞定AVR单片机编程

AVRDUDESS终极指南:3步轻松搞定AVR单片机编程 【免费下载链接】AVRDUDESS A GUI for AVRDUDE 项目地址: https://gitcode.com/gh_mirrors/avr/AVRDUDESS AVRDUDESS是一款功能强大的AVR编程器图形界面工具,专为简化AVRDUDE命令行工具而设计。无论你…

2026/7/31 19:48:13 阅读更多 →
DeepChem:用AI解锁高分子材料科学的未来密码

DeepChem:用AI解锁高分子材料科学的未来密码

DeepChem:用AI解锁高分子材料科学的未来密码 【免费下载链接】deepchem Democratizing Deep-Learning for Drug Discovery, Quantum Chemistry, Materials Science and Biology 项目地址: https://gitcode.com/GitHub_Trending/de/deepchem DeepChem&#xf…

2026/7/31 19:48:13 阅读更多 →
本地智能办公工具 OpenClaw v2.7.9 分步部署教学 小白友好(含安装包)

本地智能办公工具 OpenClaw v2.7.9 分步部署教学 小白友好(含安装包)

OpenClaw 一键安装包|一键部署,告别复杂环境配置 适配系统:Windows10/11 64 位 当前版本:v2.7.9(虾壳云版) 核心优势:全程可视化操作,不用命令行、不用手动配置 Python/Node.js&…

2026/7/31 19:47:13 阅读更多 →

最新新闻

解锁Open English WordNet高级功能:JSON API调用与关系图谱分析

解锁Open English WordNet高级功能:JSON API调用与关系图谱分析

解锁Open English WordNet高级功能:JSON API调用与关系图谱分析 【免费下载链接】english-wordnet The Open English WordNet 项目地址: https://gitcode.com/gh_mirrors/en/english-wordnet Open English WordNet是一个强大的开源英语词网项目,提…

2026/7/31 20:32:27 阅读更多 →
OpenAI Codex Security与传统扫描工具对比:为什么它能成为开发者的安全利器

OpenAI Codex Security与传统扫描工具对比:为什么它能成为开发者的安全利器

OpenAI Codex Security与传统扫描工具对比:为什么它能成为开发者的安全利器 【免费下载链接】codex-security OpenAIs Codex Security CLI and TypeScript SDK for finding, validating, and fixing security vulnerabilities. npm: https://www.npmjs.com/package/…

2026/7/31 20:32:27 阅读更多 →
5个必备技巧:掌握猫抓资源嗅探工具的完整指南

5个必备技巧:掌握猫抓资源嗅探工具的完整指南

5个必备技巧:掌握猫抓资源嗅探工具的完整指南 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 你是否曾经面对心仪的视频教程却无法下载…

2026/7/31 20:32:27 阅读更多 →
【单片机毕设案例分享】基于单片机的管道水压异常声光报警装置 基于嵌入式技术的水压阈值自定义监测系统(015401)

【单片机毕设案例分享】基于单片机的管道水压异常声光报警装置 基于嵌入式技术的水压阈值自定义监测系统(015401)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于单片机,STM32单片机,51单片机,J…

2026/7/31 20:32:27 阅读更多 →
视频转PPT智能提取:3分钟让视频内容变幻灯片

视频转PPT智能提取:3分钟让视频内容变幻灯片

视频转PPT智能提取:3分钟让视频内容变幻灯片 【免费下载链接】extract-video-ppt extract the ppt in the video 项目地址: https://gitcode.com/gh_mirrors/ex/extract-video-ppt 还在为从视频中提取PPT而烦恼吗?extract-video-ppt这款开源工具能…

2026/7/31 20:32:27 阅读更多 →
MyBatis-Plus分组统计分页查询实战:LambdaQueryWrapper与聚合函数的高效结合

MyBatis-Plus分组统计分页查询实战:LambdaQueryWrapper与聚合函数的高效结合

1. 项目概述:当统计查询遇上MyBatis-Plus的优雅封装在后台管理、数据报表这类业务场景里,我们经常遇到一个经典需求:对数据库中的记录按某个维度(比如部门、商品类别、日期)进行分组,然后计算每个组的汇总值…

2026/7/31 20:31:27 阅读更多 →

日新闻

物理复制比逻辑复制好在哪?数据库复制原理详解

物理复制比逻辑复制好在哪?数据库复制原理详解

数据库复制是把主库数据同步到备库的机制,分为逻辑复制和物理复制两种。逻辑复制传输的是 SQL 语句或行变更事件,物理复制传输的是存储引擎底层的物理日志。阿里云 PolarDB(云原生数据库)采用物理复制,在同步延迟、数据…

2026/7/31 0:00:34 阅读更多 →
BilibiliDown:3分钟学会B站视频下载的终极指南

BilibiliDown:3分钟学会B站视频下载的终极指南

BilibiliDown:3分钟学会B站视频下载的终极指南 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirrors/bi/Bilib…

2026/7/31 0:00:34 阅读更多 →
有哪些游戏数据AI平台?游戏行业Data+AI融合方案盘点

有哪些游戏数据AI平台?游戏行业Data+AI融合方案盘点

当前,游戏行业的“DataAI融合”已从概念验证进入价值落地阶段。根据IDC 2025年数据,中国AI游戏云市场规模已达18.6亿元;同时,游戏研发环节AI渗透率高达86%,生成式AI内容普及率超过50%。面对庞大的市场,游戏…

2026/7/31 0:00:34 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/31 1:03:03 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/29 14:34:28 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/31 4:19:39 阅读更多 →

月新闻