在 Amazon AppSync 中对 DynamoDB 数据来源进行版本控制
Amazon AppSync 目前支持 DynamoDB 数据来源版本控制。冲突检测、冲突解决和同步操作需要 Versioned 数据来源。在为数据来源启用版本控制时,Amazon AppSync 自动执行以下操作:
-
使用对象版本化元数据增强项目。
-
将使用 Amazon AppSync 变更对项目所做的更改记录到增量 表中。
-
使用“逻辑删除”将基本 表中的已删除项目保留可配置的时间。
版本控制的数据来源配置
对 DynamoDB 数据来源启用版本控制时,可以指定以下字段:
-
BaseTableTTL -
使用“逻辑删除”(一个元数据字段,指示项目已被删除)保留基本 表中已删除项目的分钟数。如果希望删除项目时立即将其移除,则可以将此值设置为 0。该字段为必填。
-
DeltaSyncTableName -
存储使用 Amazon AppSync 变更对项目所做的更改的表名称。该字段为必填。
-
DeltaSyncTableTTL -
在增量 表中保留项目的分钟数。该字段为必填。
增量同步表日志记录
Amazon AppSync 目前为使用 PutItem、UpdateItem 和 DeleteItem DynamoDB 操作的变更提供增量同步日志记录支持。
在 Amazon AppSync 变更更改版本控制的数据来源中的项目时,将在针对增量更新优化的增量 表中存储该更改的记录。您可以选择对其他版本控制的数据来源使用不同的增量 表(例如,每种类型一个增量表,或者每个域区域一个增量表),或者对您的 API 使用单个增量 表。AmazonAppSync 建议不要对多个 API 使用单个增量 表,以避免主键冲突。
此表所需的架构如下所示:
-
ds_pk -
用作分区键的字符串值。这是将基本数据来源名称和更改发生日期的 ISO 8601 格式连接在一起而构建的(例如
Comments:2019-01-01)。在 VTL 映射模板中的
customPartitionKey标记设置为分区键的列名称时(请参阅《Amazon AppSync 开发人员指南》中的 DynamoDB 解析器映射模板参考),ds_pk格式将发生变化,字符串是通过附加基表中的新记录的分区键值构建的。例如,如果基 表中的记录的分区键值为1a,排序键值为2b,则字符串的新值为:Comments:2019-01-01:1a。 -
ds_sk -
用作排序键的字符串值。这是将更改发生时间的 ISO 8601 格式、项目的主键和项目的版本连接在一起而构建的。这些字段的组合保证了增量 表中的每个条目的唯一性(例如,如果时间为
09:30:00,ID 为1a,版本为2,则该值为09:30:00:1a:2)。在 VTL 映射模板中的
customPartitionKey标记设置为分区键的列名称时(请参阅《Amazon AppSync 开发人员指南》中的 DynamoDB 解析器映射模板参考),ds_sk格式将发生变化,字符串是通过将组合键的值替换为基 表中的排序键值构建的。使用上面的示例,如果基 表中的记录的分区键值为1a,排序键值为2b,则字符串的新值为:09:30:00:2b:3。 -
_ttl -
一个数值,用于存储应从增量 表中移除项目时的时间戳(以纪元秒为单位)。此值是通过将数据来源上配置的
DeltaSyncTableTTL值添加到发生更改那一刻的时间来确定的。该字段应配置为 DynamoDB TTL 属性。
配置为与基本 表一起使用的 IAM 角色还必须包含对增量 表进行操作的权限。在该示例中,显示了名为 Comments 的基 表和名为 ChangeLog 的增量 表的权限策略:
版本控制的数据来源元数据
Amazon AppSync 代表您管理 Versioned 数据来源上的元数据字段。自行修改这些字段可能会导致应用程序中的错误或数据丢失。这些字段包括:
-
_version -
一个单调递增的计数器,在项目发生更改时随时更新。
-
_lastChangedAt -
一个数值,用于存储上次修改项目时的时间戳(以纪元毫秒为单位)。
-
_deleted -
一个布尔型“逻辑删除”值,指示项目已被删除。应用程序可以使用此功能从本地数据存储中移除已删除的项目。
-
_ttl -
一个数值,用于存储应从底层数据来源中移除项目时的时间戳(以纪元秒为单位)。
-
ds_pk -
用作增量 表的分区键的字符串值。
-
ds_sk -
用作增量 表的排序键的字符串值。
gsi_ds_pk-
生成的字符串值属性,用于支持将全局二级索引作为分区键。只有在 VTL 映射模板中启用
customPartitionKey和populateIndexFields标记时,才会包含该属性(请参阅《Amazon AppSync 开发人员指南》中的 DynamoDB 解析器映射模板参考)。如果启用,则将基本 数据来源名称和更改发生日期的 ISO 8601 格式连接在一起以构建该值(例如,如果基表名为 Comments,该记录将设置为Comments:2019-01-01)。 gsi_ds_sk-
生成的字符串值属性,用于支持将全局二级索引作为排序键。只有在 VTL 映射模板中启用
customPartitionKey和populateIndexFields标记时,才会包含该属性(请参阅《Amazon AppSync 开发人员指南》中的 DynamoDB 解析器映射模板参考)。如果启用,则将更改发生时间的 ISO 8601 格式、基 表中的项目的分区键、基表中的项目的排序键以及项目的版本连接在一起以构建该值(例如,如果时间为09:30:00,分区键值为1a,排序键值为2b,版本为3,则该值为09:30:00:1a#2b:3)。
这些元数据字段将影响基本数据来源中的项目的总体大小。Amazon在设计应用程序时,AppSync 建议为版本控制的数据来源元数据保留 500 字节 + 最大主键大小的存储空间。要在客户端应用程序中使用此元数据,请在您的 GraphQL 类型和变更的选择集中包括 _version、_lastChangedAt 和 _deleted 字段。