为 DynamoDB Streams 更改数据捕获 - Amazon DynamoDB
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

为 DynamoDB Streams 更改数据捕获

DynamoDB Streams 可在任何 DynamoDB 表中捕获按时间排序的项目级修改序列,并将这类信息存储在日志中长达 24 个小时。应用程序可访问此日志,并在数据项目修改前后近乎实时地查看所显示的数据项目。

静态加密会加密 DynamoDB 流中的数据。有关更多信息,请参阅 静态 DynamoDB 加密

DynamoDB 流是一种有关 DynamoDB 表中的项目更改的有序信息流。当您对表启用流时,DynamoDB 将捕获有关对表中的数据项目进行的每项修改的信息。

每当应用程序在表中创建、更新或删除项目时,DynamoDB Streams 都将编写一条具有已修改项目的主键属性的流记录。流记录包含有关对 DynamoDB 表中的单个项目所做的数据修改的信息。您可以配置流,以便流记录捕获其他信息,例如已修改项目的“前”和“后”图像。

DynamoDB Streams 可以帮助确保:

  • 每个流记录仅在流中显示一次。

  • 对于 DynamoDB 表中修改的每个项目,流记录将按照对该项目进行的实际修改的顺序显示。

DynamoDB Streams 近乎实时编写流记录,以便您能构建使用这些流并根据内容采取操作的应用程序。

DynamoDB Streams 的终端节点

Amazon 为 DynamoDB 和 DynamoDB Streams 维护单独的终端节点。要使用数据库表和索引,您的应用程序必须访问 DynamoDB 终端节点。要读取和处理 DynamoDB Streams 记录,您的应用程序必须访问相同区域内的 DynamoDB Streams 终端节点。

DynamoDB Streams 终端节点的命名约定为 streams.dynamodb.<region>.amazonaws.com。例如,如果您使用终端节点 dynamodb.us-west-2.amazonaws.com 访问 DynamoDB,您将使用终端节点 streams.dynamodb.us-west-2.amazonaws.com 访问 DynamoDB Streams。

注意

有关 DynamoDB 和 DynamoDB Streams 区域和终端节点的完整列表,请参阅Amazon 一般参考中的区域和终端节点

Amazon SDK 为 DynamoDB 和 DynamoDB Streams 提供单独的客户端。根据您的要求,您的应用程序可以访问 DynamoDB 终端节点,DynamoDB Streams 终端节点或同时访问二者。要连接到两个终端节点,您的应用程序必须实例化两个客户端 — 一个用于 DynamoDB,另一个用于 DynamoDB Streams。

启用流

使用 Amazon CLI 或某个 Amazon SDK 创建新表时,可以在新表上启用流。还可以对现有表启用或禁用流,或更改流设置。DynamoDB Streams 可异步执行操作,因此在启用流的情况下不会影响表的性能。

管理 DynamoDB Streams 最简单的方法是使用 Amazon Web Services Management Console。

  1. 登录 Amazon Web Services Management Console,并打开 DynamoDB 控制台:https://console.aws.amazon.com/dynamodb/

  2. 在 DynamoDB 控制台控制面板上,选择,然后选择现有表。

  3. 在存储库的导出和直播选项卡,在DynamoDB Stream 详细信息部分,选择启用.

  4. 管理流窗口中,选择在修改表中的数据时将写入流中的信息:

    • 仅键 — 仅所修改项目的键属性。

    • 新映像 — 修改后的整个项目。

    • 旧映像 — 修改前的整个项目。

    • 新旧映像 — 项目的新旧映像。

    根据需要进行设置后,选择 Enable (启用)

  5. (可选)要禁用现有流,请选择禁用DynamoDB Stream 详细信息.

您还可以使用 CreateTableUpdateTable API 操作来启用或修改流。StreamSpecification 参数确定如何配置流:

  • StreamEnabled — 指定对表启用 (true) 或禁用 (false) 流。

  • StreamViewType — 指定在修改表中的数据时将写入流中的信息:

    • KEYS_ONLY — 仅所修改项目的键属性。

    • NEW_IMAGE — 整个项目在修改后的显示。

    • OLD_IMAGE — 整个项目在修改前的显示。

    • NEW_AND_OLD_IMAGES — 项目的新旧映像。

