适用范围:
NoSQL
Azure Cosmos DB 提供两种更改源模式。 每种模式都提供相同的核心功能。 差异包括源中捕获的操作、可用于每个更改的元数据以及更改的保持期。 对于同一 Azure Cosmos DB 容器,可以跨多个应用程序在不同模式下读取变更馈送,以适应每项工作负载的需求。 每个单独的更改馈送应用程序只能配置为在一种模式下读取更改馈送。 以一种模式使用更改源不会禁止你在另一个应用程序中以另一种模式使用更改源。
最新版本更改源模式
最新版本模式是创建和更新操作中对项所做更改的永久记录。 获取容器中每个项的最新版本。 例如,如果在读取更改源之前创建了某个项并对其进行了更新,则更改源中仅显示更新的版本。 删除操作不会作为更改进行记录,并且删除某个项后,它在数据流中不再可用。 最新版本更改源模式默认处于启用状态,并与所有 Azure Cosmos DB 帐户(API for Table 和 API for PostgreSQL 除外)兼容。 此模式以前是使用更改源的默认方式。
所有版本和删除更改源模式(预览版)
所有版本和删除模式(预览版)是创建、更新和删除操作中对项做出的所有更改的永久记录。 可以按对项做出每个更改的顺序获取对应更改的记录,包括在读取更改源期间对项进行的中途的更改。 例如,如果在读取更改源之前创建了某个项并对其进行了更新,则更改源中会显示创建和更新版本。 若要在所有版本和删除模式下读取更改源中的内容,必须为 Azure Cosmos DB 帐户配置连续备份。 启用连续备份会创建所有版本并删除更改源。 使用此更改源模式时,只能读取在连续备份期间发生的更改。 此模式仅与 Azure Cosmos DB for NoSQL 帐户兼容。 详细了解如何注册预览版。
更改源用例
最新版本模式提供了一种简单的方法来处理对容器中的项的实时更改和历史更改,能够返回到在容器开头进行的更改。
下面是非常适合此模式的方案:
将整个容器迁移到辅助位置。
能够从容器的开头重新处理更改。
实时处理创建和更新操作中发生的对容器中项的更改。
不需要捕获读取之间的删除或中间更改的工作负荷。
所有版本和删除更改源模式都支持更改源的新方案,并简化其他方案。 可以读取对项所做的每一个更改(即使在更改源读取之间发生多次更改的情况下),确定正在处理的更改的操作类型,并获取因删除导致的更改。
此模式启用和增强的一些常见场景包括:
每种模式的功能
除了所有更改源模式的常见功能外,每种更改源模式还具有以下特征:
更改源包括针对容器中的项所执行的插入和更新操作。
此更改源模式不会记录删除。 可以通过在项内设置“软删除”标志来捕获删除,而不是直接删除它们。 例如,可以在项中添加名为“deleted
”、值为 true
的属性,然后对项设置生存时间 (TTL)。 更改源将其捕获为更新,并在 TTL 过期时自动删除该项。 此外,也可以使用 TTL 功能为项设置有限的过期时段。 使用此解决方案时,处理更改的时间间隔必须比 TTL 过期时段要短。
更改流中仅包含特定项的最新变更。 中间更改可能不可用。
当某个项被删除后,该项就不再出现在更改记录中。
可以从任意时间点同步更改,并且这些更改没有固定的数据保留期限。
无法为特定类型的操作筛选更改源。 一种可能的替代方法是在更新项上添加“软标记”,并在处理更改源中的项时根据该标记进行筛选。
读取更改源的起点可以是容器的开头、某个时间点、“现在”或某个特定检查点。 开始时间的精度约为 5 秒。
更改源包括针对容器中的项所执行的插入、更新和删除操作。 TTL 过期所导致的删除操作也会被捕获。
可提供元数据来确定更改类型,包括删除操作是否是因 TTL 过期而发生的。
更改源项按其修改时间排序。 无法保证因 TTL 过期而导致的删除操作会在项过期后立即显示在数据流中。 当从容器中清除项时,它们会显示。
可以读取帐户上连续备份的保留时段内发生的所有更改。 尝试读取发生在保留期之外的更改会导致错误。 例如,如果容器是 8 天前创建的,而连续备份保持期为 7 天,则只能读取过去 7 天的更改。
更改源的起点可以是“现在”或保留期内的某个特定检查点。 无法使用此模式从容器的开头或某个特定时间点读取更改。
使用更改源
每种模式都与不同的方法兼容来读取每种语言的更改源。
可以使用以下方法在最新版本模式下使用更改源中的更改:
分析响应对象
在最新版本模式下,默认响应对象是已更改的项的数组。 每个项都包含任何 Azure Cosmos DB 项的标准元数据,包括 _etag
和 _ts
,并添加了一个新属性 _lsn
。
_etag
格式是内部格式,请不要依赖它,因为它随时可能更改。 _ts
是修改或创建时间戳。 可以使用 _ts
进行时间顺序比较。 _lsn
是仅为更改源添加的批 ID,表示事务 ID。 许多项可以具有相同 _lsn
。
ETag
上的 FeedResponse
不同于在项目中看到的 _etag
。 _etag
是内部标识符,用于并发控制。 _etag
属性表示项的版本,而 ETag
属性用于对源进行排序。
在预览期间,每个客户端 SDK 都可以通过以下方法读取更改提要:
注意
无论应用程序中配置的连接模式为何,所有版本和删除更改源发出的所有请求都将使用网关模式。
入门
若要开始使用所有版本并删除更改源模式,请通过 Azure 订阅概述页中的“预览功能”页注册预览版。 搜索“AllVersionsAndDeletesChangeFeed”功能,然后选择“注册”。
提交请求后,请确保订阅中至少有 1 个 Azure Cosmos DB 帐户。 此帐户可能是现有帐户,也可能是你为了试用预览功能而创建的新帐户。 如果收到请求时你在订阅中没有帐户,则会拒绝请求,因为没有可应用功能的帐户。
Azure Cosmos DB 团队将审核你的请求并通过电子邮件与你联系,以确认订阅中要注册预览版的 Azure Cosmos DB 帐户。 若要使用预览版,必须为 Azure Cosmos DB 帐户配置连续备份。 可以在允许预览之前或之后启用连续备份,但在尝试从所有版本和删除模式的更改源中读取之前,必须启用连续备份。
分析响应对象
响应对象是表示每项更改的项数组。 将根据更改类型填充不同的属性。 目前无法获取之前用于替换或删除操作的项目版本。
创建操作
{
"current": {
<The current version of the item that changed. All the properties of your item will appear here.>
},
"metadata": {
"operationType": "create",
"lsn": <A number that represents the batch ID. Many items can have the same lsn.>,
"crts": <A number that represents the Conflict Resolved Timestamp. It has the same format as _ts.>
}
}
替换操作
{
"current": {
<The current version of the item that changed. All the properties of your item will appear here.>
},
"metadata": {
"operationType": "replace",
"lsn": <A number that represents the batch ID. Many items can have the same lsn.>,
"crts": <A number that represents the Conflict Resolved Timestamp. It has the same format as _ts.>,
"previousImageLSN" : <A number that represents the batch ID of the change prior to this one.>,
}
}
删除操作
{
"metadata": {
"operationType": "delete",
"lsn": <A number that represents the batch ID. Many items can have the same lsn.>,
"crts": <A number that represents the Conflict Resolved Timestamp. It has the same format as _ts.>,
"previousImageLSN" : <A number that represents the batch ID of the change prior to this one.>,
"timeToLiveExpired" : <'true' if it was deleted due to a TTL expiration.>,
"id": "<Id of the deleted item.>",
"partitionKey": {
"<Partition key property name>": "<Partition key property value>"
}
}
}
限制
支持 Azure Cosmos DB for NoSQL 帐户。 不支持其他 Azure Cosmos DB 帐户类型。
需要连续备份才可使用此更改源模式。 请参阅 使用连续备份的限制。
不支持读取在帐户上启用连续备份之前便已存在的容器更改。
目前不支持从头开始读取更改日志或根据过去的时间戳选择开始时间。 可以从“现在”开始,或者从之前的租约或延续令牌开始。
当前无法接收已删除或更新的项的以前版本。
不支持已启用合并分区的帐户。
后续步骤
请通过以下文章详细了解更改源: