熔断机制(Circuit Breaker),也叫断路器设计模式。具体可以参见大神的文章。
如果要熔断,客户端首先需要知道服务是否可用。pigeon会定时发送心跳包,通过服务端返回的情况来确定,服务端是否可用,类似ping-pong请求。当ping-pong的失败率超过某一个阈值后,将会通过配置参数来确定是否自动摘除相对应的节点,同时断开与服务端的连接。客户端还有一个定时任务会重连这些断开的连接,重连后将会再次进行心跳检测,如果成功就会将这个服务重新加入到可用服务节点中去。
其实之前的设计本不是这样,之前会对同一个服务的不同实例进行检测,如果心跳有问题也会pickoff。但是一开始考虑全部挂掉是个小概率事件,或者说是检测本身可能有问题,所以当摘除节点数大于所有实例数的50%以上时,将不再摘除节点。可是在实际的应用过程中,发现某个服务的全部实例挂掉是非常常见的事情,这种不摘除干净的做法和容易引起大面积服务挂掉,故最新的版本做了修改,更新为前述的熔断方式。
降级,