RPC框架

RPC框架实现 - 路由控制篇

2015-04-27 22:26 by bangerlee, 499 阅读, 1 评论, 收藏编辑

RPC(Remote Procedure Call,远程过程调用)框架是分布式服务的基石,实现RPC框架需要考虑方方面面。其对业务隐藏了底层通信过程(TCP/UDP、打包/解包、序列化/反序列化),使上层专注于功能实现;框架层面,提供各类可选架构(多进程/多线程/协程);应对设备故障(高负载/死机)、网络故障(拥塞/网络分化),提供相应容灾措施。

RPC框架中Client调用Server,请求路由到哪台Server有不同的策略和实现方式。这里路由策略可分为三种,我们分别把它们称为Set、一致性哈希、SetModel,下面我们讨论这三种路由方式。

Set

Set即分段路由,根据请求来源的标志位(如用户ID),将请求落到对应Set的Server。各Set配置一台备机进行容灾,Set一般配置格式如下:

[Server0]
IP=1.1.1.1
Port=11000
Sect_Begin=0
Sect_End=99

[BakServer0]
IP=1.1.1.2
Port=11000
Sect_Begin=0
Sect_End=99

以上配置表示,0~99段的请求将落到1.1.1.1/11000,如果主机访问失败,则请求1.1.1.2/11000。

采用Set路由方式有一些弊端,作为冷备的容灾,有一半设备处于空闲状态,因用户活跃度不同,按用户ID路由请求,会导致Server请求不均,另因配置中带有分段信息,配置不易于修改,从而导致扩容/缩容的不便。

一致性哈希

一致性哈希(consistent hash)的具体实现可见memcached客户端一致性哈希算法实现——libketama》(需 翻 墙),一致性哈希适合作为逻辑模块间的路由策略,配置格式如下:

[Server0]
IP=1.1.1.1
Port=11000
Scale=1000

[Server1]
IP=1.1.1.2
Port=11000
Scale=2000

Scale配置项代表权重,以上配置表示请求落到1.1.1.2这台机的概率比落到1.1.1.1大一倍。

相比Set路由方式,一致性哈希路由更方便于扩容/缩容,并且理论上可以做到请求平摊。但一致性哈希路由存在另一方面的隐患,由于没有分段隔离,少量用户带来的问题可扩散到整个后端,另动态计算请求落到哪台Server的算法需合理设计,避免在这一步消耗太多计算资源。

SetModel

SetModel路由方式是Set、一致性哈希两者的结合,在SetModel下,请求先分段落到一组Server,再根据一致性哈希在这一组Server中选取机器。SetModel配置格式如下:

[Server0]
SVRCount = 3
SVR0=1.1.1.1
SVR1=1.1.1.2
SVR2=1.1.1.3
SVR_Port=11000
Sect_Begin=0
Sect_End=49

[Server1]
SVRCount = 3
SVR0=1.1.1.4
SVR1=1.1.1.5
SVR2=1.1.1.6
SVR_Port=11000
Sect_Begin=50
Sect_End=99

假设用户ID为60,由以上配置请求将落到Server1这一组Server,再依据一致性哈希,在1.1.1.4、1.1.1.5、1.1.1.6这三台Server中挑选一台用于处理请求。

SetModel相比一致性哈希,避免了个别用户带来的影响扩散,但仅使用用户标志作为分Set标准,同样存在流量不均问题。在选路之前,我们可以对用户ID取一次random,再根据random值选Set,这样可解决流量不均问题。

长连 VS 短连

最后聊聊RPC框架中长短连的使用问题,长连、短连定义如下:

长连:Client维持与Server的TCP Socket连接,每次请求使用同样的连接通道

短连:Client每次请求Server即发起一次连接,当次请求完成后关闭连接

我们可以从资源使用的角度,分析使用长连还是短连,长连下Client/Server长期占用内存(tcp_mem)用于连接保持,短连下连接建立的过程会带来CPU消耗(如Server不断Accept),对CPU消耗型服务,在内存能满足的情况下,应尽量使用长连。

小结

本文讨论了RPC框架中三种路由方式,分别是Set、一致性哈希、SetModel,Set按分段提供冷备,一致性哈希保证请求均匀,SetModel是Set和一致性哈希两者的结合,最后探讨RPC框架中长连和短连的应用场景。

RPC框架的实现需要考虑方方面面,路由访问方式是其中一个点,下一节将讨论如何在RPC框架中实现容灾,解决设备故障、网络分化等问题。

时间: 2024-10-11 14:51:37

RPC框架的相关文章

一个入门rpc框架的学习

一个入门rpc框架的学习 参考 huangyong-rpc 轻量级分布式RPC框架 该程序是一个短连接的rpc实现 简介 RPC,即 Remote Procedure Call(远程过程调用),说得通俗一点就是:调用远程计算机上的服务,就像调用本地服务一样. RPC 可基于 HTTP 或 TCP 协议,Web Service 就是基于 HTTP 协议的 RPC, 它具有良好的跨平台性,但其性能却不如基于 TCP 协议的 RPC.会两方面会直接影响 RPC 的性能,一是传输方式,二是序列化. 众所

