Пишу простой сервис логирования в DynamoDB.
У меня есть таблица журналов, в которой используется хэш user_id и диапазон временных меток (Unix epoch int).
Когда пользователь службы закрывает свою учетную запись, мне нужно удалить все элементы в таблице, независимо от значения диапазона.
Каков рекомендуемый способ выполнения такой операции (имея в виду, что могут быть удалены миллионы элементов)?
Насколько я понимаю, у меня есть следующие варианты:
A: Выполните операцию сканирования, вызывая удаление для каждого возвращенного элемента, пока не останется ни одного элемента.
B: выполнить операцию BatchGet, снова вызывая удаление для каждого элемента, пока не останется ни одного
Мне оба эти варианта кажутся ужасными, так как на них уйдет много времени.
В идеале я хочу вызвать LogTable.DeleteItem (user_id) - без указания диапазона и заставить его удалить все за меня.
BatchWriteItem
элементами необходимо указать черезTableWriteItems
batch_writer()
как частьboto3.resource.Table
API, который «автоматически обрабатывает буферизацию и отправку элементов в пакетах. Кроме того, средство записи пакетов будет также автоматически обрабатывает любые необработанные элементы и повторно отправляет их по мере необходимости », т.е. это оболочка вокруг BatchWriteItem, которая управляет раздражающими частями. boto3.amazonaws.com/v1/documentation/api/latest/reference/…Согласно документации DynamoDB, вы можете просто удалить всю таблицу.
Увидеть ниже:
«Удаление всей таблицы значительно более эффективно, чем удаление элементов по одному, что существенно удваивает пропускную способность записи, поскольку вы выполняете столько же операций удаления, сколько операций вставки»
Если вы хотите удалить только часть ваших данных, вы можете создать отдельные таблицы для каждого месяца, года или чего-то подобного. Таким образом, вы можете удалить «последний месяц» и сохранить остальные данные нетронутыми.
Вот как вы удаляете таблицу в Java с помощью AWS SDK:
источник
Если вы хотите удалить элементы через некоторое время, например, через месяц, просто используйте опцию Time To Live. Он не будет считать единицы записи.
В вашем случае я бы добавил ttl по истечении срока действия журналов и оставил их после удаления пользователя. TTL гарантирует, что журналы в конечном итоге будут удалены.
https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/TTL.html https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/howitworks-ttl.html
источник
Ответ на этот вопрос зависит от количества предметов, их размера и вашего бюджета. В зависимости от этого у нас есть 3 случая:
1- Количество и размер предметов в таблице не очень много. то, как сказал Штеффен Опель, вы можете использовать запрос вместо сканирования, чтобы получить все элементы для user_id, а затем перебрать все возвращенные элементы и либо облегчить,
DeleteItem
либоBatchWriteItem
. Но имейте в виду, что здесь вы можете сжечь большую пропускную способность. Например, рассмотрим ситуацию, когда вам нужно удалить 1000 элементов из таблицы DynamoDB. Предположим, что каждый элемент имеет размер 1 КБ, в результате получается около 1 МБ данных. Эта задача массового удаления потребует в общей сложности 2000 единиц емкости записи для запроса и удаления. Чтобы выполнить эту загрузку данных в течение 10 секунд (что даже не считается быстрым в некоторых приложениях), вам нужно будет установить предоставленную пропускную способность записи для таблицы на 200 единиц емкости записи. Как видите, можно использовать этот способ для меньшего количества элементов или элементов небольшого размера.2- У нас много предметов или очень крупных предметов в таблице, и мы можем хранить их в зависимости от времени в разных таблицах. Затем, как сказал Джонатан, вы можете просто удалить таблицу. это намного лучше, но я не думаю, что это подходит к вашему случаю. Поскольку вы хотите удалить все данные пользователей, независимо от времени создания журналов, в этом случае вы не можете удалить конкретную таблицу. Если вы хотите иметь отдельную таблицу для каждого пользователя, я думаю, что если количество пользователей велико, то это так дорого и непрактично для вашего случая.
3- Если у вас много данных и вы не можете разделить горячие и холодные данные на разные таблицы, и вам нужно часто выполнять крупномасштабное удаление, то, к сожалению, DynamoDB совсем не подходит для вас. Это может стать дороже или очень медленно (зависит от вашего бюджета). В этих случаях я рекомендую найти другую базу данных для ваших данных.
источник
Мой подход к удалению всех строк из таблицы i DynamoDb заключается в том, чтобы просто вытащить все строки из таблицы с помощью DynamoDbs ScanAsync, а затем передать список результатов в DynamoDbs AddDeleteItems. Код ниже на C # у меня отлично работает.
Примечание. Удаление таблицы с последующим ее воссозданием из веб-консоли может вызвать проблемы при использовании YAML / CloudFront для создания таблицы.
источник
У нас нет возможности обрезать динамо-таблицы. мы должны отбросить таблицу и снова создать. Сборы DynamoDB основаны на ReadCapacityUnits и WriteCapacityUnits. Если мы удалим все элементы с помощью функции BatchWriteItem, он будет использовать WriteCapacityUnits, поэтому лучше удалить определенные записи или удалить таблицу и начать заново.
источник