8

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

考虑以下代码:

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

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

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

4

2 回答 2

5

一旦检索到项目,您就必须对其进行排序。如此所述,在设计您的应用程序时,请记住 DynamoDB 不会以任何特定顺序返回项目。

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

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

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

更多细节在这里

于 2019-06-11T13:23:57.633 回答
3

正如 Gary Vernon Grubb 正确回答的那样,记录了 BatchGetItem 没有按顺序返回项目的事实。我只是想补充一点,这种“随机顺序”不仅仅是为了惹恼你,而是故意降低延迟:

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

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

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

于 2019-06-11T15:30:51.613 回答