前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >服务探活的五种方式

服务探活的五种方式

原创
作者头像
龟仙老人
发布于 2022-01-13 03:08:05
发布于 2022-01-13 03:08:05
2.5K0
举报
文章被收录于专栏:捉虫大师捉虫大师

几个月前,我在《4个实验,彻底搞懂TCP连接的断开》这篇文章中给自己挖了个坑:

img1.png
img1.png

文中提到的实际问题就是服务探活,今天来填上这个坑。

微服务架构下,服务提供方(Provider)的节点一般不止一个,消费方(Consumer)根据负载均衡算法挑选一个健康的节点进行调用。识别Provider节点是否健康,这便是服务探活 要讨论的内容。

健康的节点可定义为能正常响应Consumer请求的节点,不健康自然是不能正常响应Consumer请求的节点

不健康的原因可能是物理上的断电、断网、硬件故障,也可能是网络延迟、进程异常退出或进程无法处理请求。

总之一句话总结起来就是Provider节点没有摘除流量前,就无法处理请求了。可以分为三类:

  • 系统异常:如断电、断网、其他硬件故障、或操作系统异常退出
  • 进程异常退出:进程异常退出,端口挂掉,如有注销机制但没来得及注销,如执行了kill -9
  • 进程无法处理请求:端口还在,但服务无法正常响应,如Full GC期间

一个Provider节点的状态只有健康和不健康,由健康到不健康称之为探死,由不健康到健康称之为探活,一般我们不分这么细,统一叫探活

至于是谁来探,可能是Consumer,也可能是注册中心,甚至是某个单独的探活组件。我们就从探活的发起者来列举目前主流的探活方式。

Consumer被动探活

最简单的是在Consumer侧进行探活,如果Consumer调用Provider报错,则Consumer将该Provider剔掉,为了防止偶发的网络抖动或其他干扰,可设置一个时间窗口,窗口内失败达N 次则剔除,当过了这段时间,再把这个Provider重置为正常。

这种方式的典型代表是Nginx,Nginx可配置多长时间内,失败多少次则认为该Provider不可用,其失败可以是连接失败、也可以是某些http状态码(如4xx,5xx)

这种方案的缺点很明显,需要真实流量去检测,如果配置了失败继续转发给下一个Provider,则时间窗口的开始的一段时间内耗时上升,未配置则直接报错,所以无论怎么配置,对服务都是有影响的。

Consumer主动探活

Consumer被动健康检查的主要问题在于使用了真实流量检测,其实只要稍微改一改,使用旁路的方式去检测即可避免。

阿里的Tengine开源了一个nginx_upstream_check_module模块来做主动健康检查。

这个旁路可以一直去探测Provider,当检测到异常时,将其标记为不可用状态,请求不再发往该Provider,若检测到Provider 健康时,再将其标记为健康。

Consumer侧的探活在RPC框架实现的比较少,不知道是基于怎样的一种考虑,其实有些企业内会在Consumer侧已经加入了探活机制,比如爱奇艺在Dubbo的Consumer侧增加了探活机制,其实我所在的公司内部RPC框架也是有Consumer侧的服务探活。

参考《爱奇艺在 Dubbo 生态下的微服务架构实践》

但Dubbo官方没有集成,至于为什么,我也去github上问过,不过没人回复~

Provider上报心跳

当有一个注册中心时,探活这项任务就可以交给注册中心了。

最简单的,我们想到了心跳保持这个策略,Provider注册成功后,一直向注册中心发送心跳包,注册中心定时检查Provider,如果长时间未发送心跳包,就将其置为不可用,并告知Consumer,如果心跳恢复,则将其恢复并通知。

某些组件也支持这种续约的特性,如etcd、redis等都可以构建类似的系统。

这种方式的代表是Nacos 1.x 版本中的临时实例

慢慢你会发现这种方式摘除故障节点的时效性和资源的使用成正相关,如果你想要更好的时效性,就必须缩短心跳间隔,从而会增加心跳请求量,每次心跳得更新每个节点的上次心跳时间,占用了大量资源。

Provider与注册中心会话保持

为了解决心跳请求占用大量资源的问题,我们想到了TCP 连接不是一个天然的健康检查机制吗?如果仅仅依靠TCP连接可以吗?

这就是之前文章埋下的坑,再次总结一下这篇文章《4个实验,彻底搞懂TCP连接的断开》中关于TCP连接断开的场景:

  • 如果是进程终止、无论是正常或者是异常,只要操作系统还在,TCP连接就会正确断开
  • 如果是断电、断网或其他因素导致操作系统挂掉,则网络不一定能正确断开,还得分情况
    • 如果此时注册中心有往Provider发送数据,那么是能及时感知到Provider的异常,并断开连接的
    • 如果注册中心没有往Provider发送数据,是不能及时感知连接的断开,即使配置了TCP的KeepAlive,也需要大概2小时才能感知到

