版权声明:本文由廖念波原创文章,转载请注明出处: 
文章原文链接:https://www.qcloud.com/community/article/147

来源:腾云阁 https://www.qcloud.com/community

为什么要用RPC和路由管理

RPC的概念其实出现已经很久了,记得笔者读大学的时候,接触到RPC的概念,总觉得不重要,多此一举:

  1. 我掌握好socket通信这个利器和tcp/ip协议族原理,什么功能不能实现?

  2. RPC就跟本地函数调用一样写代码,确实开发效率比较高;我自己把socket相关函数好好封装一下,让代码复用起来,开发效率也很高。

  3. 不懂或者不关注网络通信底层原理,光会函数调来调去,这样的程序员太没有出息了!

后来,笔者开始带团队,亲身经历了一些团队协作和IT服务运营过程中的故事,才发现RPC非常关键。这里分享我经历过的很早以前的两个故事。

故事一:有一个基础模块A,被非常多的其他模块远程调用,模块A的门户提供协议文档、API、调用示例代码,每当有人来申请使用,模块A负责人就会给调用方一组接口机的IP,调用方可以给这些IP发网络请求。

重视可用性的有追求的调用方,通常在拿到IP后,会把IP写在配置文件里,并且自己在代码里实现一定的容错逻辑:如果某个IP请求连续失败多少次,就一段时间内不要给它发请求了。这个容错逻辑做好可不简单,涉及到很多细节。

大多数的调用方,是把IP写死在代码里,简单的轮询请求这些IP。

如果模块A的某台接口机死机了,或者网络局部故障导致某些接口机不可达,很多调用方就会跳起来:你们怎么回事?你们的服务水平怎么这么差!

如果机房裁撤,一些机器IP要下架,模块A负责任会非常头疼:

  1. 首先不知道有哪些人在请求这个IP。读者说:傻啊,抓包看一下不就知道有哪些调用方了?但是要知道有的请求不是持续的,是不定期的访问一下模块A。

  2. 模块A的负责人要大范围的邮件通知调用方改路由(通常要改代码编译发布),过一段时间后,抓包看还有哪些调用方没有改,再挨个敦促修改路由

  3. 有时候某个IP下架了,过了几天,突然有个调用方跳起来:我们还在用呢!我们是写死IP的,代码找不到了,只能拿二进制可执行文件“硬”改

故事二: 一个团队里,通常有很多技术能力、服务意识和责任心都非常强的同事,他们的工作产出质量非常高,每个远程调用都有次数和成功率的上报(简单的说就是上报到一个监控系统,可以通过监控系统web界面查看曲线图),请求报文中的一些重要但不强校验的字段也都认真填写(例如染色标记),所以他们负责的模块,如果出现异常,很容易通过监控系统和日志监控到,并能快速定位到问题。

但是,也有一些同事责任心和能力不那么突出,重要的监控上报缺失、请求包里一些重要的字段没有填写。有时候服务的故障有异常了很久,被用户投诉才发现,事故报告里总是会出现这样的改进措施:增加对xxx的监控上报,增强服务运营意识。

类似的事故通常会反复出现,管理干部就会拉起一次运动式的梳理和整顿,但过一段时间,肯还会出现。

通过这两个事故可见:如果没有很好的实现RPC和路由管理,IT系统服务质量会过度的依赖人的意识,而这个通常成本非常高、效果也不好。

毫秒服务引擎(msec, 取英文名Mass Service Engine in Cluster的首字母组合)是腾讯一个开源框架,其创作冲动和构建经验,来自QQ后台团队超过10年的运营思考。RPC和路由管理是毫秒服务引擎设计的重要考量点。

毫秒引擎里是怎么做的?

首先,毫秒引擎将每个服务部署在哪些IP上这些信息集中管理起来,即使是调用外部的非标准服务(我们叫异构服务),也需要将该外部服务的接口IP配置到毫秒引擎管理系统里。这样涉及到的IP信息就不会散落在代码和各种配置文件里了。

服务之间的调用,统一采用CallMethod()函数的方式,避免代码千奇百怪;按服务名字调用和接口名调用

RPC背后的路由算法对于单机故障、网络局部波动等异常,自动容错。简单的说,路由算法按一定的规则轮转的选择被调用模块的接口机,并统计过去一段时间的调用成功率、时延信息,根据这些信息调整该接口机被选择到的比例。如果某个接口机故障了,那么就不会发送请求给它,从而实现自动容错。

毫秒引擎框架本身,在RPC执行的时候,就上报了很多基础属性和日志,这样保证了服务监控和告警等运营措施不依赖与人的意识。下图是叫做getMP3List这样一个RPC调用的请求数和成功数,这些是不需要业务开发者工作就自动上报。

每个请求有唯一ID来标识,通过该ID,毫秒引擎可以在框图中直观的呈现该请求经过的模块、模块间的RPC名字等信息,这个同样不需要业务开发者的工作就自动实现:

结语

互联网服务的后台,硬件通常是由大量的廉价机器组成;软件架构通常采取大系统小做、分而治之的思想。这就决定了业务逻辑涉及到大量的网路IO,同时单机故障、网络局部故障是运营的常态。那么,RPC和路由管理就显得尤其重要了。毫秒服务引擎为此提供了一个完整的解决方案。详细的可以见腾讯云服务市场毫秒服务引擎官网,或者微信公众号:msec-engine

