Сканировать атрибут DynamoDB, который является строкой cron, и фильтровать на основе текущего времени

#node.js #cron #amazon-dynamodb #dynamodb-queries

#node.js #cron #amazon-dynamodb #dynamodb-запросы

Вопрос:

У меня есть таблица DynamoDB со следующими элементами

 {
   "jobId":<job1>,
   "cron" : "* 5 * * *"
},
{
   "jobId":<job2>,
   "cron" : "* 8 * * *"
}
 

Мне нужно сканировать элементы, у которых следующее время выполнения на основе строки cron в течение следующих 5 минут, исходя из текущего времени.
Есть ли способ преобразовать cron в допустимое время следующего выполнения во время сканирования?
Я использую node.js в AWS Lambda и cron-parser библиотеке npm для извлечения времени next_execution из строки cron.

Ответ №1:

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

Это говорит о том, что что-то подобное может сработать:

 const results = await client.scan({ TableName: 'tableName' }).promise();
const cronItems = results.Items;

const intervals = cronItems.map((item) => {
    return cronParser.parseExpression(item.cron);
});

const now = new Date();
const fiveMinMillis = 300 * 1000;

const within5Mins = intervals.filter((interval) => {
    const timeUntil = interval.next().valueOf() - now.valueOf();
    return timeUntil < fiveMinMillis;
});
 

Обратите внимание, что вам действительно нужно будет вызывать scan(...) итеративно, пока ответ не будет содержать LastEvaluatedKey атрибут. Подробности смотрите здесь.