您可以随时启用或禁用流。但是,如果您尝试在已有流的表上启用流,则会收到 ResourceInUseException。如果您尝试在没有流的表上禁用流,则会收到 ValidationException

当您将 StreamEnabled 设置为 true 时,DynamoDB 将创建一个新流,并为其分配一个唯一的流描述符。如果您在表上禁用然后重新启用流,则将创建一个具有不同流描述符的新流。

每个流均由一个 Amazon Resource Name (ARN) 进行唯一标识。以下是名为 TestTable 的 DynamoDB 表中一个流的示例 ARN。

arn:aws:dynamodb:us-west-2:111122223333:table/TestTable/stream/2015-05-11T21:21:33.291

要确定表的最新流描述符,请发出一个 DynamoDB DescribeTable 请求并在响应中查找 LatestStreamArn 元素。

读取和处理流

要读取和处理流,您的应用程序必须连接到 DynamoDB Streams 终端节点并发出 API 请求。

流由流记录 构成。每条流记录均代表流所在的 DynamoDB 表中的一个数据修改。每条流记录均分配有一个序列号,该序列号反映了将记录发布至流的顺序。

流记录将组织到群组或分区 中。每个分区可充当多条流记录的容器,并包含访问和迭代这些记录所需的信息。分区中的流记录将在 24 小时后自动删除。

分区是临时的:将根据需要自动创建和删除它们。此外,任何分区均可拆分为多个新分区;这也是自动进行的。(请注意,父分片还可能只有一个子分片。) 分区可能会在响应其父表上的高级写入活动时拆分,以便应用程序可以并行处理来自多个分区的记录。

如果您禁用流,将关闭已打开的分区。流中的数据在 24 小时内可继续读取。

由于分区存在沿袭 (父分区和子分区),应用程序必须始终先处理父分区,然后再处理子分区。这可帮助确保流记录也会按正确顺序进行处理。(如果您使用 DynamoDB Streams Kinesis Adapter,则会为您进行处理。您的应用程序按正确顺序处理分片和流记录。它自动处理新分片或过期分片,以及在应用程序运行期间拆分的分片。有关更多信息,请参阅使用 DynamoDB Streams Kinesis Adapter 处理流记录。)

下图显示流、流中的分区和分区中的流记录之间的关系。

注意

如果您执行的 PutItemUpdateItem 操作不更改项目中的任何数据,则 DynamoDB Streams 不会为该操作编写流记录。

要访问流和处理其中的流记录,您必须执行以下操作:

  • 确定您要访问的流的唯一 ARN。

  • 确定流中的哪些分片包含您感兴趣的流记录。

  • 访问分片并检索所需的流记录。

注意

从同一流分片中同时读取的进程最多不得超过 2 个。读取器超过 2 个的分片可能会受到限制。

DynamoDB Streams API 提供以下操作以供应用程序使用:

  • ListStreams — 返回当前账户和终端节点的流描述符列表。(可选) 您可以只请求特定表名称的流描述符。

  • DescribeStream — 返回有关给定流的详细信息。输出包含与流关联的分区的列表 (包括分区 ID)。

  • GetShardIterator — 返回一个描述分片中位置的分片迭代器。您可以请求该迭代器提供对流中最旧的点、最新的点或某个特定点的访问权。

  • GetRecords — 返回来自给定分片中的流记录。您必须提供从 GetShardIterator 请求中返回的分区迭代器。

有关这些 API 操作的完整描述(包括示例请求和响应),请参阅Amazon DynamoDB Streams API 参考

DynamoDB Streams 的数据保留限制

DynamoDB Streams 中所有数据的生命周期为 24 小时。您可以检索和分析任意给定表过去 24 小时的活动。但是,24 小时之前的数据可能会随时被修剪(删除)。

如果您对某个表禁用一个流,该流中的数据仍在 24 小时内可读。此时间过后,数据将过期,并且流记录将自动被删除。没有手动删除现有流的机制。您必须等待直至保留期限过期(24 小时),然后将删除所有流记录。