兜底是服务高可用的有效手段之一,一般用于对业务要求较高,服务可用性较强的场景
兜底常用的手段有:try catch捕获异常指定兜底逻辑;默认值兜底;缓存崩溃数据库兜底等等
接下来介绍另一场兜底策略:副本兜底,被用在我们服务的核心链路上。
副本兜底
什么叫副本兜底呢,就是记录接口不同请求参数情况下,各自的最近的一次返回值,有且只记录最近的一次返回值。如果接口异常,直接返回对应请求参数的最近一次返回值。但是不可能记录所有参数的返回值,只记录热点参数的返回值,非热点参数执行接口的频率很低,允许少量的失败,这里就需要用到lru淘汰算法,淘汰非热点数据,保留热点数据。
代码实现
这里用到guava的本地缓存工具包,自带lru淘汰算法
public class LocalTest {
//guava本地缓存,只存储1000条缓存,非热点缓存自动淘汰,12小时都未更新的缓存也会自动过期
private static final LoadingCache<Integer, Optional<Object>> CACHE
= CacheBuilder.newBuilder()
.maximumSize(