DynamoDB ItemCount 替代方案

DynamoDB ItemCount alternative

我有一个用例,我将从上游获取特定 batchID 的记录以及预先批处理的一些元数据。 例如,有人告诉我 batchID="ABC" 将有 2000 条记录。在我开始在我的服务中获取记录后,我进行了一些处理并将其保存在状态为“已处理”的数据库中。所以我的用例是,一旦我获得了 batchID 的所有 2000 条记录,我必须创建一个包含该批次中所有记录 (2000) 的 CSV 文件,并将其发送到其他服务。另外,我将状态更新为“已发送”。

方法 1(朴素): 运行 对 batchID+status 的复合 GSI 进行查询,并检查 每个请求 的计数是否匹配。这将非常昂贵。

方法二: 使用 DynamoDB 的原子计数器,其中 key = batchID 和 value 是一个计数。在每次插入数据库时​​,我都会确保计数增加。如果计数符合预期,我会检查计数并引发触发器。 但是在这种情况下会出现节流和错误的情况(即如果更新失败)。

如果是SQL,我会

SELECT COUNT(*) FROM records_table WHERE batchID = "ABC

我想知道 AWS 中是否有一些混合方法可以用来解决这个用例。

我建议使用另一个 table 进行批量索引和处理的记录数量跟踪。您可以使用 DynamoDB 流到 运行 lambda,它会在需要时更新数量(当设置了所需的状态时)。同样的 lambda 函数也会检查数量是否达到 2k 并触发另一个执行发送的 lambda 函数。下面是更详细的架构描述。

DynamoDBDataTable

  • PK一些数据
  • GSI 批次 ID
  • 数据{状态,...someOtherData}

DynamoDBBatchIndexingTable

  • PK batchID
  • 数据 {amountOfProcessedItems,isSent}

Lambda1

  • 由 DynamoDBDataTable 流触发
  • 如果流中记录的状态更改为“已处理”,它会更新 DynamoDBBatchIndexingTable 中 PK = batchId 的 amountOfProcessedItems +1
  • 如果 amountOfProcessedItems 现在是 2000,触发 Lambda2。

Lambda2

  • 由 Lambda 1 触发。
  • 获取batchID上所有基于GSI的记录
  • 创建 CSV 文件并将其发送到其他服务。为此,您至少需要 1GB ram lambda。
  • 更新 DynamoDBBatchIndexingTable 设置 isSent = true
  • 使用 GSI = batchID 和 status="SENT" 更新 DynamoDBDataTable 的所有记录。也许在您的情况下,仅更改 isSent 就足够了,也许还不够——我没有足够的上下文细节。