现在微服务是潮流,大多数时候,不管基础的微服务设施有没有搭建好,大项目能拆出来一个是一个,反正拆开了就是微服务。
所以系统从原来的函数调用,变成了 http 调用或者是 rpc 的调用。
原意是为了方便管理项目,提高灵活性等等,可是变为 http 调用后,服务变得不那么可靠了。
- 情况一,虽然服务不可靠,但是挂了就挂了,依赖这个服务的相关服务也挂了,正常
- 情况了,服务不可靠,而且接口响应时间很慢,那么这个时候,本身的服务可能因为这个服务拖垮。
这个时候也没有所谓的熔断器等等的基础设施。
那么有一种低配版的服务降级方法,就是借助 redis 来实现。伪代码如下:
// 获取当前被阻塞数
unhandledCount := redis.Get("unhandledCount_FUNC_NAME")
// 大于被阻塞数,直接返回失败
if unhandledCount > MAX_UNHANDLED_COUNT{
return fail
}else{
redis.Incr("unhandledCount_FUNC_NAME)
resp := http.get("http://url")
redis.Decr("unhandledCount_FUNC_NAME")
return resp
}
这种方法和 timeout 的方法来比的话,最大的好处就是,别的系统再怎么炸,就不会影响自己的系统。所以这种方法不仅适用与微服务的系统调用,所有依赖第三方的调用也可以通过这种方法保障自身服务稳定。
最后,这也只是一个变通的,低配版的方案,要实实在在的解决这个问题,还是要靠正统的方法。