资讯专栏INFORMATION COLUMN

架构设计-我的一个支持异步拉取数据和本地缓存client是如何设计的

bawn / 1196人阅读

最近的工作内容是封装一个高性能的sdk,以便和我们的配置中心进行交互,这里整理一下我是如何设计

1. 需求分析

我们要支持和配置中心的交互(网络IO)

支持客户端缓存功能,并且支持断电重启(内存缓存+文件缓存)

配置中心没有推送功能,sdk需要进行轮询(使用NIO网络模型进行轮询)

这个点其实设计的并不好,最好是开启一个长链接,由服务端推送请求是最佳实现,但是因为配置中心和客户端之间有一个中间层,无法实现长链接,不过这两个在实现上是类似的

2. 任务分解

针对网络IO 提供两套模型

当缓存中没有所需要的数据的时候,使用BIO直接读服务端(缓存击穿)

当缓存的存在的时候, 将缓存的数据添加到轮询队列中,等待下一次异步同步更新

针对缓存设计

内存缓存:除了需要提供一个数据缓存,还需要提供一个状态同步集合来标记缓存中数据的状态,比如是否超时,是否有效等

针对这个情况我们需要实现一个功能类---状态处理类,通过这个类来处理缓存中状态同步集合的状态,并同步处理数据缓存对应的状态

ps : 为什么设计成数据和状态分离 -> 为了更高的可控性和解藕 1.如果需要状态特殊处理的时候只需要拿出状态队列就可以进行处理了不需要动缓存 2. 如果状态需要添加字段或者逻辑,只需要修改对应的状态队列即可,不需要修改数据缓存

文件缓存: 这个本质上很内存缓存相似,只有一个点就是当使用nio进行数据同步的时候,nio从网络中拉取的新数据需要同步更新缓存和文件,此时的文件操作应该使用nio保证不堵塞。

轮询方法

我在框架中使用的NIO网络框架是vert.x 其实可以理解成java中的promise方法

这里我做的轮询逻辑其实非常简单过程如下

拿到需要进行轮询队列

for循环发起NIO网络请求,并且处理结果

更新缓存状态(更新缓存,处理超时等问题)

还需要那些改进?

需要添加一个速率控制器,考虑这样一个场景如果轮询发起的请求过大,将可能会把配置中心打垮,所以sdk需要控制请求的速率动态的调整qps来保证服务的稳定。

3. sdk整体的架构图如下

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/76112.html

相关文章

  • 分布式配置系统Apollo如何实时更新配置

    摘要:我们是不是很好奇配置中心如何做到实时更新并且通知到客户端的这也是一个面试中经常会问到的题目。客户端得到状态码是并且会根据立即去服务端拉取最新的配置。引言 记得我们那时候刚开始学习Java的时候都只是一个单体项目,项目里面的配置基本都是写在项目里面的properties文件中,比如数据库配置啥的,各种逻辑开关,一旦这些配置修改了,还需要重启项目这修改才会生效。随着各种微服务的诞生,服务的...

    NicolasHe 评论0 收藏0
  • 携程一面:分布式配置系统Apollo如何实时更新配置?

    摘要:我们是不是很好奇配置中心如何做到实时更新并且通知到客户端的这也是一个面试中经常会问到的题目。虽然是携程开源的,但是携程内部也不用它。客户端得到状态码是并且会根据立即去服务端拉取最新的配置。通过定时任务的补充,可以让配置达到最终的一致性。 引言记得我们那时候刚开始学习Java的时候都只是一个单体项目,项目里面的配...

    asce1885 评论0 收藏0
  • API网关如何实现对服务下线实时感知

    摘要:上篇文章缓存机制介绍了的缓存机制,相信大家对有了进一步的了解,本文将详细介绍网关如何实现服务下线的实时感知。目前网关实现的是对网关下游服务的实时感知,而且需满足以下条件生产者需部署在容器管理平台生产者做正常的下线升级或者缩容操作。 上篇文章《Eureka 缓存机制》介绍了Eureka的缓存机制,相信大家对Eureka 有了进一步的了解,本文将详细介绍API网关如何实现服务下线的实时感知...

    codeKK 评论0 收藏0

发表评论

0条评论

bawn

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<