我有一个“锦标赛”sql 表,其中包含锦标赛的开始时间和结束时间。我还有另一个包含playerId 和tournamentIds 的表,这样我就可以知道哪些玩家参加了哪个锦标赛。 我想做的是运行一个 cron 任务来检查我的锦标赛表并查看锦标赛是否已经结束,以便它可以通过外部 api 检查玩家结果。问题是外部 API 有速率限制,我必须每 1.5 秒发送一次请求。
我试图做的是每 10 秒编写一个 cron 作业来检查我的锦标赛表(除了继续检查数据库之外,我想不出任何其他解决方案):
cron.job("*/10 * * * * *", function(){
result = Query tournament table Where EndTime=<Now && EndTime+10second>=Now
if(result is not empty)
{
cron.job("*/1.5 * * * * *",function(){
send API requests for that userId
parse & store result in db
});
}
});
我对此感觉不太对劲,而且对我来说似乎很麻烦。因为内部 cron 作业可能需要超过 10 秒的时间。有没有什么好的解决方案来做到这一点。我正在使用 ExpressJS 和 MySQL。
最佳答案
您面临的问题可以通过事件发射器来解决。 npm 中有一个非常有用的模块 node-schedule ,它可以在您所说的这种情况下为您提供帮助。您要做的就是安排一个作业在项目截止日期前触发,该作业将访问第 3 方 api 并检查结果。您可以像这样安排一个作业
var schedule = require('node-schedule');
schedule.scheduleJob("jobName", "TimeToFire", function () {
//Put your api hit here.
//finally remove the schedule
if ("jobName" in schedule.scheduledJobs) {
schedule.scheduledJobs["jobName"].cancel();
delete schedule.scheduledJobs["jobName"];
}
})
确保将所有计划的作业存储在数据库中,因为服务器崩溃将使您已计划的所有计划失效,并且必须再次重新计划它们。
关于mysql - Nodejs 中的嵌套 Cron 作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30629291/