DynamoDB 跟踪 2 个表之间的执行

DynamoDB keep track of execution between 2 tables

我有一个 Lambda,它向服务发出 API 请求并获取给定标识符的匹配列表。 一旦获得匹配列表,它就会按以下方式更新 DynamoDB table:

requestId (partitionKey) ID matches status
uuid1 ID1 [match1,match2, match3...] FOUND_MATCHES

对于此 table 中的每个匹配项,都会向 SQS 发送一条消息,由 Lambda 侦听。对于每场比赛,Lambda 将调用不同的服务并更新一个 table 来跟踪比赛的执行。

Match (partitionKey) requestId (sortKey + GSI Partition Key)
match1 uuid1
match2 uuid1
... ...
match10 uuid1

现在给定 requestId,我想知道第二个 table 中是否有所有匹配项。

我想的一个选项是通过 requestId 查找第一个 table,它会给出匹配列表,然后它会通过主键多次调用第二个 table , sortKey 组合并编译出一个结果。另一个选项不是通过主 key/sort 键查找第二个 table,而是通过 requestId 列上的 GSI Parition 键查找并一次获取所有匹配项(在分页列表中)。

我想通过 API 调用公开此操作,我想知道我是否会 运行 进入 APIG 30 秒超时(我知道我'我将需要 运行 对我的数据集进行一些实验,但只是想看看在执行此操作之前是否还有其他我可以考虑的选项)。如果匹配数超过 50,000。每个 get 调用大约需要 20 毫秒,大约需要 50,000 * 20 = 1000 秒,这远远超过 APIG 限制。也许批量调用可能有点帮助,但不确定那里有多少空间。

基本上我想将第一个 table 中的状态从 FOUND_MATCHES 更新为 ALL_MATCHES_PROCESSED

  1. 理想的选择是自动更新状态
  2. A Get status API 本质上触发计算并更新状态(也许使这个异步超过 30 秒 APIG 限制)

我可能会这样做,因为我是单一 table 设计模式的粉丝:

PK SK type attributes
REQ#<id> META REQUEST matches: [a,b,c]; unprocessed_matches: 3; status: FOUND_MATCHES
REQ#<id> M#a MATCH result
REQ#<id> M#b MATCH result
REQ#<id> M#c MATCH result

每当收到新请求时,您将 REQUEST 写入包含匹配项的 table 和计算所有匹配项的 unprocessed_matches 属性。

然后你有一个 Lambda 函数“stream-processor”,它监听 table 的流。 当出现 new REQUEST 项目时(不存在旧图像),它会在您的 SQS 队列中创建任务。

您的 SQS 队列上的工作进程然后调用第 3 方 API 并记录结果。 然后通过带有两项的事务将结果写入table:

  1. 一个 UpdateItem 调用,将请求 ID 的 unprocessed_matches 值减一。
  2. 一个 PutItem 调用,创建 MATCH 项。

此处的交易很重要,您希望这是一个全有或全无的操作。

你的流处理器 lambda 有第二份工作。 每当 REQUEST 项目有更新时,它应该检查是否 unprocessed_matches <= 0 and status = FOUND_MATCHES。 在这种情况下,它应该更新 REQUEST 项目并将状态设置为 ALL_MATCHES_PROCESSED.

您发出第一个请求的原始 Lambda 可以定期轮询 table 中项目的状态。

这种设计还让您可以通过简单的 Query 到具有请求 ID 的分区键来轻松获取有关请求的所有信息。

您应该知道 DynamoDB 中有 400KB 的项目大小限制,这取决于您的匹配列表的长度,这可能会成为一个问题。