DynamoDB ItemCount备选方案



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

方法1(Naive(:在batchID+状态下对复合GSI运行查询,并检查每个请求处的计数是否匹配。这将非常昂贵。

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

如果是SQL,我会有

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

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

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

DynamoDB数据表

  • PK部分数据
  • GSI批次ID
  • 数据{status,…someOtherData}

DynamoDBBatchIndexing表

  • PK批次ID
  • 数据{amountOfProcessedItems,isSent}

Lambda1

  • 由DynamoDBDataTable流触发
  • 如果流中记录的状态变为"0";已处理";它用+1更新DynamoDBBatchIndexingTable中PK=batchId的amountOfProcessedItems
  • 如果amountOfProcessedItems现在为2000,则触发Lambda2

Lambda2

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

最新更新