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 就足够了,也许还不够——我没有足够的上下文细节。
我有一个用例,我将从上游获取特定 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 就足够了,也许还不够——我没有足够的上下文细节。