Amazon DynamoDB
开发人员指南 (API Version 2012-08-10)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

使用 DynamoDB 流 捕获表活动

当存储在 DynamoDB 表中的项目发生更改时,许多应用程序都会因能够捕获此类更改而受益。以下是一些示例使用案例:

  • 一个 AWS 区域中的一个应用程序将修改 DynamoDB 表中的数据。另一个 AWS 区域中的另一个应用程序将读取这些数据修改并将数据写入另一个表中,并创建一个与原始表保持同步的副本。

  • 一个热门移动应用程序以每秒数千次更新的速率修改 DynamoDB 表中的数据。另一个应用程序捕获和存储有关这些更新的数据,并提供针对该移动应用程序的实时用量指标。

  • 一种全球多人游戏具有多主机拓扑结构,并将数据存储在多个 AWS 区域中。每个主机通过使用并重放远程区域中发生的更改来保持同步。

  • 一旦某个好友上传新图片,一个应用程序就会自动向群组中的所有好友的移动设备发送通知。

  • 一个新客户将数据添加到 DynamoDB 表。此事件调用另一个应用程序,以便向该新客户发送欢迎电子邮件。

DynamoDB 流 支持诸如此类的解决方案以及许多其他解决方案。DynamoDB 流 在任何 DynamoDB 表中捕获按时间排序的项目级修改序列,并将这类信息存储在日志中长达 24 个小时。应用程序可访问此日志并在数据项目修改前后显示时实时查看数据项目。

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

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

DynamoDB 流 确保以下内容:

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

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

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

DynamoDB 流 的终端节点

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

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

注意

有关 DynamoDB 和 DynamoDB 流 区域和终端节点的完整列表,请参阅 AWS General Reference 中的区域和终端节点

AWS 开发工具包为 DynamoDB 和 DynamoDB 流 提供单独的客户端。根据您的要求,您的应用程序可以访问 DynamoDB 终端节点,DynamoDB 流 终端节点或同时访问二者。要连接到这两个终端节点,您的应用程序需要实例化两个客户端 - 一个用于 DynamoDB,一个用于 DynamoDB 流。

启用流

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

管理 DynamoDB 流 最简单的方法是使用AWS 管理控制台。

  1. 通过以下网址打开 DynamoDB 控制台:https://console.amazonaws.cn/dynamodb/

  2. 从 DynamoDB 控制台仪表板中,选择 Tables

  3. Overview 选项卡上,选择 Manage Stream

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

    • Keys only – 仅所修改项目的键属性。

    • New image – 修改后的整个项目。

    • Old image – 修改前的整个项目。

    • New and old images – 项目的新旧映像。

    根据需要进行设置后,选择 Enable

  5. (可选) 要禁用现有流,请选择 Manage Stream,然后选择 Disable

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

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

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

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

    • NEW_IMAGE - 修改后的整个项目。

    • OLD_IMAGE - 修改前的整个项目。

    • NEW_AND_OLD_IMAGES - 项目的新旧映像。

您可以随时启用或禁用流。但请注意,如果您尝试在已具有流的表上启用流,您将收到一个 ResourceInUseException;如果您尝试对没有流的表禁用流,您将收到一个 ValidationException

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

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

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

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

读取和处理流

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

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

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

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

如果您禁用流,将关闭已打开的分区。

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

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

注意

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

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

  • 确定您要访问的流的唯一 Amazon 资源名称 (ARN)。

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

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

注意

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

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

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

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

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

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

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

DynamoDB 流 的数据保留限制

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

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