我有一个运行多个应用程序服务器的在线服务,其中有几个存储在 MongoDB 中的集合。我以持续部署的方式工作,这基本上意味着如果一切顺利,代码更新会触发自动化测试,然后是生产升级(这有点复杂,但我相信这个问题也与非 CD 部署有关)。
这在大多数情况下都有效,但有时我的一个(或多个)核心数据模型会发生变化,在这种情况下,升级可能会弄乱内存中的数据,然后是数据库中的数据。
我举个例子:
假设我有一个简单的数据对象:
public class User {
private String id;
private String name;
private String[] friendsNames;
}
现在我决定将用户更改为:
public class User {
private String id;
private String name;
}
并将好友添加为单独的集合,其中存储了一个简单的对象,例如:
public class Friend {
private String name;
private String friendUserId;
}
这导致了一个问题。在更改数据结构以适应新的数据模型之前,我不能升级我的服务,并且在我关闭服务之前不能更改数据,否则旧版本会读取新数据版本并搞砸。
因此,唯一的解决方案是关闭所有内容,在数据库上运行一些升级过程以更改所有内容,然后在运行新代码的情况下恢复服务。
所以最后的问题是:我想知道是否有版本数据的最佳实践解决方案(特别是 Mongo,如果这是相关的),以便旧版本应用程序能够继续使用旧数据,而新应用程序将“看到”新数据。我想到了像“UserV1.1”和“UserV1.2”这样的类版本,可以在mongo中搜索适当的类版本,但如果有人已经考虑过并想出来,我不想“重新发明轮子”智能解决方案。
需要明确的是,我不关心对象历史,我只是希望能够顺利升级应用程序版本。