Azure Cosmos DB 中的更改源模式

适用范围: NoSQL

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

最新版本更改源模式

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

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

所有版本和删除模式(预览版)是创建、更新和删除操作中对项做出的所有更改的永久记录。 可以按对项做出每个更改的顺序获取对应更改的记录,包括在读取更改源期间对项进行的中途的更改。 例如,如果在读取更改源之前创建了某个项并对其进行了更新,则更改源中会显示创建和更新版本。 若要在所有版本和删除模式下读取更改源中的内容,必须为 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

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

后续步骤

在以下文章中详细了解更改源: