RPC 和 序列化

RPC

1 RPC调用流程

1.1 clerk客户端调用远程服务

Clerk::PutAppend()

raftServerRpcUtil::PutAppend() 

raftServerRpcUtil是client与kvserver通信的入口,  包含kvserver功能的一对一映射:Get/PutAppend,通过stub对象——raftKVRpcProctoc::kvServerRpc_Stub *stu进行对应的rpc远程调用。

针对raft节点之间的通信,设计了RaftRpcUtil类型,包含raft节点功能:AppendEntries/ InstallSnapshot/ RequestVote

 kvServerRpc_Stub::PutAppend()

kvServerRpc_Stub 是 kvServerRPC.proto文件编译后生成的存根,用于实现rpc远程调用。

stub使用MprpcChannel作为参数来初始化,因此接下来会调用MprpcChannel::CallMethod():

stub = new raftKVRpcProctoc::kvServerRpc_Stub(new MprpcChannel(ip, port, false));

 MprpcChannel::CallMethod()

MprpcChannel:实现rpc通信的类建立和服务端的连接,发送rpc请求,和接收rpc回复

所有通过stub调用的rpc方法,都会走到MprpcChannel::CallMethod(): 生成rpc请求数据并序列化,使用socket发送请求并接收回复

1.2 kvserver 提供rpc服务

KvServer::KvServer()

构造函数中发布rpc服务类型: 服务的类型有两种,分别是Raft和KvServer

  • class Raft : public raftRpcProctoc::raftRpc
  • class KvServer : raftKVRpcProctoc::kvServerRpc

Raft类型的服务用于raft节点之间相互调用,KvServer类型的服务被client调用

RpcProvider::Run() 启动rpc服务,等待调用。项目中是阻塞等待,同步阻塞模型

RpcProvider::OnMessage()

 已建立连接用户的读写事件回调:调用Callmethod来调用本地的业务

RpcProvider:网络对象类,发布节点能提供的rpc服务,并启动rpc服务(接收连接,接收请求并执行)

service->CallMethod() 

有两种服务类型(Raft和KvServer),根据请求的service的类型,动态调用对应的CallMethod();

client调用 KvServerRpc::CallMethod(),raft节点调用raftRpc::CallMethod()。

KvServerRpc::CallMethod()

 在函数内部,最终调用KvServer本地的方法。

2 rpc基础

2.1 概念

  1. RPC(Remote Procedure Call Protocol) 远程过程调用协议。
  2. RPC是一种通过网络从远程计算机上请求服务,不需要了解底层网络技术的协议。
  3. 远程调用就像调用本地方法一样便捷。

2.2 常用RPC技术或框架

  1. 应用级的服务框架:阿里的 Dubbo/Dubbox、Google gRPC、Spring Boot/Spring Cloud。
  2. 远程通信协议:RMI、Socket、SOAP(HTTP XML)、REST(HTTP JSON)。
  3. 通信框架:MINA 和 Netty

2.3 rpc作用

  • 微服务化:跨平台的服务之间远程调用;
  • 分布式系统架构:分布式服务跨机器进行远程调用;
  • 支持跨语言调用。

2.4 架构

服务注册,就是将提供某个服务的模块信息(通常是这个服务的ip和端口)注册到1个公共的组件上去(注册中心,比如: zookeeper\consul)。

服务发现,就是新注册的这个服务模块能够及时的被其他调用者发现。不管是服务新增和服务删减都能实现自动发现。

一个完整的服务发现中心还需要支持负载均衡容灾处理等功能。

负载均衡:简单数就是将请求分散给各个机器上,维持各个机器的请求的均衡态势。确保不会大量请求都涌入到某几个机器上导致机器过载。

容灾处理:就是及时剔除掉故障的机器。例如某次调用19.4.11.11上的OrderServer出现故障,那么服务中心会将这个地址剔除掉,防止下次再访问到这个有故障的地址。

2.5 rpc调用流程

2.6 重要组成 

客户端:调用方

客户端存根:client stub,保存服务端地址信息,将客户端的请求方法、参数序列化,通过网络发送给服务端。

