版权声明:本文由廖念波原创文章,转载请注明出处: 
文章原文链接: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. Java基本功—Reference

    这是一篇一年多之前便已写就的文章,那时,因为很多Java程序员只求追随新生的事物,却连基本的概念都没有,很多讨论中,很明显是基本功不过硬,于是萌生写一个系列文章,讨论Java的基本功,下面便是在这个想 ...

  2. MyBatis 网络资料

    http://mybatis.github.io/mybatis-3/zh/index.html 官方文档例子 http://blog.csdn.net/rootsuper/article/detai ...

  3. 【高可用HA】Apache (2) —— Mac下安装多个Apache Tomcat实例

    Mac 下安装多个Apache Tomcat实例 tomcat版本:tomcat-8.0.29 参考来源: Installing Tomcat 7.0.x on OS X 在mac系统安装Apache ...

  4. linux中hive无法使用删除键或无反应

    用的工具secureCRT连接linux服务器的,登录到hive中后无法使用删除键. 修改如下: 会话选项 -> 终端|仿真 ->  选择终端为linux.

  5. linux取随机数shell版本

    #!/bin/bash aa=$(-) ..} do useradd $i echo $aa|passwd --stdin $i echo "${i} ${aa}" >> ...

  6. SpringMVC & SpringBoot小记

    SpringMVC 1.SpringMVC常用注解 https://blog.csdn.net/lipinganq/article/details/79155072 :@Component.@Serv ...

  7. jquery动态分页

    最近一直研究jquery的分页效果,刚刚弄好了一个,拿出来与大家分享.分页效果与时光网的差不多. 网址:http://www.mtime.com/movie/news/all/ 先在aspx页面放置一 ...

  8. C API 连接MySQL及批量插入

    CMySQLMgr.h: #ifndef _CMYSQLMGR_H_ #define _CMYSQLMGR_H_ #include <iostream> #include "my ...

  9. e581. Animating an Array of Images in an Application

    This is the simplest application to animate an array of images. import java.awt.*; import javax.swin ...

  10. jquery.attach附件上传jquery插件

    html: <!DOCTYPE html> <html lang="zh-cn"> <head> <meta http-equiv=&qu ...