数据存储区和应用程序版本如何在GAE/J上运行

ivo*_*ivo 2 java google-app-engine google-cloud-datastore

可以在GAE/J上部署同一应用程序的多个版本,但是GAE/J如何处理不同版本可以使用不同数据存储(以及可能不兼容)的方案的事实?

例:

假设在我的应用程序的第1版中我有一个POJO(为了简单起见,我省略了几个细节):

public class User {

  private String key;

  private String username;

  private Integer phoneNumber;

}
Run Code Online (Sandbox Code Playgroud)

现在假设我想在版本2上使用:

public class User {

  private String key;

  private String username;

  // on this version, replaced 'phoneNumber' by: 
  private String eMail;

}
Run Code Online (Sandbox Code Playgroud)

现在有两个问题:

  1. 如果我部署两个版本的GAE/J,我会在数据存储中看到什么模式?

  2. 那数据本身呢?如果我在版本2上添加用户,我会在版本1的数据存储上看到它的数据吗?

Ale*_*lli 7

引用文档,

与关系数据库不同,App Engine数据存储区不要求给定类型的所有实体具有相同的属性.应用程序可以使用SDK附带的库或其自己的代码来指定和实施其数据模型.

这也被称为"软模式" -数据存储并没有真正做的模式,但你可以通过应用程序级的代码或多或少模拟一些软样的架构(你自己的,或在图书馆).

因此,如果您(通过库或您自己的代码)强制执行"此属性必须存在"的约束,并且某个实体实际上没有该属性(因为它是基于不同的"软模式"插入的,例如,应用程序的不同版本),然后您将获得应用程序级代码或库选择用于指示违反此软约束的任何异常,在检查约束的位置.

如果你没有表达这样的约束,那么缺少的属性将具有由你的代码或库提供的默认值,或者是"默认默认值",我相信它通常null是Java或NonePython.

请注意,应用程序的不同版本可能使用不同的运行时(有些可能是Java,其他可能是Python),不同的运行时仍将使用相同的数据存储区,因此Java与Python的区别并不重要.

在您的具体示例中(没有提供默认值且没有关于强制存在的断言)我希望从任一版本添加用户将使其从另一个版本可见,缺少属性被视为null(但可能存在约束我是不知道,在这种情况下,当库试图验证这些约束并看到它们被违反时,应该产生异常.

一般而言,我不担心添加"可选"属性(可能合法地丢失/ null/ None,或在这些情况下具有显式默认值,以便旧版本编写的实体仍可正确读取),但其他类型(如果迁移是只是不可行.

迁移可能不可行,特别是,如果您需要能够回滚到以前的应用程序版本,例如(实际上在其他操作变得有问题的情况下,例如删除约束变得像添加它们一样有问题,因为旧版本可能是无法处理在新版本中输入的数据,这些数据违反了新版本中已删除的约束.

所以它在实践中不一定是一个简单的问题,但它仍然有助于这样思考:数据存储本身没有架构,只有我的应用程序和/或它选择使用的库强制执行应用程序级别所需的任何约束.底层实体本身实际上都有一组任意属性 - "软模式",应用程序级模式,底层数据层中没有"实际"模式.