谈谈后台服务的RPC和路由管理的更多相关文章

  1. mac os使用homebrew来管理后台服务

    在linux下我们经常通过 service 或者 /etc/init.d/来管理我们的后台服务软件,并使用包管理器安装这些软件. 在mac下有homebrew这个好用的工具来安装软件,但是一直没有找到 ...

  2. Knative 基本功能深入剖析:Knative Serving 之服务路由管理

    导读:本文主要围绕 Knative Service 域名展开,介绍了 Knative Service 的路由管理.文章首先介绍了如何修改默认主域名,紧接着深入一层介绍了如何添加自定义域名以及如何根据 ...

  3. ubuntu下后台服务的管理

    注册后台服务后都有脚本存在/lib/systemd/system路径下 如mysql为mysql.service 被service管理的进程被杀掉还是会重启的 应使用service XXX stop停 ...

  4. CentOS后台服务管理类

    目录 一.service 后台服务管理(临时,只对当前有效) 二.chkconfig 设置后台服务的自启配置(永久) 三.CentOS7 后添加的命令:systemctl 一.service 后台服务 ...

  5. 基于windows的Redis后台服务安装卸载管理

    首先,需要你进入你的Redis解压根目录,例如,类似于我下图的这样子: 接着打开你的cmd,使用cd命令切换到该目录,或者直接在上图的地址栏输入“cmd”并回车.这里为什么让你先使用资源管理器找到你的 ...

  6. golang 后台服务设计精要

    原文地址 守护进程 传统的后台服务一般作为守护进程(daemon)运行.linux 上创建 daemon 的步骤一般如下: 创建子进程,父进程退出: 调用系统调用 setsid() 脱离控制终端: 调 ...

  7. .NET Core 中的通用主机和后台服务

    简介 我们在做项目的时候, 往往要处理一些后台的任务. 一般是两种, 一种是不停的运行,比如消息队列的消费者.另一种是定时任务. 在.NET Framework + Windows环境里, 我们一般会 ...

  8. 分布式服务(RPC)+分布式消息队列(MQ)面试题精选

    ​ 分布式系统(distributed system)是建立在网络之上的软件系统.正是因为软件的特性,所以分布式系统具有高度的内聚性和透明性.因此,网络和分布式系统之间的区别更多的在于高层软件(特别是 ...

  9. vue(17)vue-route路由管理的安装与配置

    介绍 Vue Router 是 Vue.js官方的路由管理器.它和 Vue.js 的核心深度集成,让构建单页面应用变得易如反掌.包含的功能有: 嵌套的路由/视图表 模块化的.基于组件的路由配置 路由参 ...

随机推荐

  1. 关于winform窗体关闭时弹出提示框,选择否时窗体也关闭的问题

    在窗体中有FormClosing这个事件,这个事件是在窗体关闭时候运行的.如果要取消某个事件的操作,那么就在该事件中写上e.Cancel=true就能取消该事件,也就是不执行该事件.所以,你要在窗体关 ...

  2. 记录github 免登陆用户名密码方式

    1.https 代码模式切换为ssh模式: (本博客有文章介绍) 2.~/.ssh/github_rsa.pub 内容添加到github “config“ 目录下面 3.配置~/.ssh/config ...

  3. 事件总线demo

    经过几天的努力拜读大牛高手文章,终于对事件总线有所了解,特此记录下来,以免忘记 1.定义相关的接口: A  事件接口 public interface IDomainEvent { DateTime ...

  4. 消息中间件系列之ActiveMQ的简单安装

    本次测试使用一台ip为192.168.2.12的虚拟机 一.解压压缩包 tar -zxvf apache-activemq-5.14.4-bin.tar.gz 二.启动activemq 进入到bin目 ...

  5. Windows 10恢复Shift+右键打开命令提示符窗口

    导入以下注册表即可. Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\Directory\Background\shell\cmd1] ...

  6. Qt信号槽的一些事

    注:此文是站在Qt5的角度说的,对于Qt4部分是不适用的. 1.先说Qt信号槽的几种连接方式和执行方式. 1)Qt信号槽给出了五种连接方式: Qt::AutoConnection 0 自动连接:默认的 ...

  7. Mastering the game of Go with deep neural networks and tree search浅析

    Silver, David, et al. "Mastering the game of Go with deep neural networks and tree search." ...

  8. CentOS6.8安装mysql并设置字符集编码

    一.安装: 1. 首先以root用户进入系统 2. 输入命令: yum install mysql mysql-server -y 等待安装完成. 3. 启动MySQL,输入命令: /etc/init ...

  9. SQLServer跨服务器访问数据库(openrowset/opendatasource/openquery)

    SQLServer跨服务器访问数据库(openrowset/opendatasource/openquery) 1.启用Ad Hoc Distributed Queries 在使用openrowset ...

  10. MathType公式保存后为什么字体会变化

    在使用MathType数学公式编辑器的时候,很多的用户朋友是新手会遇到一些问题,比如,有时我们保存后却发现MathType公式字体变化了,原本的斜体变成了正体,面对这种问题我们该如何解决呢?下面就来给 ...