大家耐心看下去,你会发现原来计算机基础知识的用处,相信我,你会感触很深刻。
案例需求
====
后台通常是由多台服务器对外提供服务的,也就是所谓的集群。
如果集群中的某一台主机宕机了,我们必须要感知到这台主机宕机了,这样才做容灾处理,比如该宕机的主机的业务迁移到另外一台主机等等。
那如何感知呢?那就需要心跳服务了。
要求每台主机都要向一台主机上报心跳包,这样我们就能在这台主机上看到每台主机的在线情况了。
心跳服务主要做两件事情:
-
发现宕机的主机;
-
发现上线的主机。
看上去感觉很简单,但是当集群达到十万,甚至百万台的时候,要实现一个可以能管理 《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》开源 这样规模的集群的心跳服务进程,没点底层知识是无法做到的。
接下来,将从三个维度来设计这个心跳服务:
-
宕机判断算法的设计
-
高并发架构的设计
-
传输层协议的选择
宕机判断算法的设计
=========
这个心跳服务最关键是判断宕机的算法。
如果采用暴力遍历所有主机的方式来找到超时的主机,在面对只有几百台主机的场景是没问题,但是这个算法会随着主机越多,算法复杂度也会上升,程序的性能也就会急剧下降。
所以,我们应该设计一个可以应对超大集群规模的宕机判断算法。
我们先来思考下,心跳包应该有什么数据结构来管理?
心跳包里的内容是有主机上报的时间信息的,也就是有时间关系的,那么可以用「双向链表」构成先入先出的队列,这样就保存了心跳