首先,有人可能对Martian-cloud不了解,甚至是第一次听说,所以有兴趣的朋友可以先看下详细的原理
https://www.bilibili.com/read/cv8314554
好了下面切入主题,本次升级,所解决的问题正如标题所说,通过丢弃心跳机制,来解决网络压力
心跳机制丢弃后如何实现下线通知
1. 首先是自私机制
所谓的自私机制,就是每个服务只顾自己,不管别人,每个服务如果发现自己本地缓存的接口连接不上,那就会从本地把他下掉,至于别人,他是不管的。
2. 投票机制
这是每个服务的内部投票,跟外面无关,如果一个服务发现他本地缓存的某个接口连接不上,那么他就会给这个接口指向的服务投一票,让它从本机下线,当调通后会把票数清0,当票数积累到一定程度时,这个服务的所有接口都会被从当前服务上清理掉。【每个服务都有一套这样的机制,来维护自己的本地接口缓存】
3. 如果(下线某个服务的决定)是误判怎么办
有一个补偿机制,就是每个服务在下掉别的服务的时候,都会给被下掉的那个服务发一个通知,让他把自己从已广播列表中移除(比如A服务调不通B服务的接口,当票数累积到一定程度后,A会把B的接口全部清理掉,清理后A会给B发一个通知,让B把A从已广播列表移除,这样如果B服务没挂,那么B在下一次轮询时 会把接口重新广播给A)
如果B服务明明没挂,但是A服务连续调不通,而且连下线通知都无法通知到B服务,那我只能说B服务活该了,即使是误判也比留着报错影响性能好吧。
4. 调不通的情况有很多,不一定是服务挂了,那么什么样的情况会给服务投下线票
很简单,当调用接口时,出现了以下三种异常,就会投票
ConnectException ,连接不上,这不是404之类的,而是根本连不上这个ip:port
UnknownHostException,无法解析地址,提供的 ip:port 无法被解析识别
SocketTimeoutException,连接超时,不是read time out,而是 connect time out
5. 然后是垃圾回收机制
垃圾回收很简单,就是定时去本地缓存中扫描出被下线的服务的接口,然后删除掉。
上面这这一套机制,可以保证当服务宕机以后,接口会自动从其他的服上下线
但我还是想说,有时候常规是需要打破的。
首先,我这一套设计,是没有注册中心的,下掉服务 仅仅是从自己的本地接口表中下掉,跟别人无关。举个例子: 比如A连续调用B都调不通,但是C却一直都能正常调用B, 那么A达到了一定票数,就会把B下掉,但是这个时候C并没有把B下掉,所以A下掉B这个的举动并不影响别人。
我这里自己造了个名词,叫自私机制,既然每个服务都是自私的,只顾自己,那么他下掉什么接口,又何必跟别人达成共识呢? 不管别人怎么样,反正A就是连续的调不通B,他为什么要为了所谓的共识,而一次次的被B拒绝呢? 干脆下掉比较好吧。
而且下掉的条件也很苛刻,就是我文章中提到的三个条件,必须是连接不上才会下掉,其他的像什么响应过慢啊,读取超时之类的,都不构成下线的条件。