DynamoDB |Как запросить все записи в отсортированном порядке без указания ключа раздела - PullRequest
2 голосов
/ 28 октября 2019

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

Каждая запись имеет следующий формат:

uuid  timestamp  type

, где

  • uuid - это идентификатор пользователя и ключ раздела
  • timestamp - это метка времени Unix и ключ сортировки
  • type "подключен" или "отключен"

В нашей панели администратора я хочу отобразить таблицу с последними XX сессиями, сначала с самой новой сессией.

Вопрос: Как использовать AWS DynamoDB, как я могу запросить все sessions в отсортированном порядке и с заданным пределом?

Требуется указать partition key при использовании Query

A Scan не возвращает результаты в отсортированном порядке.

Все решения, которые я видел, кажутся немного "хакерскими", и я подозреваю, что я что-то неправильно понял, так как этот вариант использования должен быть довольно распространенным.

Мне известно об этом хакерском решении :

  1. Определить переменную для всех строк с одинаковым значением
  2. Создать вторичный индекс и установитьпеременная в качестве ключа раздела и временная метка в качестве ключа сортировки
  3. Запрос этого вторичного индекса (теперь все строки имеют один и тот же ключ разделения)

Я не эксперт в DynamoDB, но это решение кажетсябыть взломом и противостоять архитектуре DynamoDB.

1 Ответ

1 голос
/ 28 октября 2019

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

Вот несколько вариантов:

  1. Сохраните еще одну запись с ключом раздела "activesessions". Эта запись содержит массив ключей раздела для ваших активных сессий. Одна динамо-запись может хранить 400 КБ данных, поэтому вы можете хранить тысячи активных ключей сеанса в этой одной записи (и просматривать их, если вам нужно больше). Недостатком этого является то, что вы должны поддерживать эту запись «активных сессий», так как сессии добавляются и удаляются.

  2. Сканирование - вы говорите, что записи не упорядочены, однако вы можете упорядочить их в своем коде после извлечения из динамо. По сути, это то, что делает динамо для выражений фильтра:

FilterExpression применяется после того, как элементы уже прочитаны;процесс фильтрации не потребляет дополнительных единиц емкости чтения.

Недостаток сканирования - он не масштабируется и использует большую емкость чтения. Я бы использовал это только в том случае, если ваше общее количество сеансов гарантированно будет небольшим (максимум несколько тысяч).

Предлагаемый вами вариант будет работать, однако вы все равно должны попытаться дать своим записям ключ как можно более уникальный. Вместо того, чтобы хранить их все с одним и тем же ключом раздела, возможно, сделайте его более уникальным, используя такой формат, как «samevalue-todaysdate». Таким образом, ваши запросы смогут находить сеансы за определенный день намного быстрее, чем поиск по каждому сеансу.

Не использовать DynamodB - используйте AWS RDS: mySQL, SQL-сервер и т. Д. .

...