【源码】eureka的 三级缓存之设计探索

1.三级缓存是哪三级?


第一级: 是多个缓存的总称

  1. eureka server 全量注册表 com.netflix.eureka.registry.AbstractInstanceRegistry#registry 是一个ConcurrentHashMap<String, Map<String, Lease>> 对象。
  2. eureka server 增量注册表 recentlyChangedQueue 这是一个ConcurrentLinkedQueue对象。
  3. getApplicationsForVip 从全量注册表中获取带有vipAddresssecureVipAddress 的服务实例信息进行缓存

第二级缓存:

com.netflix.eureka.registry.ResponseCacheImpl#readWriteCacheMap 这是一个LoadingCache对象,是属于Guava的一种内存缓存机制,它提供了key过期,动态的自动的加载数据到缓存中。这样的实现是为了只需要缓存热点key,减少内存使用,提高效率。key设置的是180秒过期


第三级缓存:

com.netflix.eureka.registry.ResponseCacheImpl#readOnlyCacheMap 这是一个ConcurrentMap<Key, Value> 对象。 属于只读缓存,每30秒会刷新一次readOnlyCacheMap ,这个是可以开启或者关闭的,通过shouldUseReadOnlyResponseCache参数配置。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AjABxybk-1622171302848)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/fd8dcbf4-2e4a-40ce-b2bb-33c1abc09c2a/07__(1)].png)



2.三级缓存初始化

第一级缓存的初始化就不说,在讲解eureka server 初始化,eureka server 接收注册和心跳的时候已经进行讲解。

第二级缓存readWriteCacheMap ,这个的初始化是在DefaultEurekaServerContext 初始化阶段进行初始化的。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XeTVXpYT-1622171302852)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/775aebec-3e9c-4041-875c-530b28952d7f/Untitled.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gwXh0Gr3-1622171302857)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/cca45341-27d7-4ace-94f1-6b123e2e9d1b/Untitled.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Uduh0glU-1622171302861)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/61e489c6-ef5c-4715-8f34-981e33527613/Untitled.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Gzs9KAwF-1622171302864)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/20d46680-8db2-4d68-b736-36b6870b9ab3/Untitled.png)]



三级缓存的初始化:

readWriteCacheMap下方进行初始化,并开启了一个定时任务,每30秒会清理一次只读缓存,并从readWriteCacheMap中读取数据到readOnlyCacheMap中。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X0svFvvK-1622171302870)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/d1e49531-df26-4b02-99f9-a65efd8dae25/Untitled.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p3rMQuFx-1622171302873)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/7f7ad95a-84e4-4d99-90ba-7982f8bacc35/Untitled.png)]



3.三级缓存特点

一级缓存是实时变化的,是eureka server 运行的根本,在eureka server 启动阶段,接收请求阶段等一级缓存都会发生变化。

二级缓存是对一级缓存的冷热key缓存,而且提供了缓存失效的方法com.netflix.eureka.registry.AbstractInstanceRegistry#invalidateCache 。当注册表或者增量列表发生变化时,就会缓存失效。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hKUMl61h-1622171302874)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/a505397f-fb28-465c-9876-3280faebb62a/Untitled.png)]


三级缓存是对读写缓存的缓存,它主要解决读写缓存频繁失效而导致拉取注册表和增量注册表时,请求直击eureka server 本地缓存注册表的情况。

因为eureka server本地注册表是一个频繁读写的ConcurrentHashMap,为了减轻它的压力,才引入了读写缓存。

而读写缓存为了保持和eureka server本地缓存的一次性,在修改本地缓存的同时会让读写缓存失效。

只读缓存的存在目的在我认为就是针对短期重启行为和短期网络波动行为进行一个客户端注册表保护。



4.三级缓存优缺点

优点:

  1. 读写缓存保证数据一致性,减少本地注册表registery的压力,同时还能针对热key处理
  2. 只读缓存可以降低客户端对于短期服务重启行为和短期网络波动的应激反应,加快拉取注册表和增量注册表的速度

缺点:

  1. 增加维护成本和系统复杂度
  2. 只读缓存会有个30秒缓存,这段时间注册表的变化,客户端无法感知,所以服务端可能访问出现异常,这就要考虑程序的健壮性了。
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值