DynamoDB | BatchGet | Получите результаты в том же порядке, что и предоставленные ключи
Я использую AWS DynamoDB для хранения пользователей.
Рассмотрим следующий код:
let params = {
RequestItems: {
'users': {
Keys: [
{id: '1111'},
{id: '2222'},
{id: '3333'},
{id: '4444'},
]
}
}
};
Использование указанных выше параметров в BatchGet вернет запрашиваемых пользователей, но в случайном порядке!
Вопрос: Возможно ли пользователям BatchGet не потерять порядок, определенный в Ключах?
2 ответа
Вам придется отсортировать элементы, как только они будут получены. Как указано здесь, при разработке приложения имейте в виду, что DynamoDB не возвращает элементы в каком-либо определенном порядке.
У меня была такая же проблема в недавнем прошлом, и мне пришлось написать дополнительный код для сортировки элементов так, как я хотел.
Обновление 22 августа 2019 года. Я хотел бы упомянуть, что вы можете переключиться на использование запроса в GSI с ключом сортировки и получать отсортированные данные, если это возможно в вашем случае.
Использовать ScanIndexForward: true || false для сортировки данных по возрастанию или убыванию по мере необходимости.
Подробнее здесь
Как правильно ответил Гари Вернон Грубб, факт, что BatchGetItem не возвращает элементы в порядке, задокументирован. Я просто хотел добавить, что этот "случайный порядок" не просто раздражает вас, а позволяет снизить задержку:
Если ваш пакет запрашивает получение 100 элементов, DynamoDB немедленно начнет извлекать все из них параллельно. Каждый из них может принадлежать другому узлу в кластере Amazon. Какой бы ответ ни пришел первым, Amazon может немедленно отправить его вам. Но это означает, что вы получите ответы обратно в случайном порядке.
Если бы "Динамо" настаивало на том, чтобы сначала вернуть первый запрошенный элемент, если вам не повезло, этот элемент может оказаться последним доступным - возможно, узел, хранящий его, был необычно занят или неудачлив - и только тогда DynamoDB может начать отправку всего ответ. Это добавляет задержку самого медленного запроса к задержке отправки всего пакета, вместо того, чтобы перекрывать две задержки. Кроме того, буферизация и сортировка полученных элементов была бы неэффективной для реализации DynamoDB, поскольку общий ответ может быть довольно длинным ( https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_BatchGetItem.html объясняет, что это может быть до 16 МБ), и буферизация в памяти, пока все не будет готово, будет дорогой. Более эффективно отправлять каждый элемент, когда он становится доступным.
Наконец, обратите внимание, что вы не только получаете ответы в случайном порядке, но также возможно, что вы не получите ответы на все ваши запросы. Если некоторые запросы не были обработаны, вы получите их список в UnprocessedKeys
и нужно сделать эти запросы еще раз. Это не должно быть последним из ваших запросов, они могут быть и подмножеством запрошенных ключей. Это может произойти из-за того, что общий размер ответа превышает 16 МБ, поэтому некоторые из них не были возвращены, или из-за того, что вы превысили предоставленную емкость.