服务端存根:server stub,接收请求,反序列化,调用本地服务

服务端:服务提供者

网络传输:tcp或http

2.7 基础功能

2.7.1 服务寻址

rpc所有函数都有一个自己的ID,在所有进程中都唯一。客户端远程调用,必须附上这个ID.

客户端查一下映射表,找出对应ID,服务端根据对应的ID提供服务。

Call ID映射表一般是哈希表。

2.7.2 序列化和反序列化

概念

  1. 序列化:将消息对象转换为二进制流。
  2. 反序列化:将二进制流转换为消息对象。

必要性

  • 本地函数调用:只需要将数据压入栈中,然后让函数去栈中读取数据。
  • 远程调用:无法通过栈传递参数。需要客户端将请求序列化,传送给服务端。

序列化的优势

  • 二进制字节流便于网络传输
  • 可跨平台、跨语言。

2.7.3 网络传输

基于TCP

通过socket连接发送序列化的调用接口名称、方法名称和参数等。

基于HTTP

客户端发送GET/PUT/POST/DELETE请求给服务端

服务端根据不同的请求参数和请求url进行方法调用,返回结果

对比

基于TCP更灵活,可减少网络开销,性能高。但实现复杂;

HTTP已经实现序列化,但http传输效率比tcp低。

2.8 服务治理

2.8.1 负载均衡

本项目实现的rpc没有做负载均衡,因为当前是Read Log模式,读写请求都是直接发送给leader。后面如果优化为从follower读,可能用得到负载均衡。

  1. 轮询算法(Round Robin):轮询算法是最简单的负载均衡算法之一,它按照请求的顺序依次将每个请求分配到不同的服务器上。当有新的请求到来时,负载均衡器会依次将请求发送到不同的服务器,直到所有的服务器都被轮询过一遍,然后再从头开始。
  2. 最小连接数算法(Least Connections):最小连接数算法会将新的请求分配到当前连接数最少的服务器上,以确保各服务器的负载尽可能均衡。这种算法考虑了服务器的负载情况,优先将请求发送到负载较低的服务器上。
  3. 最少响应时间算法(Least Response Time):最少响应时间算法会将请求发送到响应时间最短的服务器上,以保证响应时间的最小化。这种算法通常需要负载均衡器记录每个服务器的响应时间,并动态调整请求的分配策略。
  4. 哈希算法(Hashing):哈希算法根据请求的某些属性(如客户端IP地址、URL等)计算哈希值,并将请求发送到对应哈希值的服务器上。这种算法能够确保相同请求始终被发送到同一台服务器上,适用于需要保持会话一致性的场景。
  5. 加权轮询算法(Weighted Round Robin):加权轮询算法在轮询算法的基础上引入了权重的概念,不同的服务器具有不同的权重值。根据权重值的不同,负载均衡器会调整请求的分配比例,以实现负载均衡。
  6. 拓展:hash环也是一种重要的负载均衡算法,也可以提及。

3 本项目rpc

本项目实现的rpc比较简单,采用的是同步阻塞模式。

