DynamoDB | BatchGet | Получите результаты в том же порядке, что и предоставленные ключи - PullRequest
2 голосов
/ 11 июня 2019

Я использую AWS DynamoDB для хранения пользователей.

Рассмотрим следующий код:

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

Использование указанных выше параметров в BatchGet вернет повторно запрашиваемых пользователей , но в случайном порядке!

Вопрос: Возможно ли пользователям BatchGet не потерять порядок, определенный в ключах?

Ответы [ 2 ]

3 голосов
/ 11 июня 2019

Как правильно ответил Гари Вернон Грубб, факт, что BatchGetItem не возвращает элементы в порядке, задокументирован. Я просто хотел добавить, что этот «случайный порядок» не просто раздражает вас, но намеренно снижает задержку:

Если ваш пакет запрашивает получение 100 элементов, DynamoDB немедленно начнет извлекать все из них параллельно. Каждый из них может принадлежать другому узлу в кластере Amazon. Какой бы ответ ни пришел первым, Amazon может немедленно отправить его вам. Но это означает, что вы получите ответы обратно в случайном порядке.

Если бы «Динамо» настаивало на том, чтобы сначала вернуть первый запрошенный элемент, если вам не повезло, этот элемент может оказаться последним доступным - возможно, узел, хранящий его, был необычно занят или не удачлив - и только после этого DynamoDB мог начать отправку Ваш весь ответ. Это добавляет задержку самого медленного запроса к задержке отправки всего пакета, вместо того, чтобы перекрывать две задержки. Более того, буферизация и сортировка полученных элементов была бы неэффективной для реализации DynamoDB, потому что общий ответ может быть довольно длинным (https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_BatchGetItem.html объясняет, что он может быть до 16 МБ), и буферизация его в памяти, пока все не будет готово, быть дорогим Более эффективно просто отправлять каждый элемент, когда он становится доступным.

Наконец, обратите внимание, что вы не только получаете ответы в случайном порядке, но также возможно, что вы не получите ответы на все ваши запросы. Если некоторые запросы не были обработаны, вы получите список их в UnprocessedKeys, и вам нужно будет сделать эти запросы снова. Это не должно быть последним из ваших запросов, они могут быть и подмножеством запрошенных ключей. Это может произойти из-за того, что общий размер ответа превышает 16 МБ, поэтому часть его не была возвращена, или из-за того, что вы превысили предоставленную емкость.

1 голос
/ 11 июня 2019

Вам нужно будет отсортировать элементы, как только они будут получены.Как задокументировано здесь . При разработке приложения имейте в виду, что DynamoDB не возвращает элементы в каком-либо конкретном порядке.

У меня была такая же проблема в недавнем прошлом, и мне пришлось написать несколько дополнительныхкод для сортировки элементов так, как я хотел.

...