0

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

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

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

我已经阅读了很多文件。并发现这种方法的许多局限性:

  1. 似乎 stream+lambda 将保证每个流分片将至少触发一次 lambda 函数,但不仅仅是一次。因此 lambda 函数必须是幂等的。(让 lambda 函数增加完成请求的数量在这里不起作用)。

所以,我认为每次触发 lambda 函数时我都必须扫描请求表。这种方法会有很多开销吗?

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

我也对所有其他可以解决这个问题的解决方案持开放态度。我不确定我是否遵循这里的最佳实践。

4

1 回答 1

0

我认为您可以通过使用另一个 DynamoDB 服务器来解决它。

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

FinishedTasks JobId - 分区键 - 作业 id FinishedRequestId - 排序键 - 完成请求的 id

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

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

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

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

于 2017-07-27T14:29:04.640 回答