Logo
Section 1 / 5

DynamoDB 流(Streams)

了解 DynamoDB 中的流及其使用方法。

导入

DynamoDB 流(Streams)

了解 DynamoDB 中的流及其使用方法。

一个有趣且非常常见的应用场景是需要检测数据库中的变化。一旦检测到这些变化,就可以基于它们执行相应的操作。

一种可能的实现方式是采用批处理机制,定期查询数据库。然而,这种方式效率较低,因为频繁的全表扫描等重负载操作会影响数据库性能。此外,该过程还会消耗读写容量单位(RCUs)。最后,在这种模式下也无法实现真正的实时处理。为解决这些问题,DynamoDB 提供了一个更优的解决方案,这正是本节课要讨论的内容。

什么是流(Streams)?

流是 DynamoDB 提供的一项功能,用于追踪表中发生的变更。当 DynamoDB 中发生任何类型的修改时,系统会发出一个包含事件信息的事件通知。回顾一下,我们可能遇到的三种变更类型分别是:插入、更新和删除。因此,当其中任一操作发生时,DynamoDB 都会触发一个事件,表明有变更已发生。

这些事件可以包含执行特定操作所需的所有信息。例如:验证被修改的记录、将信息存储到文件系统、发送通知等。根据具体使用场景,事件中可以包含完整的记录数据,也可以仅包含记录的键值。

值得注意的是,DynamoDB 保证事件按照其发生顺序发送。这一特性在需要按相同顺序处理表中事件的场景中尤为重要。

流是如何工作的?

当启用 DynamoDB 流功能后,我们需要借助另一个 AWS 服务——Lambda。Lambda 是一种由事件触发的代码片段,允许我们决定如何处理接收到的数据。

由于 DynamoDB 会根据数据库中的变更发出事件,这些事件会被 Lambda 函数接收。随后,我们可以对这些事件进行处理,并决定如何应对传入的信息。例如:将其存入另一个数据库、保存到文件中,或仅记录到日志中。下图展示了这一集成的工作流程:

...
How streams work

注意: AWS 中任何服务都可以生成事件,且可以将这些事件与 Lambda 函数连接起来。

此外,还可以配置一个事件缓冲区,使得只有在达到一定数量的事件后,才会将消息发送给关联的 Lambda 函数。例如,可以设置为:只有当数据库中发生了 10 次变更后,才触发一次 Lambda 调用,一次性处理这 10 条变更。

事件类型

DynamoDB 可以生成四种不同类型的流事件:

  • 仅包含键属性:事件中仅包含被修改记录的键。
  • 新图像(New image):事件中包含更新后的完整记录。例如,若某个属性值被更改,则事件中将包含该属性更新后的完整记录。
  • 旧图像(Old image):事件中包含更新前的完整记录。例如,若某个属性值被更改,则事件中将包含该属性修改前的原始值。
  • 新旧图像同时存在:这是最实用的一种场景,事件中同时包含记录更新前和更新后的完整版本。这样就可以对比两个版本之间的差异。

如何启用流?

要启用流功能,可按以下步骤操作:

  1. 在搜索栏中输入“DynamoDB”,然后选择该服务。
  2. 选择一个现有的表。
  3. 进入“导出与流”选项卡。
  4. 在“DynamoDB 流详情”区域,点击“启用”按钮。
  5. 选择一种可用的事件类型,然后点击“启用流”按钮。
  6. 当状态变为“已启用”后,在“触发器”部分点击“创建触发器”按钮。
  7. 此步骤需提前创建好 Lambda 函数。选择对应的函数,并设置所需的“批量大小”。
  8. 点击“创建触发器”按钮。

核心要点

流是 DynamoDB 在表中发生变更时生成的一系列事件流。这些事件可能包含以下四类信息:

  • 被修改记录的键。
  • 被修改记录的新状态。
  • 被修改记录的旧状态。
  • 被修改记录的旧状态与新状态。

这些事件可以被发送至 AWS 中的其他服务,如 Lambda 函数或 SNS。

与 DynamoDB 交互

使用 CloudWatch 进行监控