首页 > 解决方案 > 扫描作为 cron 字符串的 DynamoDB 属性并根据当前时间进行过滤

问题描述

我有一个包含以下项目的 DynamoDB 表

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

我需要根据当前时间扫描基于 cron 字符串的下一个执行时间在下一个 5 分钟内的项目。有没有办法可以在扫描时将 cron 转换为有效的下一次执行时间?我在 AWS Lambda 和cron-parsernpm 库中使用 node.js 从 cron 字符串中提取 next_execution 时间。

标签: node.jscronamazon-dynamodbdynamodb-queries

解决方案


请注意,扫描整个表会随着时间的推移而减慢。您可能需要考虑一些其他数据存储或结构来存储此数据。

这就是说这样的事情可以工作:

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属性。 详情请看这里


推荐阅读