记录一次大版本上线后回滚的案例
一 问题
一个大版本的迭代,保存到Redis中的缓存数据实体类增加了一些属性,就用了一个子类继承旧实体类。获取缓存数据时可以通过Redis的class类型判断是新数据,如果不是,就用旧实体类序列化,代码如下:
旧的实体类
新的实体类
从Redis获取数据,适配旧数据
业务流程:
以上流程如果只是 OldEntity 转 NewEntity 是没有问题的,但是我们线上服务器是多台,发布的时候是一台台发布的,这个时候就会存在一个没有想到的情况。旧数据 OldEntity 在新发布的应用上被转化为新数据模型 NewEntity 后被保存在Redis,下一个中间点更新事件的请求打到了还没来得及发布的服务器上,这时旧版本的应用获取缓存时将 NewEntity 转 OldEntity 模型,转化失败,返回 null。导致线上报错预警。
发布部分服务器后的业务流程:
二 解决方案
不新建实体类,在旧的实体类模型上增加新属性:
获取缓存后判断新增属性值是否为空,以此判断是否是旧应用保存的数据:
领取专属 10元无门槛券
私享最新 技术干货