Azure Cosmos DB 中的更改源模式

适用范围: NoSQL

Azure Cosmos DB 提供两种更改源模式。 每种模式都提供相同的核心功能。 差异包括源中捕获的操作、可用于每个更改的元数据以及更改的保持期。 对于同一 Azure Cosmos DB 容器,可以跨多个应用程序在不同模式下读取变更馈送,以适应每项工作负载的需求。 每个单独的更改馈送应用程序只能配置为在一种模式下读取更改馈送。 以一种模式使用更改源不会禁止你在另一个应用程序中以另一种模式使用更改源。

注意

是否有关于更改源模式的任何反馈? 我们想听一听! 欢迎直接与 Azure Cosmos DB 工程团队分享反馈:cosmoschangefeed@microsoft.com

最新版本更改源模式

最新版本模式是创建和更新操作中对项所做更改的永久记录。 获取容器中每个项的最新版本。 例如,如果在读取更改源之前创建了某个项并对其进行了更新,则更改源中仅显示更新的版本。 删除操作不会作为更改进行记录,并且删除某个项后,它在数据流中不再可用。 最新版本更改源模式默认处于启用状态,并与所有 Azure Cosmos DB 帐户(API for Table 和 API for PostgreSQL 除外)兼容。 此模式以前是使用更改源的默认方式。

所有版本和删除更改源模式(预览版)

所有版本和删除模式(预览版)是创建、更新和删除操作中对项做出的所有更改的永久记录。 可以按对项做出每个更改的顺序获取对应更改的记录,包括在读取更改源期间对项进行的中途的更改。 例如,如果在读取更改源之前创建了某个项并对其进行了更新,则更改源中会显示创建和更新版本。 若要在所有版本和删除模式下读取更改源中的内容,必须为 Azure Cosmos DB 帐户配置连续备份。 启用连续备份会创建所有版本并删除更改源。 使用此更改源模式时,只能读取在连续备份期间发生的更改。 此模式仅与 Azure Cosmos DB for NoSQL 帐户兼容。 详细了解如何注册预览版

更改源用例

最新版本模式提供了一种简单的方法来处理对容器中的项的实时更改和历史更改,能够返回到在容器开头进行的更改。

下面是非常适合此模式的方案:

  • 将整个容器迁移到辅助位置。

  • 能够从容器的开头重新处理更改。

  • 实时处理创建和更新操作中发生的对容器中项的更改。

  • 不需要捕获读取之间的删除或中间更改的工作负荷。

每种模式的功能

除了所有更改源模式的常见功能外,每种更改源模式还具有以下特征:

  • 更改源包括针对容器中的项所执行的插入和更新操作。

  • 此更改源模式不会记录删除。 可以通过在项内设置“软删除”标志来捕获删除,而不是直接删除它们。 例如,可以在项中添加名为“deleted”、值为 true 的属性,然后对项设置生存时间 (TTL)。 更改源将其捕获为更新,并在 TTL 过期时自动删除该项。 此外,也可以使用 TTL 功能为项设置有限的过期时段。 使用此解决方案时,处理更改的时间间隔必须比 TTL 过期时段要短。

  • 更改流中仅包含特定项的最新变更。 中间更改可能不可用。

  • 当某个项被删除后,该项就不再出现在更改记录中。

  • 可以从任意时间点同步更改,并且这些更改没有固定的数据保留期限。

  • 无法为特定类型的操作筛选更改源。 一种可能的替代方法是在更新项上添加“软标记”,并在处理更改源中的项时根据该标记进行筛选。

  • 读取更改源的起点可以是容器的开头、某个时间点、“现在”或某个特定检查点。 开始时间的精度约为 5 秒。

使用更改源

每种模式都与不同的方法兼容来读取每种语言的更改源。

可以使用以下方法在最新版本模式下使用更改源中的更改:

读取更改源的方法 .NET Java Python Node.js
更改源请求模型
更改源处理器
Azure Functions 触发器

分析响应对象

在最新版本模式下,默认响应对象是已更改的项的数组。 每个项都包含任何 Azure Cosmos DB 项的标准元数据,包括 _etag_ts,并添加了一个新属性 _lsn

_etag 格式是内部格式,请不要依赖它,因为它随时可能更改。 _ts 是修改或创建时间戳。 可以使用 _ts 进行时间顺序比较。 _lsn 是仅为更改源添加的批 ID,表示事务 ID。 许多项可以具有相同 _lsn

ETag 上的 FeedResponse 不同于在项目中看到的 _etag_etag 是内部标识符,用于并发控制。 _etag 属性表示项的版本,而 ETag 属性用于对源进行排序。

后续步骤

请通过以下文章详细了解更改源: