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 用户?
正如 Gary Vernon Grubb 正确回答的那样,记录了 BatchGetItem 不按顺序返回项目的事实。我只是想补充一点,这种“随机顺序”的发生不仅仅是为了惹恼你,而是故意降低延迟:
如果您的批次要求检索 100 个项目,DynamoDB 将立即开始并行检索所有项目。每个节点可能来自 Amazon 集群中的不同节点。无论先有什么回应,亚马逊都可以立即将其发回给您。但这意味着您将以看似随机的顺序得到响应。
如果 Dynamo 坚持先返回第一个请求的项目,如果您不幸运,该项目可能是最后一个可用的项目 - 也许存储它的节点异常繁忙或不幸运 - 只有这样 DynamoDB 才能开始发送您的整个数据回复。这会将最慢请求的延迟添加到发送整个批次的延迟中,而不是使两个延迟重叠。此外,对于 DynamoDB 实现来说,对检索到的项目进行缓冲和排序效率很低,因为总体响应可能相当长(https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_BatchGetItem.html解释说它可以是高达 16MB),并且将其缓冲在内存中直到全部准备好,这将是昂贵的。当每件物品可用时就发送它会更有效。
最后,请注意,您不仅会按随机顺序收到响应,而且您也可能不会收到所有请求的响应。如果某些请求未得到处理,您将在 中获得这些请求的列表UnprocessedKeys,并且需要再次发出这些请求。这些不一定是您的最后一个请求,它们可以是所请求的密钥的子集。发生这种情况的原因可能是响应的总大小超过 16MB,因此其中一些响应未返回,或者因为您超出了预配容量。
| 归档时间: |
|
| 查看次数: |
2725 次 |
| 最近记录: |