动态数据库 |批量获取 |以与提供的键相同的顺序获取结果

DynamoDB | BatchGet | Get results in same order as provided Keys

我正在使用 AWS DynamoDB 来存储用户。

考虑以下代码:

let params = {
  RequestItems: {
    'users': {
       Keys: [
        {id: '1111'},
        {id: '2222'},
        {id: '3333'},
        {id: '4444'},
        ]
        }
      }
    };

在 BatchGet 中使用上述参数将 return 请求的用户 但顺序是随机的!

问题: 是否可以在不丢失Keys中定义的顺序的情况下BatchGet用户?

您必须在检索到项目后对其进行排序。如文档所述 here,在设计您的应用程序时,请记住 DynamoDB 不会 return 任何特定顺序的项目。

我最近遇到了同样的问题,不得不编写一些额外的代码来按照我想要的方式对项目进行排序。

2019 年 8 月 22 日更新: 我想提一下,如果在您的情况下可行,您可以切换到使用带有排序键的 GSI 查询并检索排序的数据。

使用 ScanIndexForward:真 || false 根据需要对数据进行升序或降序排序。

更多详情here

正如 Gary Vernon Grubb 正确回答的那样,BatchGetItem 没有 return 项的事实已记录在案。我只是想补充一点,这个 "random order" 并不是为了惹恼你,而是故意降低延迟:

如果您的批处理要求检索 100 个项目,DynamoDB 将立即开始并行检索所有项目。每一个都可能来自亚马逊集群中的不同节点。无论响应先到什么,亚马逊都可以立即将其发回给您。但这意味着您将以看似随机的顺序返回响应。

如果 Dynamo 坚持先 returning first-requested 项目,如果你不走运,这个项目可能是最后一个可用的 - 也许存储它的节点异常繁忙或者不幸的是——只有到那时 DynamoDB 才能开始向您发送整个响应。这会将最慢请求的延迟添加到发送整个批处理的延迟中,而不是重叠两个延迟。此外,缓冲和排序检索到的项目对于 DynamoDB 实施来说效率低下,因为整体响应可能相当长(https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_BatchGetItem.html 解释说它可以达到 16MB),并且将其缓冲在内存中直到一切准备就绪昂贵的。当每件物品可用时才发送会更有效率。

最后,请注意,您不仅会以随机顺序收到回复,而且您也有可能不会收到所有请求的回复。如果某些请求未得到处理,您将在 UnprocessedKeys 中获得它们的列表,并且需要再次发出这些请求。这些不一定是您的最后一个请求,它们可以是所请求密钥的子集。这种情况的发生可能是因为响应的总大小超过 16MB,因此其中一些未被 returned,或者因为您超出了配置的容量。