DynamoDB 流(Streams)
了解 DynamoDB 中的流及其使用方法。
一个有趣且非常常见的应用场景是需要检测数据库中的变化。一旦检测到这些变化,就可以基于它们执行相应的操作。
一种可能的实现方式是采用批处理机制,定期查询数据库。然而,这种方式效率较低,因为频繁的全表扫描等重负载操作会影响数据库性能。此外,该过程还会消耗读写容量单位(RCUs)。最后,在这种模式下也无法实现真正的实时处理。为解决这些问题,DynamoDB 提供了一个更优的解决方案,这正是本节课要讨论的内容。
什么是流(Streams)?
流是 DynamoDB 提供的一项功能,用于追踪表中发生的变更。当 DynamoDB 中发生任何类型的修改时,系统会发出一个包含事件信息的事件通知。回顾一下,我们可能遇到的三种变更类型分别是:插入、更新和删除。因此,当其中任一操作发生时,DynamoDB 都会触发一个事件,表明有变更已发生。
这些事件可以包含执行特定操作所需的所有信息。例如:验证被修改的记录、将信息存储到文件系统、发送通知等。根据具体使用场景,事件中可以包含完整的记录数据,也可以仅包含记录的键值。
值得注意的是,DynamoDB 保证事件按照其发生顺序发送。这一特性在需要按相同顺序处理表中事件的场景中尤为重要。
流是如何工作的?
当启用 DynamoDB 流功能后,我们需要借助另一个 AWS 服务——Lambda。Lambda 是一种由事件触发的代码片段,允许我们决定如何处理接收到的数据。
由于 DynamoDB 会根据数据库中的变更发出事件,这些事件会被 Lambda 函数接收。随后,我们可以对这些事件进行处理,并决定如何应对传入的信息。例如:将其存入另一个数据库、保存到文件中,或仅记录到日志中。下图展示了这一集成的工作流程:
注意: AWS 中任何服务都可以生成事件,且可以将这些事件与 Lambda 函数连接起来。
此外,还可以配置一个事件缓冲区,使得只有在达到一定数量的事件后,才会将消息发送给关联的 Lambda 函数。例如,可以设置为:只有当数据库中发生了 10 次变更后,才触发一次 Lambda 调用,一次性处理这 10 条变更。
事件类型
DynamoDB 可以生成四种不同类型的流事件:
- 仅包含键属性:事件中仅包含被修改记录的键。
- 新图像(New image):事件中包含更新后的完整记录。例如,若某个属性值被更改,则事件中将包含该属性更新后的完整记录。
- 旧图像(Old image):事件中包含更新前的完整记录。例如,若某个属性值被更改,则事件中将包含该属性修改前的原始值。
- 新旧图像同时存在:这是最实用的一种场景,事件中同时包含记录更新前和更新后的完整版本。这样就可以对比两个版本之间的差异。
如何启用流?
要启用流功能,可按以下步骤操作:
- 在搜索栏中输入“DynamoDB”,然后选择该服务。
- 选择一个现有的表。
- 进入“导出与流”选项卡。
- 在“DynamoDB 流详情”区域,点击“启用”按钮。
- 选择一种可用的事件类型,然后点击“启用流”按钮。
- 当状态变为“已启用”后,在“触发器”部分点击“创建触发器”按钮。
- 此步骤需提前创建好 Lambda 函数。选择对应的函数,并设置所需的“批量大小”。
- 点击“创建触发器”按钮。
核心要点
流是 DynamoDB 在表中发生变更时生成的一系列事件流。这些事件可能包含以下四类信息:
- 被修改记录的键。
- 被修改记录的新状态。
- 被修改记录的旧状态。
- 被修改记录的旧状态与新状态。
这些事件可以被发送至 AWS 中的其他服务,如 Lambda 函数或 SNS。