Martian-cloud 4.0.2,丢弃心跳机制,解决网络压力问题

首先,有人可能对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. 然后是垃圾回收机制

垃圾回收很简单,就是定时去本地缓存中扫描出被下线的服务的接口,然后删除掉。

上面这这一套机制,可以保证当服务宕机以后,接口会自动从其他的服上下线

官方网站

http://mars-framework.com/index.html

猜你喜欢

转载自www.oschina.net/news/120538/martian-cloud-4-0-2-released