2小时肯定不能接受,为了防止这种情况,光靠TCP是不够的,还得在应用层实现一个心跳检测,为了节省资源,可以将心跳包设计的很小,发送频率不需要那么高,通常1分钟内能感知即可。

因为只有断电、断网或硬件故障才会导致无法感知连接的断开,这个比例很小。

可以参考下图,虽然图中的数据是我杜撰的,但八九不离十吧,可以看到系统异常只占1%,这1%中未发数据可能更少,所以可以认为这个概率很小。

img2.png
img2.png

这种方式比较常见,像Dubbo使用的Zookeeper,Nacos 2.x版本(gRPC)的临时实例,SOFARegistry等等都用了这这种方式。

其中SOFARegistry比较有意思,它提出了一种连接敏感的长连接,乍一看以为用了什么黑科技,后来看了代码发现就是TCP连接加应用层的心跳检测,这些被他们封装在SOFABolt通信框架中。

img3.png
img3.png

参考《海量数据下的注册中心 - SOFARegistry 架构介绍》https://mp.weixin.qq.com/s/mZo7Dg6gfNqXoetaqgwMww

但这个方式也有一个明显的缺点,如果网络状况不好的情况下,TCP连接比较容易断开,会导致节点频繁上下线。

注册中心主动探测

除了上述的方式,还有一种注册中心(甚至是一个单独的组件)主动探测Provider的方式,与Consumer主动探测类似,只不过把探测任务移交给了注册中心或一个单独的组件。

主动探测有个最大的优势是可以扩展非常丰富的探测方式,比如最常见的探测端口是否存活,又或者探测Provider的一个http接口返回是否符合预期,甚至可以扩展为MySQL、Redis等等协议的探测。

这也是种能解决服务假死的探活方式,Nacos中的永久实例探活就是采用的这种方式。

但这种方式在实际使用的时候要考虑主动探测组件的高可用,高可用就得存在副本,可采取主备方式。

如果单机存在性能瓶颈,还得分布式探活,主备可能就不适合,得有一个分布式协调者,这要说又得长篇大论。但这里你知道有这么个事儿就可以了。

考量探活的指标有三个:

  • 能不能探出来?——功能性
  • 什么时候探出来?——时效性
  • 会不会探错了?——稳定性

功能上最强的是带语义的主动探测,时效性最强的要属长连接会话保持。

