nacos源码分析——如何下线被kill -9的实例

上文说到了服务实例的正常上下线,都是实例主动调接口完成的。但是如果实例被kill -9呢,就不会主动通知下线了。

如何处理这种情况,这个才是服务发现的重点了。

解决的办法就是 心跳+定时任务去判断,不过这里定时任务的分配也是有讲究了。

1 心跳

nacos源码分析——如何做心跳续约 中说到了,服务实例的心跳调用/clientBeat接口,会更新lastBeat为当前时间。


image.png
但是这个lastBeat时间要如何用起来呢?

2 定时任务

VirtualClusterDomain 会起个定时任务


image.png
一段时间没有收到心跳,就删除这个实例

image.png

3 定时任务的分配

上面的做法有个问题,nacos有很多服务器,每个服务器都要定时任务检查所有的服务列表吗?
如果重复的做,会有很大的资源浪费,而且如果都检查到超时了,都和leader通信说要下线,对网络的负担也比较高。

解决的办法就是 服务名hash % nacos服务器数目 ,得到其中一台 nacos服务器,如果是自己的话,就开始检查这个服务的实例列表,如果不是就跳过。

每个nacos服务器都这样去检查,自然会覆盖到所有服务的检查。

image.png
image.png
image.png

4 server列表同步

下重点来了,每个nacos服务器数是怎么保证healthyList(server列表)是一样的呢?
解决的办法仍然是心跳:

DistroMapper 初始化的时候会启动一个ServerStatusReporter

image.png
ServerStatusReporter 会向其他的nacos服务器发送心跳,证明自己是健康的
image.png

ServerStatusReporter的run方法的finally会继续调用自己,这样就相当于是个定时任务了。


image.png

实际调用的接口是 /api/serverStatus,收到请求的nacos服务器就会更新自己的healthyList。

如果一直没收到其他nacos服务器的心跳信息呢,这里就有个神奇的逻辑了:
ServerStatusReporter是会模拟发送心跳给自己,保证healthyList的逻辑一定会执行。。
image.png
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,079评论 19 139
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 11,224评论 6 13
  • 关于Mongodb的全面总结 MongoDB的内部构造《MongoDB The Definitive Guide》...
    中v中阅读 32,056评论 2 89
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,860评论 25 709
  • 《时间都去哪儿了》 文/六悦 忙碌是人生的常态,只是当它占据你生活大部分的时候,你真的会感慨时间都去哪儿了...
    六悦茗阅读 156评论 0 1