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 МБ, поэтому некоторые из них не были возвращены, или из-за того, что вы превысили предоставленную емкость.

Другие вопросы по тегам