RPC框架实现
转载RPC框架实现
RPC(Remote Procedure Call,远程过程调用)框架是分布式服务的基石,实现RPC框架需要考虑方方面面。其对业务隐藏了底层通信过程(TCP/UDP、打包/解包、序列化/反序列化),使上层专注于功能实现;框架层面,提供各类可选架构(多进程/多线程/协程);应对设备故障(高负载/死机)、网络故障(拥塞/网络分化),提供相应容灾措施。
监控是分布式服务中相当重要的一部分,其有助于我们了解业务发展状况,出灾时提供第一手分析资讯。分布式系统中的每一个模块,都需要一些指标说明其服务状况和服务质量,如调用总数、成功数、连接失败数、调用平均耗时等,这些指标应该由RPC框架默认提供;对于业务相关的指标,例如查看附近的人的总人数、查看附近的人的男/女人数、扔漂流瓶的总人数等,RPC框架也应该提供接口,方便业务开发同学添加相关监控项。
下面我们就来了解实现RPC框架监控的一种方案。
id-key监控
首先我们来看如何对模块监控,这里模块由一组提供相同服务的设备组成,一个模块对外提供统一的服务端口。
那么对一个模块默认应该具备哪些监控项呢?除了以上提到的调用总数、调用成功数、连接失败数、调用平均耗时外,还可以具备以下监控项:
- Server端所有接口耗时统计
- Client端所有接口耗时统计
- 请求包/响应包大小统计
- Server各阶段处理统计
- Accept失败
- 超过最大连接数
- 请求队列满
- Server端的重启
- coredump统计
以上监控项中,既有Client端的上报数据,也有Server端自己的上报数据,通过服务提供方和服务使用方两方面监控,确保监控数据的全面和准确。根据RPC框架的具体实现,Server各阶段处理统计可以有不同的细分统计(例如从Accept Queue接收到fd到将请求包push到Inqueue的耗时统计),帮助我们从更细的角度观察RPC框架内部。
有了监控的对象和目标,接着就是如何实现。从一个模块对外提供一个服务端口这一点出发,可以实现基于id-key的分钟级监控。id-key是存在于共享内存中的一个二维数组,具体表示如下:

id和key均为unsigned int类型,id的取值范围为 0 ~ 64K-1,key的取值范围为 0 ~ 63。两块共享内存,一块用于读,一块用于写,每分钟切换这两块内存。这两块共享内存一共占用的内存大小为:64K * 64 * 4(bytes) * 2 = 32M。
模块的端口可以映射为一个id,key对应于以上一个个监控项,在RPC框架层修改相关监控项(例如Client进行connect调用失败时,对相应Server连接失败的id-key加1)。通过每分钟切换读写共享内存块,我们得到每分钟某个模块单机的统计数据,我们可以将这些数据进行入库。
但单机的纬度还不够,我们经常需要了解一个模块整体的服务情况,于是我们对每分钟数据进行收集、聚合:

以分钟为单元,将该模块各台设备不同id-key的数据进行求和,我们就得到了该模块各指标整体的分钟级数据。RPC框架内置进程将统计数据写入共享内存,从共享内存获取数据并上传进行合并可由另外的进程完成。
对于业务相关的数据,也可以通过id-key的方法实现监控,对某项业务我们可以申请id(注意避免与模块的id冲突),自定义各项key的含义,然后在业务代码中将相关指标上报到对应id-key。
调用关系
分布式系统中,我们经常需要看一个模块的上下游关系,类似以下展现形式:

