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

Vin*_*oft 7 amazon-web-services amazon-dynamodb documentclient

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

考虑以下代码:

let params = {
  RequestItems: {
    'users': {
       Keys: [
        {id: '1111'},
        {id: '2222'},
        {id: '3333'},
        {id: '4444'},
        ]
        }
      }
    };
Run Code Online (Sandbox Code Playgroud)

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

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

Gar*_*ubb 10

取回物品后,您必须对其进行排序。如此处所述,设计应用程序时,请记住 DynamoDB 不会按任何特定顺序返回项目。

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

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

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

更多详情请点击此处


Nad*_*'El 7

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

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

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

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