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框架中实现容灾,解决设备故障、网络分化等问题。
RPC框架的更多相关文章
- RPC框架实现 - 通信协议篇
RPC(Remote Procedure Call,远程过程调用)框架是分布式服务的基石,实现RPC框架需要考虑方方面面.其对业务隐藏了底层通信过程(TCP/UDP.打包/解包.序列化/反序列化),使 ...
- 微博轻量级RPC框架Motan
Motan 是微博技术团队研发的基于 Java 的轻量级 RPC 框架,已在微博内部大规模应用多年,每天稳定支撑微博上亿次的内部调用.Motan 基于微博的高并发和高负载场景优化,成为一套简单.易用. ...
- 一个轻量级分布式RPC框架--NettyRpc
1.背景 最近在搜索Netty和Zookeeper方面的文章时,看到了这篇文章<轻量级分布式 RPC 框架>,作者用Zookeeper.Netty和Spring写了一个轻量级的分布式RPC ...
- RPC框架性能基本比较测试
RPC框架:gRPC.Thrift.Wildfly.Dubbo 原文链接:http://www.open-open.com/lib/view/open1426302068107.html gRPC是G ...
- 谷歌发布的首款基于HTTP/2和protobuf的RPC框架:GRPC
Google 刚刚开源了grpc, 一个基于HTTP2 和 Protobuf 的高性能.开源.通用的RPC框架.Protobuf 本身虽然提供了RPC 的定义语法,但是一直以来,Google 只开 ...
- rpc框架之 thrift连接池实现
接前一篇rpc框架之HA/负载均衡构架设计 继续,写了一个简单的thrift 连接池: 先做点准备工作: package yjmyzz; public class ServerInfo { publi ...
- rpc框架之HA/负载均衡构架设计
thrift.avro.grpc之类的rpc框架默认都没有提供负载均衡的实现,生产环境中如果server只有一台,显然不靠谱,于是有了下面的设计,这其实是前一阵跟北京一个朋友在qq群里交流的结果,分享 ...
- rpc框架之gRPC 学习 - hello world
grpc是google在github于2015年开源的一款RPC框架,虽然protobuf很早google就开源了,但是google一直没推出正式的开源框架,导致github上基于protobuf的r ...
- 微博RPC框架motan入门笔记
Motan 是一套高性能.易于使用的分布式远程服务调用(RPC)框架. 功能 支持通过spring配置方式集成,无需额外编写代码即可为服务提供分布式调用能力. 支持集成consul.zookeeper ...
- 老王讲自制RPC框架.(一.前言与技术选型)
(#)背景 随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进. 单一应用架构 当网站流量很小时,只 ...
随机推荐
- Unity3d该物业(Attributes)整理
http://blog.sina.com.cn/s/blog_5b6cb9500101857b.html Attributes属性属于U3D的RunTimeClass,所以加上下面的命名空间是必须的了 ...
- 构建安全的Xml Web Service系列之初探使用Soap头
原文:构建安全的Xml Web Service系列之初探使用Soap头 Xml Web Service 从诞生那天就说自己都么都么好,还津津乐道的说internet也会因此而进入一个新纪元,可5年多来 ...
- java 加载dll介绍(转)
最近在做的工作要用到本地方法,需要在Java中加载不少动态链接库(以下为方便延用Windows平台下的简写dll,但并不局限于Windows).刚刚把程序跑通,赶紧把一些心得写出来,mark.也希望对 ...
- spring集成quartz
spring集成quartz 注意:出现异常"Caused by: java.lang.IncompatibleClassChangeError: class org.springframe ...
- js怎样推断一个对象{}是否为空对象,没有不论什么属性
js怎样推断一个对象{}是否为空对象,没有不论什么属性 前段时间用js写了一个相似"angularjs"用于数据绑定的东西,功能是比較简单了, 通常应该传进来的是一个ArrayLi ...
- 系列五AnkhSvn
原文:系列五AnkhSvn AnkhSvn介绍 AnkhSVN是一款在VS中管理Subversion的插件,您可以在VS中轻松的提交.更新.添加文件,而不用在命令行或资源管理器中提交.而且该插件属于开 ...
- ExtJs--02--MessageBox相关弹出窗口alert,prompt,confirm采用
/* Ext.onReady(function(){ Ext.MessageBox.alert("jack","tom"); Ext.MessageBox.al ...
- 容易centos配置docker维修
首先.由于docker实施需要linux某些组件支持本身和内核特性.所以一定要确保centos版本号大于6,和内核版本号大于2.6.32-431.可轻松升级centos6到最新的版本号. sudo y ...
- mfc 链接时错误 文件函数重复定义
我在HeaderFile里新建了一个函数,然后在程序里调用,一直出现这个错误,说这个函数重复定义, 发现是VS自动加到External dependencies里面了.把HeaderFile里的函数文 ...
- unity3d 学习笔记(两)
AudioClip 使用声音资源 unity3d资源可以被设置为声3d声音或2d声音.3d间的影响,越近声音越大 component: Audio source: 声音的发生物体 Audio list ...