我有一个运行多个应用程序服务器的在线服务,其中有几个集合存储在MongoDB中。我以持续部署的方式工作,这基本上意味着代码更新会触发自动化测试,然后进行生产升级,如果一切顺利的话(这会使问题变得复杂,但我认为这个问题与非CD部署相关)。 / p>
这在大多数情况下有效,但有时我的核心数据模型中的一个(或多个)会发生变化,在这种情况下,升级可能会破坏内存中的数据以及之后的数据。
我举一个例子:
假设我有一个简单的数据对象:
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;
}
这会导致问题。我在更改数据结构以适应新数据模型之前无法升级我的服务,并且在我取消服务之前无法更改数据,否则旧版本将读取新数据版本并搞砸了。< / p>
因此,唯一的解决方案是将所有内容都关闭,在数据库上运行一些升级过程以更改所有内容,然后在运行新代码的情况下重新启动服务。
最后一个问题:我想知道是否有最佳实践解决方案版本数据(特别是Mongo,如果这是相关的),以便旧版本的应用程序能够继续使用旧数据,新的应用程序将“看“新数据。我认为类似“UserV1.1”和“UserV1.2”之类的东西会在mongo中搜索相应的类版本,但如果有人已经想到这一点并且想出来的话,我不想“重新发明轮子”用智能解决方案。
为了清楚起见,我不关心对象历史,我只是希望能够顺利升级应用程序版本。
答案 0 :(得分:2)
欢迎来到“无架构”的喜悦。在我的应用程序中,我最终对对象进行编码,使得它们可以经历“过渡”时期。也就是说,任何更改模型的版本都必须支持旧的和新的“模式”。我将这些位推向生产,然后启动将所有内容转换为过程的长流程。在下一个版本中,我们退出了过渡逻辑。它的屁股很痛,但它很有效。它需要两个版本来更改架构。