稳定性不好说谁强谁弱,但一般会给一个集群设置一个探活摘除的比例,比如最多摘除50%机器,防止探活错误导致节点全部下线,这也算是一种兜底策略吧。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java面试系列之Nacos健康检查机制
Nacos是阿里巴巴开源的注册中心和配置中心的技术解决方案,目前有很多公司都在使用它,并落地到自己的业务产品中,好吧你们知不知道它是支持健康检查机制的呢?下面我将带着大家一起来理解它的健康检查机制的核心原理及业务背景。
35岁程序员那些事
2022/09/23
1.2K0
一言不合就重构
前段时间不是在忙么,忙的内容之一就是花了点时间重构了一个服务的健康检查组件,目前已经慢慢在灰度线上,本文就来分享下这次重构之旅,也算作个总结吧。
龟仙老人
2022/11/30
8222
一言不合就重构
当我们谈注册中心时谈什么?
注册中心对于服务提供者需要具备服务注册、注销的能力,对于服务消费者需要提供查询服务、感知服务变化的功能。当然还需要解决一些其他问题才能成为一个优秀的注册中心,如高可用、高性能、水平扩展能力、服务探活能力、路由功能、多机房(多活)能力等。
龟仙老人
2020/12/16
6120
如何组装一个注册中心
标题本来想叫《如何设计一个注册中心》,但网上已经有好多类似标题的文章了。所以打算另辟蹊径,换个角度,如何组装一个注册中心。
龟仙老人
2022/07/27
6330
如何组装一个注册中心
Nacos实战(19)-Nacos健康检查机制:保障你的服务稳定运行!
注册中心不应仅提供服务注册和发现功能,还应保证对服务可用性监测,对不健康的服务和过期的进行标识或剔除,维护实例的生命周期,以保证客户端尽可能的查询到可用的服务列表。
JavaEdge
2023/09/10
9880
Nacos实战(19)-Nacos健康检查机制:保障你的服务稳定运行!
Nacos架构与原理 - 健康检查机制
前者依赖客户端自我报告,较易失效或延迟发现问题。后者由服务端定期检查,可更快准确发现客户端异常。但也增加服务端负载。
小小工匠
2023/07/11
4480
Nacos架构与原理 - 健康检查机制
Nacos注册中心之概要设计
注册中心的核心比配置中心多一个服务探活模块,他俩的相似度非常高,甚至阿里内部的注册中心就叫ConfigServer。
龟仙老人
2021/08/06
1.1K0
架构设计之微服务注册中心选型
ZooKeeper、Consul、Eureka和新生的Nacos 都实现了注册中心的功能。那么从哪些方面进行对比,进而选型呢?
Bug开发工程师
2019/05/15
1.8K0
聊一聊微服务架构中的服务发现系统
导语:本文围绕服服务调用模式、一致性取舍、服务提供者的健康检查模式等方面,讨论了服务发现的技术选型和设计的各种优缺点,希望能够帮助大家在选择或者使用服务发现系统的时候更加顺畅。
腾讯云中间件团队
2021/03/24
7940
聊一聊微服务架构中的服务发现系统
系统高可用之健康检查和健康度量那些事
随着人们的生活水平的不断提高,人们对身体健康越来越重视,很多人都做过体检,一般公司都会有一年一度的体检福利,健康体检是家喻户晓了。
2020labs小助手
2021/04/26
1.3K0
小学生也能看懂的微服务节点判活难题
就是【服务Consumer】以【注册中心】中的数据为准,当服务端节点有变更时,【注册中心】会把变更通知给【服务Consumer】,【服务Consumer】就调用【注册中心】拉取最新的节点信息。
JavaEdge
2021/04/25
3570
Nacos架构与原理 - 注册中心的设计原理
目前的网络架构是每个主机都有⼀个独立的 IP 地址,那么服务发现基本上都是通过某种方式获取到服务所部署的 IP 地址。
小小工匠
2023/07/11
6970
Nacos架构与原理 - 注册中心的设计原理
一种心跳,两种设计
在前一篇文章《聊聊 TCP 长连接和心跳那些事》中,我们已经聊过了 TCP 中的 KeepAlive,以及在应用层设计心跳的意义,但却对长连接心跳的设计方案没有做详细地介绍。事实上,设计一个好的心跳机制并不是一件容易的事,就我所熟知的几个 RPC 框架,它们的心跳机制可以说大相径庭,这篇文章我将探讨一下如何设计一个优雅的心跳机制,主要从 Dubbo 的现有方案以及一个改进方案来做分析。
kirito-moe
2019/03/15
1.2K0
[MCP学习笔记]MCP 服务注册中心:节点发现与健康监测机制
分布式系统架构成为构建大规模、高并发应用的首选方案。然而,分布式系统也带来了新的挑战,其中之一就是服务治理问题。在这样的背景下,MCP 服务注册中心应运而生,旨在解决分布式系统中服务发现与健康监测等关键问题。
数字扫地僧
2025/04/22
1480
[MCP学习笔记]MCP 服务注册中心:节点发现与健康监测机制
给dubbo贡献源码,做梦都在修bug
在之前的文章《redis在微服务领域的贡献》中,从一次面试经历中了解了redis可以在微服务中玩的这么溜,同时也从源码角度分析了dubbo的redis注册中心。最后得出了dubbo的redis注册中心不能用于生产的结论,其中原因有如下两点:
龟仙老人
2021/06/15
4820
长连接和心跳的那些事儿
心跳和长连接在一起介绍的原因是,心跳能够给长连接提供保活功能,能够检测长连接是否正常(这里所说的保活不能简单的理解为保证活着,具体来说应该是一旦链路死了,不可用了,能够尽快知道,然后做些其他的高可用措施,来保证系统的正常运行)。
涤生
2018/08/14
1.4K0
两种健康检查机制
Spring Cloud Alibaba Nacos 作为注册中心不止提供了服务注册和服务发现功能,它还提供了服务可用性监测的机制。有了此机制之后,Nacos 才能感知服务的健康状态,从而为服务调用者提供健康的服务实例,最终保证了业务系统能够正常的执行。
磊哥
2022/05/09
8580
两种健康检查机制
Go进阶训练营 – 微服务概览与治理三:gRPC & 服务发现
消费者可以直接感知提供者的状态,保障消费者和注册中心网络不稳定的情况下,也能及时将异常服务提供者从本地负载均衡池中移除。同理,提供者正常运行后,也能被消费者感知,重新加入负载均衡池。
Yuyy
2022/09/21
1.8K0
Go进阶训练营 – 微服务概览与治理三:gRPC & 服务发现
我在组内的Nacos分享
Nacos : Naming and Configuration Service,可打包部署配置中心和注册中心,也可独立部署其中之一,配置中心、控制台依赖mysql,由阿里巴巴2018年8月开源,github 19.1k star(截止2021.08.24)
龟仙老人
2021/08/26
1.1K0
ES异地双活方案
原理类似分布式选举那一套,当一个master节点宕机时,剩下2个投票选出1个新老大,整个集群可以继续服务。对于核心系统,只部署单机房总归有点不保险,万一单机房故障就废了(比如:断电断网、或光缆被挖断)。那有同学肯定会想,多弄几个机房,把集群中的节点分散到多个机房不就好了么?
菩提树下的杨过
2021/04/01
4.6K0
ES异地双活方案
相关推荐
Java面试系列之Nacos健康检查机制
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档