RPC框架性能基本比较测试

gRPC是Google最近公布的开源软件,基于最新的HTTP2.0协议,并支持常见的众多编程语言. 我们知道HTTP2.0是基于二进制的HTTP协议升级版本,目前各大浏览器都在快马加鞭的加以支持. 我们可以设想一下,未来浏览器支持HTTP2.0,并通过现有开源序列化库比如protobuf等,可以直接和各种语言的服务进行高效交互,这将是多么“美好”的场景! gPRC的Java实现底层网络库是Netty,而且是用到最新的Netty5.0.0.Alpha3的开发版本,因为最新版本针对HTTP/2做了很

初见akka-02:rpc框架

1.RPC:简单点说,就是多线程之间的通信,我们今天用了scala以及akka 来简单的实现了 rpc框架的一些简单的内容,一脸包括了,心跳,间隔时间, 注册以及一些问题, 模式匹配的一些东西,虽然比较简单,但是属于麻雀虽小,五脏俱全 这个里面一共有有四个文件: Master.scala RemoteMessage.scala Worker.scala WorkerInfo Master.scala package cn.wj.rpc import akka.actor.{Actor, Acto

C# 的轻量级 RPC 框架

Redola.Rpc 的一个小目标 Redola.Rpc 的一个小目标 Redola.Rpc 的一个小目标:20000 tps. Concurrency level: 8 threads Complete requests: 20000 Time taken for tests: 0.886 seconds Time per request: 0.044 ms (avg) Requests per second: 22573 [#/sec] (avg) Concurrency level: 8

Google 高性能 RPC 框架 gRPC 1.0.0 发布(附精彩评论)

gRPC是一个高性能.开源.通用的RPC框架,面向移动和HTTP/2设计,是由谷歌发布的首款基于Protocol Buffers的RPC框架. gRPC基于HTTP/2标准设计,带来诸如双向流.流控.头部压缩.单TCP连接上的多复用请求等特性.这些特性使得其在移动设备上表现更好,更省电且节省空间占用. gRPC 1.0版本是2015年面世以后的第一次版本发布,开发者可以把该版本用于生产.API现在也是很稳定的. 关于Java版本发布情况,大家阅读发布日志:https://github.com/g

微博轻量级RPC框架Motan正式开源:支撑千亿调用

支撑微博千亿调用的轻量级 RPC 框架 Motan 正式开源了,项目地址为https://github.com/weibocom/motan. 微博轻量级RPC框架Motan正式开源 Motan 是微博技术团队研发的基于 Java 的轻量级 RPC 框架,已在微博内部大规模应用多年,每天稳定支撑微博上亿次的内部调用.Motan 基于微博的高并发和高负载场景优化,成为一套简单.易用.高可用的 RPC 服务框架. Motan 功能特点:简单.易用.高可用 无侵入集成.简单易用,通过 Spring 配

【转】轻量级分布式 RPC 框架

第一步:编写服务接口 第二步:编写服务接口的实现类 第三步:配置服务端 第四步:启动服务器并发布服务 第五步:实现服务注册 第六步:实现 RPC 服务器 第七步:配置客户端 第八步:实现服务发现 第九步:实现 RPC 代理 第十步:发送 RPC 请求 总结 附录:Maven 依赖 RPC,即 Remote Procedure Call(远程过程调用),说得通俗一点就是:调用远程计算机上的服务,就像调用本地服务一样. RPC 可基于 HTTP 或 TCP 协议,Web Service 就是基于 H

谷歌发布的首款基于HTTP/2和protobuf的RPC框架:GRPC

Google 刚刚开源了grpc,  一个基于HTTP2 和 Protobuf 的高性能.开源.通用的RPC框架.Protobuf 本身虽然提供了RPC  的定义语法,但是一直以来,Google 只开源了Protobuf 序列化反序列化的代码,而没有开源RPC 的实现,于是存在着众多良莠不齐的第三方RPC 实现,不过我在项目中采用WCF搭配Protobuf是一个很不错的RPC实现,Google这个框架是是基于HTTP2的,这是他有特色的地方,带来诸如双向流.流控.头部压缩.单TCP连接上的多复用

RPC框架研究(二)Hadoop源代码-1

报名了阿里中间件性能大赛,我来说是一个全新的挑战.一切从空白学起,比赛的过程也是学习的过程 是的.想让自己学好.给自己报一个比赛吧~ 就像当初学围棋,也是报了围棋比赛,为了不至于输的太慘.一个星期里学了好多东西 第二天 Hadoop源代码-1 小雨 天真的以为学了Java回调机制后就能够把原来的RPC框架改为异步调用了,结果对着代码一下午都没想出要怎么去改,怎么入手. 于是决定研究一下Hadoop的源代码,看看别人是怎么实现RPC的,这也是我第一次研究源代码,曾经都是仅仅管用.无论怎样实现. 使