Поиск просроченных данных в aws DynamoDB - PullRequest
0 голосов
/ 20 февраля 2020

У меня есть требование, где мне нужно хранить некоторые данные в Dynamo-DB с состоянием и отметкой времени. Например. <START, 20180203073000>

Теперь статус выше переходит на STOP, когда я получаю сообщение в SQS. Но, чтобы сделать мою систему защищенной от ошибок, мне нужен какой-то механизм, с помощью которого я могу определить, являются ли данные, имеющие START статус, присутствующий в Dynamo-DB, старше 1 дня, а затем установить их статус на STOP. Таким образом, он может не ждать в течение неопределенного времени сообщения, поступающего из SQS.

Существует ли функция aws, которую я могу использовать для достижения этой цели без регулярного опроса данных?

Ответы [ 2 ]

1 голос
/ 20 февраля 2020

Не уверен, что это подойдет вам, но есть одна возможность:

  1. Включить TTL в вашей таблице DynamoDB. Это будет работать, если ваш атрибут данных временной метки имеет тип данных Number, содержащий время в формате эпохи. По истечении времени отметки соответствующий элемент удаляется из таблицы в фоновом режиме.
  2. Включить потоки в таблице DynamoDB. Элементы, которые были удалены с помощью TTL, будут отправлены в поток.
  3. Создать триггер , который соединяет поток DynamoDB с функцией Lambda. В вашем случае триггер получит весь ваш удаленный элемент.
  4. Измените свою запись (установите для «START» значение «STOP»), удалите атрибут отметки времени (элементы без атрибута TTL не удаляются) и вставьте заново в стол.

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

0 голосов
/ 21 февраля 2020

Вы можете попробовать создать GSI, используя статус в качестве первичного ключа и метку времени в качестве ключа сортировки. При запросе элементов с истекшим сроком действия используйте выражение условия, например status = "START" and timestamp < 1-day-ago.

. Будьте осторожны, потому что это в основном создает 2 горячих раздела (START и STOP), поэтому убедитесь, что выражение проекции содержит только те данные, которые вам нужны. и не более.

Если у вас есть поле, которое установлено в состоянии status = START, но не существует в противном случае, вы сможете воспользоваться разреженным индексом (в основном DynamoDB не будет индексировать какие-либо элементы в GSI, если ключи GSI не существуют для элемента, поэтому вам не нужно фильтровать их по запросу)

...