3

我有一个运行多个应用程序服务器的在线服务,其中有几个存储在 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中搜索适当的类版本,但如果有人已经考虑过并想出来,我不想“重新发明轮子”智能解决方案。

需要明确的是,我不关心对象历史,我只是希望能够顺利升级应用程序版本。

4

1 回答 1

2

欢迎来到“无模式”的乐趣。在我的应用程序中,我最终对对象进行了编码,以便它们可以经历一个“过渡”时期。也就是说,任何改变模型的版本都必须同时支持新旧“模式”。我将这些位投入生产,然后开始将所有内容转换的漫长过程。下一个版本,我们退出了过渡逻辑。这是一个痛苦的屁股,但它的工作原理。更改架构需要两个版本。

于 2013-04-28T04:28:27.753 回答