以模块A为查询对象,对应的可以找到其主调模块x/y/z、被调模块ß/ą/μ等模块,同时显示调用总数、系统失败数等主被调的服务情况。
我们在框架中也可以实现调用关系数据的收集,每次RPC调用,以主调(SvrID,ModID)为key,被调(SvrID,ModID)为value入主调数据库,另以被调(SvrID,ModID)为key,主调(SvrID,ModID)为value入被调数据库。查看模块A上游时查询被调数据库,查看模块A下游时查询主调数据库。
调用关系方便我们检查RPC框架中,一条链的调用情况,在更大的层面我们有时候希望看到调用网的情况,在一个更大维度观察系统,出灾时可以更直观地看到异常模块。关于分布式系统调用网监控,可以参考Google Dapper这篇文章。
小结
本文介绍了RPC框架中实现监控的id-key方案,id-key通过数据收集与聚合,在框架层默认为各个模块提供调用总数、调用平均耗时等指标,同时可方便添加各种业务数据关联的统计指标。分布式系统中,对某个业务定位分析问题时,经常需要查看该业务相关的调用链,分析一个模块的主被调情况,这也需要在RPC框架层面提供支持。
分布式系统
RPC框架实现 - 监控篇
2015-05-14 23:52 by bangerlee, 573 阅读, 收藏, 编辑
RPC框架实现 - 通信协议篇
2015-05-07 23:03 by bangerlee, 596 阅读, 收藏, 编辑
RPC框架实现 - 框架篇
2015-04-30 23:47 by bangerlee, 538 阅读, 收藏, 编辑
RPC框架实现 - 容灾篇
2015-04-28 23:36 by bangerlee, 804 阅读, 收藏, 编辑
RPC框架实现 - 路由控制篇
2015-04-27 22:26 by bangerlee, 704 阅读, 收藏, 编辑
分布式服务协调员zookeeper - 应用场景和监控
2015-04-15 00:00 by bangerlee, 723 阅读, 收藏, 编辑
基于Quorum机制的强一致性存储方案
2015-03-12 22:59 by bangerlee, 124 阅读, 收藏, 编辑
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框架.(一.前言与技术选型)
(#)背景 随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进. 单一应用架构 当网站流量很小时,只 ...
随机推荐
- 在Windows基础上(硬盘)安装Linux操作系统(CentOS/RedHat)
注:该方法安装CentOS ,RedHat均没有问题,其它Linux操作系统,没有尝试过. 0.创建一个fat32的盘.我分了8G给这个盘,盘符为F.F盘以后的内存所有删除,作为未分配的内存.这个留用 ...
- HDU 1018-Big Number(数学)
Big Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...
- Encountered a section with no Package: header
刚才打开ubuntu,我的版本号是11.04.正想打开新立得软件工具包更新软件的时候,出现了例如以下错误: E:Encountered a section with no Package: heade ...
- freemarker错误九
1.错误叙述性说明 五月 30, 2014 11:52:04 下午 freemarker.log.JDK14LoggerFactory$JDK14Logger error 严重: Template p ...
- Memcached全面剖析–5. memcached的应用和兼容程序
作者:长野雅广(Masahiro Nagano) 原文链接:http://gihyo.jp/dev/feature/01/memcached/0005 我是Mixi的长野.memcached的连载最 ...
- 【剑指offer】面试题39:深度二叉树
def TreeDepth1(root): if None == root: return 0 if None == root.left and None == root.right: return ...
- 原生js判断css动画结束 css 动画结束的回调函数
原文:原生js判断css动画结束 css 动画结束的回调函数 css3 的时代,css3--动画 一切皆有可能: 传统的js 可以通过回调函数判断动画是否结束:即使是采用CSS技术生成动画效果,Jav ...
- 第十九章——使用资源调控器管理资源(2)——使用T-SQL配置资源调控器
原文:第十九章--使用资源调控器管理资源(2)--使用T-SQL配置资源调控器 前言: 在前一章已经演示了如何使用SSMS来配置资源调控器.但是作为DBA,总有需要写脚本的时候,因为它可以重用及扩展. ...
- java main方法背后的故事?(转)
jvm java 看似一种语言,实则一个巨大的体系的王国,开发这么多年了,还是没有搞懂,我以为我懂了,可是过了一段时间又忘了,所以说还是没懂 1.main方法说起 编译完我们的java文件后,需要有个 ...
- SWFUpload多文件上传 文件数限制 setStats()
使用swfupload仿公平图片上传 SWFUpload它是基于flash与javascript的client文件上传组件. handlers.js文件 完毕文件入列队(fileQueued) → 完 ...