RPC实战与核心原理
何小锋
京东技术架构部首席架构师
立即订阅
3907 人已学习
课程目录
已更新 17 讲 / 共 28 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 别老想着怎么用好RPC框架,你得多花时间琢磨原理
免费
基础篇 (6讲)
01 | 核心原理:能否画张图解释下RPC的通信流程?
02 | 协议:怎么设计可扩展且向后兼容的协议?
03 | 序列化:对象怎么在网络中传输?
04 | 网络通信:RPC框架在网络通信上更倾向于哪种网络IO模型?
05 | 动态代理:面向接口编程,屏蔽RPC处理流程
06 | RPC实战:剖析gRPC源码,动手实现一个完整的RPC
进阶篇 (10讲)
07 | 架构设计:设计一个灵活的RPC框架
08 | 服务发现:到底是要CP还是AP?
09 | 健康检测:这个节点都挂了,为啥还要疯狂发请求?
10 | 路由策略:怎么让请求按照设定的规则发到不同的节点上?
11 | 负载均衡:节点负载差距这么大,为什么收到的流量还一样?
12 | 异常重试:在约定时间内安全可靠地重试
13 | 优雅关闭:如何避免服务停机带来的业务损失?
14 | 优雅启动:如何避免流量打到没有启动完成的节点?
15 | 熔断限流:业务如何实现自我保护?
16 | 业务分组:如何隔离流量?
RPC实战与核心原理
登录|注册

09 | 健康检测:这个节点都挂了,为啥还要疯狂发请求?

