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

How to use DynamoDB Stream and lambda functions to sync multiple tables

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

  1. 在作业Table
  2. 中创建了一个作业
  3. 在请求 Table 中创建了多个请求。所有的请求都是从一个工作创建的,就像多对一的关系。
  4. 请求由其他一些工作人员处理。
  5. 每个请求都将在请求 Table 中独立标记为已完成。
  6. 当某个作业的所有请求都完成后,在作业 table 中标记作业已完成。

现在,我的想法是在请求上启用流 table。当一个请求完成时,它会触发一个 lambda 函数来检查是否所有的请求都完成了。

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

  1. 好像stream+lambda会保证每个stream shard都会触发一个lambda函数至少一次,但不止一次。因此 lambda 函数必须是幂等的。 (让lambda函数增加完成请求的数量在这里不起作用)。

所以,我想我必须在每次触发 lambda 函数时扫描请求 table。这种方法会不会有很多开销?

  1. DynamoDB 流倾向于将每个事件分派到不同的分片中。每个分片只要被填满就会触发一个 lambda 函数。我不确定如果分片长时间半满会怎样(table 没有事件)。它还会以某种方式触发 lambda 函数吗?

我也对可以解决此问题的所有其他解决方案持开放态度。我不确定我是否遵循了此处的最佳做法。

我想你可以通过使用另一个 DynamoDB 服务器来解决它。

您可以在 DynamoDB 中创建单独的 table:

已完成任务 JobId - 分区键 - 作业 ID FinishedRequestId - 排序键 - 已完成请求的 ID

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

  1. 从流中读取新项目
  2. 将新项目写入 FinishedTasks
  3. 读取作业 ID 的所有已完成任务
  4. 检查所有任务是否完成
  5. 如果所有任务都已完成,请执行必要的操作

在这种情况下,您有一个幂等任务(覆盖 FinishedTasks 中的项目两次并不重要)

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