背景
笔者最近在维护一个基于地图数据的服务,为了给用户提供更好的服务,数据的更新频次会逐步增加。数据格式本身是基于protobuf的,鉴于其良好的格式兼容性,大多数升级中服务本身是不需要调整的。从服务角度来说,数据热更新呼之欲出。本文探讨一种解决思路,并总结下其中发现的问题。
技术栈
Java + SpringBoot
总体思路
- 数据API(暂且叫DataAPI),定义出数据内容访问接口,从而将API与具体的实现对象分离,当然有时候其中会有ADataAPI,BDataAPI;
- 数据API工厂(暂且叫DataAPIFactory),其中包含所有版本的数据API实例,但每次仅从中获取最新实例,历史的实例在不需要的时候销毁掉;(显然这里是问题的关键)
- 上层服务依赖DataAPIFactory,作为统一入口;
思路落地
- DataAPI,将数据本身依赖的内容当做一个完整的模组,其中包含依赖等内容,想到这里,这也是个小的应用上下文;
- DataAPIFactory,其中包含多个DataAPI实现,这也是个小的应用上下文;
- 咱们的整个服务相关的实例在一个更大的上下文中,接下来探讨下这些上下文的关系。显然,DataAPIFactory由于被上层服务直接依赖,因此与整个服务的应用上下文是一致的,于是整个服务就划分为2个应用上下文,Data