Как получить коллекцию всех последних значений атрибутов из DynamoDB?

#database #database-design #amazon-dynamodb

#База данных #база данных-дизайн #amazon-dynamodb

Вопрос:

У меня есть одна таблица, в которой я храню все данные датчиков. Id — это ключ раздела, TimeEpoch — ключ сортировки.
Примерная таблица выглядит следующим образом:

ID TimeEpoch Качество воздуха Температура Температура воды Уровень освещенности
b8a76d85-f1b1-4bec-abcf-c2bed2859285 1608208992 95
3a6930c2-752a-4103-b6c7-d15e9e66a522 1608208993 23.4
cb44087d-77da-47ec-8264-faccc2a50b17 1608287992 5.6
Последние 1608287992 95 5.6 23.4 1000

Мне нужно получить все последние значения атрибутов из таблицы.
На данный момент я использовал дополнительный элемент с Id = latest, где я сохраняю все последние значения, но я знаю, что это хакерский способ, который требует, чтобы датчик вводил данные с новым идентификатором GUID в качестве идентификатора и одновременно с Id = latest .
Все атрибуты известны, и вполне возможно, что один датчик с одним идентификатором может одновременно сохранять качество воздуха и температуру.

Ответ №1:

Базы данных NoSQL, такие как DynamoDB, — сложная вещь, потому что они не предлагают те же «шаблоны» запросов, что и традиционные реляционные базы данных.

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

Моим предложением для одного такого решения было бы использовать функцию DynamoDB, называемую потоками DynamoDB.

Короче говоря, потоки DynamoDB будут запускаться каждый раз, когда элемент в вашей таблице создается, изменяется или удаляется. Затем потоки отправят новую (и старую) версию этого элемента указанному вами «получателю». Обычно это будет лямбда-функция.

Решение, которое я бы предложил, — использовать потоки для отправки новых элементов в лямбда. Затем этот лямбда-выражение может считывать атрибуты элемента, которые не являются пустыми, и записывать их в любое хранилище данных, которое вам нравится. Может быть другая таблица DynamoDB, может быть S3 или что угодно еще, что вам нравится. Очевидно, что лямбда-выражение должно обязательно перезаписать предыдущие значения и т.д., Но подробная бизнес-логика зависит от вас.

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

Недостатком является то, что написание становится немного более сложным. Хотя бы потому, что вы добавляете в свое решение больше деталей (потоки DynamoDB, лямбда и т.д.). Это также немного увеличит ваши расходы, в зависимости от того, как часто меняются ваши данные. Поскольку вы, похоже, храните данные датчиков, которые могут быть довольно частыми. Так что имейте в виду, чтобы проверить стоимость. Это решение также приведет к большей задержке. Так что, если задержка является проблемой, это может быть не для вас.

Наконец, я хочу упомянуть, что рекомендуется иметь не более двух «получателей» потока таблиц. Это означает, что для производства я бы рекомендовал иметь только один приемник Lambda, а затем позволить этому Lambda создать событие AWS EventBridge (например, «элемент создан», «элемент изменен», «элемент удален»). Это позволит вам иметь намного больше лямбд и т.д. «прослушивание» таких событий и их обработка, смягчение ограничения потоков. Тогда это решение, основанное на событиях. Как и раньше, это добавит задержки.