一、为什么我们需要客户端即时刷新本地缓存
为了避免线上舆情问题,一个产品需要能快速下掉某些功能,立刻刷新某些资源的能力。 比如说客户端会请求A接口,A接口返回后台运营配置的消息。如果后台运营配置错了,同时在客户端本地这个接口客户端缓存了数据,缓存时间比较长,是一天,如果运营配置了一些错误的信息,想立刻更正。那么就可以用下面的方案去实现一个快速通知客户端的能力。
- 需要建立能及时下线掉线上某些功能的能力(包括有客户端缓存的情况、客户端不需要与服务端交互的功能)
- .需要建立能及时刷新客户端缓存的能力
二、如何实现
方案1 ETAG
方案2 在网关上配置通用返回体
在网关上配置,拦截每个请求,使任意接口的response header中下发ICG: [0,1,-1,0,1] 这样的开关字符串。
第一位代表A接口,第二位代表B接口以此类推,0代表改接口不能走缓存,需要直接请求,1代表,缓存没过期就可以继续用缓存, -1代表该功能紧急下线不再使用。
每个接口都会在response header中返回这串开关字符串,只要用户还有接口网络请求,就能及时下线某些功能的缓存或者停用该功能。
方案3 定时请求配置接口
为了防止用户的客户端始终没有触发与服务端通信的情况,我们需要客户端有一个定时器来定时查询服务端配置接口。
配置接口需要哪些必要元素?
| 元素 | 描述 |
|---|---|
| [String]configVersion | 配置的版本号,目的是为了方便比较,客户端会将这个值存到本地;与网关头部给的版本号比较,这样客户端就可以知道是否需要刷新配置数据 |
| [String]modulesId | 多个模块的编码,为了节省传输的数据量,通过这个字段就可以知道客户端需要的配置模块以及版本 |
| [boolean]incremental | 增量的配置,还是全量的配置 |
| [obj] configList | 每个模块配置项的值 |
每个配置项要有什么元素(configList)
| 元素 | 描述 |
|---|---|
| [String]module | 配置模块,如net网络配置,download下载配置 |
| [String]protoclVersion | 配置模块的版本号 |
| [KV对]moduleConfigs | 配置的KV对(可能是全部的KV,也可能只是增量的KV) |
方案4 客户端使用预测模型预测具体时间请求配置接口
客户端本地写一个简单的预测模型,在预测模型预测的时间点请求配置接口。
方案5 PUSH透传主动通知用户
搭建push能力,发送push通知给客户端,在紧急情况下能立刻处理问题。
总结
建议使用方案2+方案3,方案3在前期也不需要过早的设计完整的配置接口,如果仅仅只是要满足快速下掉某些功能,立刻刷新某些资源的能力,在网关上配置只要客户端访问/config接口即返回200即可。/config本身也是一个接口,也会携带response header中的ICG字段。