rpc请求格式:

  1. head_size(4个字节,存储head_str的长度) 
  2. head_str(RpcHeader类型的序列化
  3. args(PutAppendArgs/GetArgs 请求对象的序列化

RpcHeader:

message RpcHeader
{bytes service_name = 1;bytes method_name = 2;uint32 args_size = 3;
}

可以优化的点:

  •         异步rpc
  •         rpc设为长连接还是短连接?长连接考虑设计一个定时器          
  •         负载均衡
  •         服务发现,服务注册

序列化

1 Protobuf

kvServerRPC.proto文件

syntax = "proto3";
package raftKVRpcProctoc; //所在的命名空间
option cc_generic_services = true;  //开启stub服务message GetArgs{bytes Key = 1 ;bytes ClientId = 2 ;int32 RequestId = 3;
}
message GetReply  {bytes Err = 1;bytes Value = 2;
}message PutAppendArgs  {bytes Key = 1;bytes  Value = 2 ;bytes  Op = 3;bytes  ClientId = 4;int32  RequestId = 5;
}
message PutAppendReply  {bytes Err = 1;
}service kvServerRpc
{rpc PutAppend(PutAppendArgs) returns(PutAppendReply);rpc Get (GetArgs) returns (GetReply);
}

.proto文件定义message类型和service类型,编译后,生成.pb.h文件和.pb.cc文件。

.proto文件中定义的message类型可以序列化和反序列化(SerializeToString/ParseFromString).

编译后会生成对应Stub(存根)类型 raftKVRpcProctoc::kvServerRpc_Stub,使用Stub对象可以调用.proto文件中定义的service。

2 boost

快照:kvserver、kvdb和raft节点使用boost库进行序列化

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

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

相关文章

爬虫神器!使用Python一键下载网页图片,省时高效!

引言 爬虫技术在当今信息时代中扮演着重要的角色,可以自动化获取互联网上的数据。本教程将围绕你提供的Python爬虫代码展开,旨在实现自动下载图片的功能。通过这个示例,你将学习如何利用爬虫技术批量获取网页中的图片,并将其保存…

MC78L05ACDR2G线性稳压器芯片中文资料规格书PDF数据手册引脚图参数图片价格

产品概述: MC78L00A系列线性稳压器价格便宜,易于使用,适用于各种需要最高100mA的调节电源的应用。与大功率MC7800和MC78M00系列一样,这款稳压器也提供内部电流限制和高温关断,因此非常坚固耐用。在很多应用中&#xf…

【C语言】linux内核pci_save_state

一、中文注释 //include\linux\pci.h /* 电源管理相关的例程 */ int pci_save_state(struct pci_dev *dev);//drivers\pci\pci.c /*** pci_save_state - 在挂起前保存PCI设备的配置空间* dev: - 我们正在处理的PCI设备*/ int pci_save_state(struct pci_dev *dev) {int i;/* X…

odoo17开发教程(14):Computed Fields And Onchanges

目录 概述: 计算字段Computed Fields 依赖关系 实践: 计算总面积 计算最佳报价。 Inverse Function反函数 实践:计算报价的有效日期。 其他信息 Onchanges 实践:设置花园面积和方向值。 如何使用它们? 概述…

漫谈5种注册中心

01 注册中心基本概念 1.1 什么是注册中心? 注册中心主要有三种角色: 服务提供者(RPC Server):在启动时,向 Registry 注册自身服务,并向 Registry 定期发送心跳汇报存活状态。 服务消费者&…

鸿蒙开发学习:【OpenHarmony HAR】

OpenHarmony js/ts三方库使用的是OpenHarmony静态共享包,即HAR(Harmony Archive),可以包含js/ts代码、c库、资源和配置文件。通过HAR,可以实现多个模块或者多个工程共享ArkUI组件、资源等相关代码。HAR不同于HAP,不能独立安装运行…

Python数据分析-Matplotlib1

一、折线图的绘制 1.数据分析流程 2.运用Matplot绘制折线图 #encodingutf-8 import random from matplotlib import pyplot as plt #绘图工具库 from matplotlib import font_manager #解决中文显示问题 from cProfile import label #设置字体方式 my_font font_manager.Fon…

jscpd对项目进行查重(支持150+类语言)

jscpd jscpd 查重时能够跳过标记为忽略的块和新行以及空符号和注释&#xff08;不支持尖括号注释<!-- --&#xff01;>&#xff09;&#xff0c;重复率判定依据为一定长度标识符的MD5值是否相同。 安装 npm install -g jscpd配置参数(查看更多) OptionTypeDefaultDes…

挑战杯 机器视觉目标检测 - opencv 深度学习

文章目录 0 前言2 目标检测概念3 目标分类、定位、检测示例4 传统目标检测5 两类目标检测算法5.1 相关研究5.1.1 选择性搜索5.1.2 OverFeat 5.2 基于区域提名的方法5.2.1 R-CNN5.2.2 SPP-net5.2.3 Fast R-CNN 5.3 端到端的方法YOLOSSD 6 人体检测结果7 最后 0 前言 &#x1f5…

VS2019加QT5.14中Please assign a Qt installation in ‘Qt Project Settings‘.问题的解决

第一篇&#xff1a; 原文链接&#xff1a;https://blog.csdn.net/aoxuestudy/article/details/124312629 error:There’ no Qt version assigned to project mdi.vcxproj for configuration release/x64.Please assign a Qt installation in “Qt Project Settings”. 一、分…

Docker学习之使用harbor搭建私有仓库(超详解析)

实验目的&#xff1a; 使用centos7&#xff0c;基于harbor构建私有仓库 实验步骤&#xff1a; 下载相关安装包和依赖&#xff1a; [rootlocalhost ~]# yum install -y yum-utils device-mapper-persistent-data lvm2 wget //安装docker所需要的相关依赖 [rootlocalhost ~]#…

[ThinkPHP]Arr返回1

$detailId (int)Arr::get($detail, null); var_dump($detailId); 打印结果&#xff1a;int(1) 原因&#xff1a; vendor/topthink/think-helper/src/helper/Arr.php

如何定期清理数据库中的无效数据?

企业的数据库在运行相当长一段时间后&#xff0c;都会出现无效数据的堆积&#xff0c;这些数据包含了过时、重复、错误、缺失&#xff08;空字段&#xff09;的数据&#xff0c;长期占据着宝贵的数据库空间。而在上云热潮的推动下&#xff0c;绝大多数企业已经将他们的业务数据…

Linux第77步_处理Linux并发的相关函数

了解linux中的“原子整形数据”操作、“原子位数据”操作、自旋锁、读写锁、顺序锁、信号量和互斥体&#xff0c;以及相关函数。 并发就是多个“用户”同时访问同一个共享资源。如&#xff1a;多个线程同时要求读写同一个EEPROM芯片&#xff0c;这个EEPROM就是共享资源&#x…

2024全网最全Excel函数与公式应用

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 引言 Excel是一款广泛应用于商业、教育和个人…

某夕夕商品数据抓取逆向之webpack扣取

逆向网址 aHR0cHM6Ly93d3cucGluZHVvZHVvLmNvbQ 逆向链接 aHR0cHM6Ly93d3cucGluZHVvZHVvLmNvbS9ob21lL2JveXNoaXJ0 逆向接口 aHR0cHM6Ly9hcGl2Mi5waW5kdW9kdW8uY29tL2FwaS9naW5kZXgvdGYvcXVlcnlfdGZfZ29vZHNfaW5mbw 逆向过程 请求方式&#xff1a;GET 参数构成 【anti_content】…

基于SSM SpringBoot vue办公自动化计划管理系统

基于SSM SpringBoot vue办公自动化计划管理系统 系统功能 登录注册 个人中心 员工信息管理 部门信息管理 会议管理 计划管理 行程安排管理 行程进度管理 管理员管理 开发环境和技术 开发语言&#xff1a;Java 使用框架: SSM(Spring SpringMVC Mybaits)或SpringBoot 前端…

【题目】【网络系统管理】2022年甘肃省职业院校技能大赛-网络构建-试卷

极安云科专注职业教育技能竞赛培训4年&#xff0c;包含信息安全管理与评估、网络系统管理、网络搭建等多个赛项及各大CTF模块培训学习服务。本团队基于赛项知识点&#xff0c;提供完整全面的系统性理论教学与技能培训&#xff0c;成立至今持续优化教学资源与讲师结构&#xff0…

vivo统一接入网关VUA转发性能优化实践

作者&#xff1a;vivo 互联网服务器团队 - Qiu Xiangcun 本文将探讨如何通过使用Intel QuickAssist Technology&#xff08;QAT&#xff09;来优化VUA的HTTPS转发性能。我们将介绍如何使用QAT通过硬件加速来提高HTTPS转发的性能&#xff0c;并探讨QAT在不同应用场景中的表现。最…

Python下有关CV的一些算法和函数

目录&#xff1a; 1. HoughCircles二级目录三级目录 1. HoughCircles 霍夫圆检测 二级目录 三级目录