何小锋 2020-03-09
你好,我是何小锋。昨天我们讲了超大规模集群“服务发现”的挑战,服务发现的作用就是实时感知集群 IP 的变化,实现接口跟服务集群节点 IP 的映射。在超大规模集群实战中,我们更多需要考虑的是保证最终一致性。其实总结来说,就一关键词,你要记住“推拉结合,以拉为准”。接着昨天的内容,我们再来聊聊 RPC 中的健康检测。
因为有了集群,所以每次发请求前,RPC 框架会根据路由和负载均衡算法选择一个具体的 IP 地址。为了保证请求成功,我们就需要确保每次选择出来的 IP 对应的连接是健康的,这个逻辑你应该理解。
但你也知道,调用方跟服务集群节点之间的网络状况是瞬息万变的,两者之间可能会出现闪断或者网络设备损坏等情况,那怎么保证选择出来的连接一定是可用的呢?
从我的角度看,终极的解决方案是让调用方实时感知到节点的状态变化,这样他们才能做出正确的选择。这个道理像我们开车一样,车有各种各样的零件,我们不可能在开车之前先去挨个检查下他们的健康情况,转而是应该有一套反馈机制,比如今天我的大灯坏了,那中控台就可以给我提示;明天我的胎压不够了,中控台也能够收到提示。汽车中大部分关键零件的状态变化,我作为调用方,都能够第一时间了解。
那回到 RPC 框架里,我们应该怎么设计这套机制呢?你可以先停下来想想汽车的例子,看看他们是怎么做的。当然,回到我们 RPC 的框架里,这事用专业一点的词来说就是服务的健康检测。今天我们就来详细聊聊这个话题。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《RPC实战与核心原理》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(15)

  • 楼下小黑哥
    以前做过类似健康检查。
    我们有个服务,需要通过银行安装在我们后台软件向银行分发交易。这个软件我们在使用过程发现会无故挂掉,为了能及时检测这种情况。
    我通过 openresty 写了一个小插件、通过 http 接口访问银行软件,查看银行软件是否挂了。然后接入 钉钉 webhook,触发机器人报警。
    这个健康检查啊我有个特别深刻记忆。由于当时是将 openresty 跟银行软件部署在同一台物理机器上去。某一天,整台机器挂了,报警机制当然也失效了。
    通过这件事,我现在每次部署服务时,会注意将服务部署在不同物理机器上,防止意外发生。

    作者回复: 历史总是深刻

    2020-03-11
    1
    5
  • etdick
    成功次数/调用总次数,建议加上总次数阀值。如果2次,一次成功,一次失败,就可能误判。例如调用总数>10次以上,成次数/调用次数<50%,才比较准确

    作者回复: 还是需要分场景对待的,没有最好的,只有最合适的。

    2020-03-12
    1
    4
  • Darren
    之前使用过返回状态保存在MQ中,有专门的消费者去消费消息,其中要是失败率大于阈值,直接调用注册中心,下线该服务,同时使用agent机制,自动重启有问题的服务,之后要是还会出现失败,则报警发出,人工介入。

    作者回复: 失败率统计是难点,需要考虑是否有网络设备坏或者不同idc问题

    2020-03-17
    2
  • 一步
    老师我认为心跳检测不应该接口的调用方来检测,这样的话调用接口的客户端量很大时,只是心跳检测就会把服务提供方的资源打满,而且当接口服务提供方很多时,客户端每个ip去健康检测也是不可能的

    作者回复: 不一定要接口纬度,一般情况下多个接口直接会共享tcp连接的,可以用tcp连接纬度

    2020-03-10
    2
    1
  • 阿卧
    健康检测:调用方向服务方发送心跳检测,如果超过3次(阈值可以设置)未响应则认为服务节点挂掉。
    会存在的遇到的问题
    1. 服务方会出现心跳正常响应,但是服务间歇性响应超时(亚健康状态),会导致调用方误判;可以用可用率的思路来解决。
    2. 调用方心跳机制出现问题,导致误判服务方挂掉;可以用调用方集群部署,其中一台调用显示正常则认为正常的办法来减少误判。
    Dubbo通过IdleStateHandler设置定时任务,服务空闲发送心跳,实现健康检测
    http://dubbo.apache.org/zh-cn/blog/dubbo-heartbeat-design.html
    2020-03-10
  • 看完这篇文章的感触是健康检查这套逻辑需要业务和运维的配合实现,业务要提供heath check的endpoint,运维要调用这个endpoint来查看服务的情况,所以在进一步,一些通用的框架会自动集成health check的功能并可以通过配置打开,当新服务上线的时候,监控检查功能会自动提供。

    作者回复: 是的,健康检查很重要

    2020-03-10
  • ple
    想问下。心跳检测文中说是调用方定时去看看提供方是否存活。但是平常好像不是这么做的,会有一台专门做健康检查的机器定时去调用健康检查接口,是说这两种方式都是可以的么 觉得第一种会不会做起来成本比较高?

    作者回复: 用其他机器去检查反映出来的结果不一定准,可能中间经过的网络设备不一样。

    2020-03-10
  • jiemoon
    健康检测是不是也要检测自己

    作者回复: 应用级别的检查也是需要的

    2020-03-09
    1
  • Reason
    接触的印象最深刻的检测机制是spring boot actuator的health端点了。有个问题没太理解请老师解惑,文末说检测程序可以分机房机架部署,检测程序是单独rpc框架的一套程序么?我理解一般是在rpc框架里的一个线程,不知道理解的对不?

    作者回复: 分机房部署不是说RPC,而是对应用存活检测

    2020-03-09
  • Reason
    接触到的健康检测机制,印象最深刻的是spring boot actuator包里的health端点。
    2020-03-09
  • Jackey
    最近在协助运维同学搞部署流程,其中一个步骤就是健康检测。之前是直接检查应用的状态,现在看来应该加上服务发现到应用的通信状态了
    2020-03-09
  • 忆水寒
    老师,我想问一下 应用程序僵住了,但是连接还在。这种情况是不是靠心跳超时 来判断是否需要移动到不正常状态。

    作者回复: 可以考虑心跳来解决

    2020-03-09
  • 高源
    老师我遇到一个棘手的问题,服务端win,客户端嵌入式Linux,之间socket通信,服务端有心跳检测,最近发现现象就是例如第一天服务端从早上8点启动然后客户端连接服务端大概10多个开始跑业务运行到下午17点,这时候呢电源关闭所有客户端与服务端断开,但不是正常关闭的,服务端检测不到客户端心跳,讲所有客户端已经连接关闭socket,服务端继续运行到第二天的8点,客户端又连服务端,出现了客户端反映能连接服务端,但是给服务端发数据包服务端没响应,这个时候我把所有客户端断开,只保留一个客户端,再重新连接服务端,还是刚才现象,排查服务端没有异常日志,但是细查发现服务端连记录客户端连接日志都没有,服务端进程和线程运行着通过工具检测。如果将服务端重启一下现象马上消失,所有客户端全部正常跑一整天没问题。这个现象只有服务端长时间开着从不关闭服务端程序才能有这个现象发生,并且客户端不正常关闭连接,强制关闭电源。请教老师如何排查,因为服务端没有异常日志,现在定位服务端监听客户端连接部分,但没有异常,日志也没记录哪个客户端访问上来。但是定位肯定是服务端问题。怎么排查,谢谢

    作者回复: 看看tcp链接是否正常

    2020-03-09
  • 每天晒白牙
    想请教老师,RPC 框架的心跳检测怎么做的呢?只听说过心跳检测这个概念,但在代码层面如何做,没有概念。看到老师在最后提到检测应用是否可用,可以在应用实例中开一个 url 供检测程序发 http 请求检测。但非应用级别的心跳检测也是这样做的吗?

    作者回复: 定时发心跳消息是最简单的方法,通过判断是否正常响应

    2020-03-09
    1
  • 🌀Pick Monster 🌀
    老师,内容看明白了,可用率这个指标具体怎么实现呢?因为一般使用RPC框架都是三方框架,我们是需要自己对三方接口进行重新实现吗?

    作者回复: 看看有没有插件支持

    2020-03-09
收起评论
15
返回
顶部