【问题标题】:Is Lambda right choice when setting up CDC application设置 CDC 应用程序时,Lambda 是正确的选择吗
【发布时间】:2020-01-03 12:41:50
【问题描述】:

我正在尝试针对 AWS 中的事务数据库实施 CDC,并将其加载到 Snowflake 数据库中。我能够捕获从 Postgres 数据库到 S3 存储桶的更改。

这些是接下来的步骤 - 1) 针对 S3 存储桶设置事件通知并触发 lambda (#1) 2) Lambda #1 将创建一条包含与文件关联的数据和发布时间戳的消息,并将此消息发送到 FIFO SQS 队列,这将触发另一个 lambda (#2) 3) Lambda #2 将运行 COPY INTO 语句,将数据写入雪花

这是一个想到的问题—— 当 Lambda #2 被触发时,如果一批记录失败,我们如何停止调用未来的调用? 由于这是一个 CDC 应用程序,我们必须维护从源数据库到 Snowflake 的事务更改的顺序。 Lambda #2 是正确的选择吗?

【问题讨论】:

  • CDC 代表什么?
  • 变更数据捕获

标签: amazon-web-services aws-lambda amazon-sqs aws-dms


【解决方案1】:

在使用 Lambda 函数来捕获 CDC 事件时需要考虑一些因素。要迁移的数据量。
对于重要的数据更改 - 您需要注意 Lambda limits,例如 3GB 内存、512MB 存储等。如果数据恰好很大,这可能会导致 lambda 函数失败。

现在对于您的问题 - 执行 COPY INTO 的 Lambda #2 - 您可能希望它跟踪一些状态,该状态指示处理的最后一条消息 id、时间戳等是什么。这样后续的 lambda 函数在出现故障时不会被触发。 所以你的 lambda2 可能看起来像:
1. 获取 SQS 事件详细信息 - 检查 dynamo 或 RDS 表是否之前处理过相同事件或之前失败。还要检查是否有任何过去的事件处于失败状态。如果有或采取补救措施,则触发警报。 2. 将事件存储到 dynamo DB 或 RDS 表中。
3. 进行处理。
4. 更新成功/失败表。

【讨论】:

  • 感谢您的回复。您是否将以下内容澄清为 - 1) 当 lambda2 (2.a) 的第一次调用开始时 - 在 Dynamo/RDS 中捕获 SQS 事件详细信息并标记为“正在处理” 2) 如果新消息到达 SQS,则第二次调用 (2. b) 启动但检查是否有事件处于“处理”状态,等到“处理”清除然后继续
  • 是的,这是正确的。步骤一。在表中保留事件 - 执行检查等以确保之前未处理它。步骤 b。查找以前的失败事件。仅在没有失败或处理中事件时处理。
  • 再次感谢!在这一步 - 使用 lambda 是否过大?使用在现有 Ec2 实例上运行的 (python) 作业会更好吗?该作业将轮询队列中的新消息并发出 Copy/into 并标记已处理的消息
  • 如果存在可以通过添加 python 作业来利用的现有 EC2,它可能是一个更简单的设计。作为一种实践,当它是唯一可用的技术选择时,我们会使用一些 Lambda——例如 API 网关上的自定义授权、不常用的服务、S3 上的事件等。如果您有一组运行的 EC2 并维护,那么您可以不需要依赖 Lambdas。
  • 再次感谢 mailtobash !我会将答案标记为完整。
【解决方案2】:

这是mailtobash 关于使用 lambda 的另一个回答

" 如果您可以通过添加 python 作业来利用现有的 EC2,那么它可能是一个更简单的设计。作为一种实践,当它是唯一可用的技术选择时,我们会使用一些 Lambda——例如 API 网关上的自定义授权、不常用的服务、S3 上的事件等。如果您有一组运行的 EC2 并维护,那么您可以不需要依赖 Lambdas "

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多