概述
1.三级缓存是哪三级?
第一级: 是多个缓存的总称
- eureka server 全量注册表
com.netflix.eureka.registry.AbstractInstanceRegistry#registry
是一个ConcurrentHashMap<String, Map<String, Lease>> 对象。 - eureka server 增量注册表
recentlyChangedQueue
这是一个ConcurrentLinkedQueue对象。 getApplicationsForVip
从全量注册表中获取带有vipAddress
和secureVipAddress
的服务实例信息进行缓存
第二级缓存:
com.netflix.eureka.registry.ResponseCacheImpl#readWriteCacheMap
这是一个LoadingCache
对象,是属于Guava
的一种内存缓存机制,它提供了key过期,动态的自动的加载数据到缓存中。这样的实现是为了只需要缓存热点key,减少内存使用,提高效率。key设置的是180秒过期
第三级缓存:
com.netflix.eureka.registry.ResponseCacheImpl#readOnlyCacheMap
这是一个ConcurrentMap<Key, Value> 对象。 属于只读缓存,每30秒会刷新一次readOnlyCacheMap
,这个是可以开启或者关闭的,通过shouldUseReadOnlyResponseCache参数配置。
2.三级缓存初始化
第一级缓存的初始化就不说,在讲解eureka server 初始化,eureka server 接收注册和心跳的时候已经进行讲解。
第二级缓存readWriteCacheMap
,这个的初始化是在DefaultEurekaServerContext 初始化阶段进行初始化的。
三级缓存的初始化:
在readWriteCacheMap
下方进行初始化,并开启了一个定时任务,每30秒会清理一次只读缓存,并从readWriteCacheMap
中读取数据到readOnlyCacheMap
中。
3.三级缓存特点
一级缓存是实时变化的,是eureka server 运行的根本,在eureka server 启动阶段,接收请求阶段等一级缓存都会发生变化。
二级缓存是对一级缓存的冷热key缓存,而且提供了缓存失效的方法com.netflix.eureka.registry.AbstractInstanceRegistry#invalidateCache
。当注册表或者增量列表发生变化时,就会缓存失效。
三级缓存是对读写缓存的缓存,它主要解决读写缓存频繁失效而导致拉取注册表和增量注册表时,请求直击eureka server 本地缓存注册表的情况。
因为eureka server本地注册表是一个频繁读写的ConcurrentHashMap,为了减轻它的压力,才引入了读写缓存。
而读写缓存为了保持和eureka server本地缓存的一次性,在修改本地缓存的同时会让读写缓存失效。
只读缓存的存在目的在我认为就是针对短期重启行为和短期网络波动行为进行一个客户端注册表保护。
4.三级缓存优缺点
优点:
- 读写缓存保证数据一致性,减少本地注册表registery的压力,同时还能针对热key处理
- 只读缓存可以降低客户端对于短期服务重启行为和短期网络波动的应激反应,加快拉取注册表和增量注册表的速度
缺点:
- 增加维护成本和系统复杂度
- 只读缓存会有个30秒缓存,这段时间注册表的变化,客户端无法感知,所以服务端可能访问出现异常,这就要考虑程序的健壮性了。
最后
以上就是可靠发卡为你收集整理的【源码】eureka的 三级缓存之设计探索的全部内容,希望文章能够帮你解决【源码】eureka的 三级缓存之设计探索所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复