如何使用DynamoDB Stream和lambda函数同步多个表

时间:2017-07-27 00:29:38

标签: lambda amazon-dynamodb amazon-dynamodb-streams

我有一个非常常见的用例需要同步2个dynamoDB表。逻辑流程如下:

  1. 在作业表中创建作业
  2. 在请求表中创建多个请求。所有请求都是从一个Job创建的,就像多对一关系一样。
  3. 请求由其他一些工作人员处理。
  4. 每个请求都将在请求表中标记为独立完成。
  5. 当完成对某项工作的所有请求后,在作业表中标记作业。
  6. 现在,我的想法是在Requests表上启用流。当请求完成时,它将触发一个lambda函数来检查是否所有请求都已完成。

    我看过很多文件。并发现这种方法的许多局限性:

    1. 似乎stream + lambda将保证每个流碎片至少触发一次lambda函数,但不仅仅是一次。因此lambda函数必须是幂等的。 (让lambda函数增加已完成请求的数量在这里不起作用)。
    2. 因此,我认为每次触发lambda函数时都必须扫描requests表。这种方法会有多少开销吗?

      1. DynamoDB流倾向于将每个事件分派到不同的分片中。每次填充时每个分片都会触发一个lambda函数。我不确定如果一个碎片长时间填满一半(没有事件发生在桌面上)。它还会以某种方式触发lambda函数吗?
      2. 我也对可以解决这个问题的所有其他解决方案持开放态度。我不确定我是否遵循这里的最佳做法。

1 个答案:

答案 0 :(得分:0)

我认为你可以使用另一台DynamoDB服务器来解决它。

您可以在DynamoDB中创建一个单独的表:

<强> FinishedTasks JobId - 分区键 - 作业的ID FinishedRequestId - 排序键 - 已完成请求的ID

每个lambda工作都会执行以下操作:

  1. 从流中读取新项目
  2. 将新项目写入 FinishedTasks
  3. 阅读所有已完成的职位ID任务
  4. 检查所有任务是否完成
  5. 如果所有任务都已完成,请执行必要的操作
  6. 在这种情况下,您有一个幂等任务(如果您覆盖 FinishedTasks 中的项目两次并不重要)

    当然,您需要从 FinishedTasks 中删除旧项目。要使用TTL feature自动删除旧项目。