使用 Amazon DocumentDB 的 Change Streams 构建事件驱动架构

介绍利用 DocumentDB 的变更数据捕获与 Lambda 触发器联动,构建实时数据同步的事件驱动架构的方法。

Change Streams 的机制

DocumentDB 的 Change Streams 是实时捕获对集合的变更(插入、更新、删除、替换)的功能。它与 MongoDB 的 Change Streams API 兼容,可以直接使用现有 MongoDB 应用程序的代码。Change Streams 以集群的变更日志(oplog)为基础,按照变更发生的顺序进行投递。每个事件包含 operationType(insert、update、delete)、documentKey(被变更文档的 ID)和 fullDocument(变更后的整个文档)。

与 Lambda 触发器的集成

将 DocumentDB 的 Change Streams 设置为 Lambda 的事件源映射后,变更事件会自动投递到 Lambda 函数。在 Lambda 函数内根据事件的类型执行相应的处理。典型的用例有 OpenSearch 的索引更新(将文档的变更立即反映到搜索索引)、ElastiCache 的缓存失效(删除被变更文档的缓存)。此外还有向 DynamoDB 的数据同步(维护针对读取优化的视图)、SNS 通知(通知符合特定条件的变更)。通过设置批处理大小和批处理窗口,将多个事件合并处理,可以提高吞吐量。

图:变更写入 oplog 后到达下游的 4 个阶段
  1. 1. 变更记录到 oplog对集合的插入 / 更新 / 删除 / 替换会写入集群的变更日志(oplog)。Change Streams 以这个 oplog 为基础,按照变更发生的顺序进行投递。
  2. 2. 组装变更事件每个事件包含 operationType(insert、update、delete)、documentKey(被变更文档的 ID)和 fullDocument(变更后的整个文档)。由于与 MongoDB 的 Change Streams API 兼容,可以直接使用现有应用程序的代码。
  3. 3. 投递到 Lambda 的事件源映射预先设置为事件源映射后,变更事件会自动传给 Lambda 函数。用批处理大小和批处理窗口将多个事件合并,可以提高吞吐量。
  4. 4. 反映到下游,并用 resume token 保存重新开始的位置执行 OpenSearch 的索引更新、ElastiCache 的缓存失效、向 DynamoDB 的同步、SNS 通知等。只要保存好每个事件中包含的 resume token,在故障恢复时就可以从最后处理的事件的下一个开始重新读取(在事件源映射中是自动的)。

故障恢复与运维注意事项

Change Streams 的每个事件都包含 resume token,通过保存这个 token,可以在故障恢复时从最后处理的事件的下一个开始恢复读取。在 Lambda 的事件源映射中,resume token 的管理是自动化的。Change Streams 的变更日志最多保留 7 天,因此如果处理停止 7 天以上,旧的事件就会丢失。为应对长时间的故障,推荐采用在 Change Streams 之外定期获取完整快照的设计。启用 Change Streams 会对集群的性能产生少许影响,因此在生产环境中事先实施性能测试。

Change Streams 的费用考虑

Change Streams 本身不产生额外费用,但保留变更日志会消耗 I/O 和存储。变更日志的保留期最长为 7 天,写入多的集合的存储使用量会增加。使用 Lambda 触发器时,会产生 Lambda 调用次数和执行时间的费用。对于变更频率高的集合,调大 Lambda 的批处理大小,减少调用次数,以优化成本。选择转发到 Kinesis Data Streams 时,会追加分片小时的费用。

变更数据捕获的应用范围

Change Streams 是以数据的变更为起点联动各种处理的基础。具有代表性的是让搜索引擎的索引跟随文档变更的用途,以及使被变更数据的缓存失效、始终返回最新数据的用途。维护另一个针对读取优化的视图、把变更流向分析平台进行汇总等用法也在扩展。其优点是无需修改写入端的应用程序,就可以以松耦合的方式追加后续处理,从而提高逐步扩展系统时的灵活性。

变更事件的过滤与整形

Change Streams 使用与 MongoDB 兼容的聚合管道,可以筛选要接收的变更。可以进行只针对特定的集合或操作类型、只在关注的字段发生变化时才响应之类的控制。使用在更新事件中获取变更后整个文档的选项,就可以把完整的状态而不仅是差异传给后续处理。通过只放行需要的事件,可以降低下游的处理负载和成本。不是在接收端对全部事件进行筛选,而是在靠近源头的阶段进行筛选的设计效率高。

向 Kinesis 和 MSK 的扇出

想把变更事件送到多个处理系统时,通过 Lambda 转发到 Kinesis Data Streams 或 MSK 的架构很有效。一旦汇集到流式处理平台,多个消费者就可以各自出于不同目的消费同样的变更,并行运行搜索更新 / 分析 / 通知等。对于顺序很重要的数据,通过键的设计将其汇集到同一个分片或分区来保持顺序。可以随着需求的增长,从直接用 Lambda 处理的简单架构,发展为中间加入流式处理平台的高扩展性架构。

设计上的注意事项与最佳实践

在使用 Change Streams 的事件驱动中,掌握几条常规做法。将处理设计为幂等,使同一事件即使被重新投递也不会出现问题。使用 resume token 使处理能够从中断位置恢复,并且为应对处理停止超过变更日志保留期就会丢失旧变更这一点,另外获取快照。启用可能会影响集群的负载,因此在投入生产之前验证性能。监控延迟和失败,在积压增加时尽早应对,就可以维持高可靠性的变更联动。

总结

DocumentDB 的 Change Streams 是实时捕获文档的变更、构建事件驱动架构的功能。通过 Lambda 触发器自动处理变更,通过与 Kinesis Data Streams 的集成将数据投递到下游的分析管道。用 resume token 管理处理的恢复位置,实现高可靠性的变更数据捕获。

参考资料(AWS 官方)

本页的第一手信息来源是 AWS 官方网站及官方文档。最新的规格与价格请以下列官方页面为准。

如本页内容与官方文档不一致,请以官方文档为准。

分享