У меня есть набор данных в DynamodB, чей первичный ключ — идентификатор пользователя, а метка времени — один из атрибутов данных. Я хочу выполнить запрос очистки для этой таблицы, где отметка времени старше 1 недели.
Я не хочу съесть все записи в единицах с. В идеале я хотел бы удалить операцию, ограничивающую скорость (в php). В противном случае для набора данных, размер которого составляет 10 ГБ, он прекратит другие записи.
Мне было интересно, что использование глобальных вторичных индексаций по метке времени (+ идентификатор пользователя) поможет уменьшить количество строк, которые будут сканироваться. Но опять же, я бы не хотел разбивать таблицу так, чтобы другие записи начинали сбоить.
Может кто-нибудь предоставить пример вставки / удаления кода ограничения скорости и ссылки для этого в php?
Вы можете создать глобальный вторичный индекс:
timestampHash (number, between 1 and 100)
timestamp (number)
Всякий раз, когда вы создаете / обновляете свою временную метку, также установите timestampHash
атрибут как случайное число от 1 до 100. Это будет равномерно распределять элементы в вашем индексе. Вам нужен этот хеш, потому что для выполнения запроса диапазона в GSI вам нужен хеш. Запросы по идентификатору пользователя и метке времени, похоже, не имеют смысла, потому что каждый раз будет возвращаться только один элемент, и вам придется зацикливаться на всех ваших пользователях (при условии, что для каждого идентификатора пользователя есть один элемент).
Затем вы можете запустить очиститель, который будет делать запрос 100 раз для каждого timestampHash
номер и все предметы с timestamp
старше 1 недели. Между каждым прогоном вы можете подождать 5 минут или столько времени, сколько считаете нужным, в зависимости от количества предметов, которые необходимо очистить.
Ты можешь использовать BatchWriteItem использовать многопоточность API для одновременного удаления.
В псевдокоде это выглядит так:
while (true) {
for (int i = 0; i < 100; i++) {
records = dynamo.query(timestampHash = i, timestamp < Date.now());
dynamo.batchWriteItem(records, DELETE);
}
sleep(5 minutes);
}
Вы также можете поймать ProvisionedThroughputExceededException
и сделайте экспоненциальный откат, чтобы, если вы превысили пропускную способность, вы разумно остановились и подождали, пока ваша пропускная способность не восстановится.
Другой способ — структурировать ваши таблицы по времени.
TABLE_08292016
TABLE_09052016
TABLE_09122016
Все ваши данные за неделю с 28.08.2016 г. TABLE_08292016
, Затем в конце каждой недели вы можете просто уронить стол.
Других решений пока нет …