DynamoDB ItemCount替代方案

时间:2020-10-04 06:34:00

标签: sql amazon-web-services amazon-dynamodb amazon-kinesis-firehose amazon-dynamodb-streams

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

方法1(天真): 在batchID + status上的复合GSI上运行查询,并根据每个请求检查计数是否匹配。这将非常昂贵。

方法2: 使用DynamoDB的原子计数器,其中key = batchID,而value是一个计数。在每次插入数据库时​​,我都要确保计数增加。如果计数与期望值匹配,我将检查计数并引发触发器。 但是在这种情况下,可能会出现限制和错误(即更新失败)的情况。

如果是SQL,我本来会

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

我想知道AWS中是否可以使用某种混合方法来解决此用例。

1 个答案:

答案 0 :(得分:1)

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

DynamoDBDataTable

  • PK一些数据
  • GSI batchID
  • 数据{状态,... someOtherData}

DynamoDBBatchIndexingTable

  • PK batchID
  • 数据{amountOfProcessedItems,已发送}

Lambda1

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

Lambda2

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