8.19如何识别服务节点是否存活

titledatecommentscategoriestagspermalink
如何识别服务节点是否存活
2020/5/27
true
微服务
微服务
8.19

在服务治理中十分重要的一点就是如何识别服务节点的存活。以ZooKeeper为例,其判断节点存活的机制其实就是中心摘除机制,服务消费者以注册中心的数据为准,当服务节点有变更的时候,注册中心就会把变更通知给服务消费者,服务消费者就会调用注册中心来拉取最新的节点信息。

这种机制在大多数情况下都可以工作的很好,但是在网络频繁抖动的时候,服务提供者向注册中心汇报心跳信息的时候可能会失败,如果在规定的时间内,注册中心都没有收到服务提供者的心跳信息,就会把这个节点从可用节点中移除。更糟糕的是,在服务池拥有上百个节点的时候,每个节点都可能被移除,导致注册中心可用节点的状态一直在变化,这个时候该如何处理呢?

心跳开关保护机制

在网络频繁抖动的情况下,注册中心可用的节点会不断变化,这时候服务消费者会频繁收到服务提供者节点变更的信息,于是就不断地请求注册中心来拉取最新的可用节点信息。当有成百上千个服务消费者同时请求注册中心的时候,可能会把注册中心的带宽占满,尤其是注册中心是百兆网卡的情况下。

所以针对这种情况,需要一种保护机制,及时在网络频繁抖动的时候,服务消费者也不至于同时去请求注册中心获取最新的服务节点信息

一个可行的解决方案是给注册中心设置一个开关,当开关打开时,即使网络频繁抖动注册中心也不会通知所有的服务消费者服务节点信息变更,比如只给10%的服务消费者返回变更,这就把注册中心的请求量降低到了原来的十分之一。

当然打开一个开关也是有一定代价的,它会导致服务消费者感知最新服务节点信息有延迟。正常情况下几秒钟就可以获得信息的,现在可能要几分钟甚至几十分钟。所以在网络正常的情况下,开关应该处于关闭状态,只有在网络抖动的时候才打开。

服务节点摘除保护机制

服务提供者在进程启动时,会注册服务到注册中心,并每隔一段时间,汇报心跳给注册中心,以标识自己的存活状态。如果隔了一段固定时间后,服务提供者仍然没有汇报心跳给注册中心,注册中心就会认为该节点已经处于“dead”状态,于是从服务的可用节点信息中移除出去。

如果遇到网络问题,大批服务提供者节点汇报给注册中心的心跳信息都可能会传达失败,注册中心就会把它们都从可用节点列表中移除出去,造成剩下的可用节点难以承受所有的调用,引起“雪崩”。但是这种情况下,可能大部分服务提供者节点是可用的,仅仅因为网络原因无法汇报心跳给注册中心就被“无情”的摘除了。

这个时候就需要根据实际业务的情况,设定一个阈值比例,即使遇到刚才说的这种情况,注册中心也不能摘除超过这个阈值比例的节点

这个阈值比例可以根据实际业务的冗余度来确定,更具过往经验通常会把这个比例设定在 20%,就是说注册中心不能摘除超过 20% 的节点。因为大部分情况下,节点的变化不会这么频繁,只有在网络抖动或者业务明确要下线大批量节点的情况下才有可能发生。而业务明确要下线大批量节点的情况是可以预知的,这种情况下可以关闭阈值保护;而正常情况下,应该打开阈值保护,以防止网络抖动时,大批量可用的服务节点被摘除。

总结一下,心跳开关保护机制,是为了防止服务提供者节点频繁变更导致的服务消费者同时去注册中心获取最新服务节点信息;服务节点摘除保护机制,是为了防止服务提供者节点被大量摘除引起服务消费者可以调用的节点不足。

所以,无论是心跳开关保护机制还是服务节点摘除保护机制,都是因为注册中心里的节点信息是随时可能发生变化的,所以也可以把注册中心叫作动态注册中心。

因此可以换个思路,服务消费者并不严格以注册中心中的服务节点信息为准,而是更多的以服务消费者实际调用信息来判断服务提供者节点是否可用。

静态注册中心

所谓静态注册中心,其实就是把前面说的心跳机制直接用在服务消费者这一端。

因为服务提供者是向服务消费者提供服务的,是否可用服务消费者应该比注册中心更清楚,因此可以直接在服务消费者端根据调用服务提供者是否成功来判定服务提供者是否可用。如果服务消费者调用某一个服务提供者节点连续失败超过一定次数,可以在本地内存中将这个节点标记为不可用。并且每隔一段固定时间,服务消费者都要向标记为不可用的节点发起保活探测,如果探测成功了,就将标记为不可用的节点再恢复为可用状态,重新发起调用。

这样的话,服务提供者节点就不需要向注册中心汇报心跳信息,注册中心中的服务节点信息也不会动态变化,也可以称之为静态注册中心。

从我(课程作者)的实践经历来看,一开始采用了动态注册中心,后来考虑到网络的复杂性,心跳机制不一定是可靠的,而后开始改为采用服务消费者端的保活机制,事实证明这种机制足以应对网络频繁抖动等复杂的场景。

当然静态注册中心中的服务节点信息并不是一直不变,当在业务上线或者运维人工增加或者删除服务节点这种预先感知的情况下,还是有必要去修改注册中心中的服务节点信息。

比如在业务上线过程中,需要把正在部署的服务节点从注册中心中移除,等到服务部署完毕,完全可用的时候,再加入到注册中心。还有就是在业务新增或者下线服务节点的时候,需要调用注册中心提供的接口,添加节点信息或者删除节点。这个时候静态注册中心有点退化到配置中心的意思,只不过这个时候配置中心里存储的不是某一项配置,而是某个服务的可用节点信息。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值