假设我在3个不同的服务器上运行此代码,并且每个服务器都使用单个数据库。
setInterval(function(){
if(userArray) {
var report = mongoose.connection.db.collection('report');
report.insert({datenow:new Date(),userlist:userArray},function(err,doc) {
if(err) throw err;
});
}
},600000);
因此,这段代码在每台服务器上每隔 10分钟运行,但我只希望其中一条将数据插入数据库。由于数据相同,因此插入 3次。
如何检查数据是否已由任何一台服务器插入数据库。
我尝试制作一个递增的count
变量并将其插入数据库并将其用作唯一的 ID 来检查它是否存在于数据库中。如果它存在,那么我不会插入数据。但是,如果由于某种原因我必须重新启动服务器,那么count
将被重置为其初始值,这似乎不是一个可行的解决方案。
那么,我该如何解决这个问题呢?我猜我必须以某种方式比较时间?
答案 0 :(得分:1)
IMO,当您在数据库中执行插入时,应使用 Cron表达式而不是间隔,将执行时间用作报告的主键。
<强>解释强>
Cron表达式可以保证脚本的执行将在准确的时间发生。如果您使用此Cron表达式:00 */10 * * * *
(每10分钟一次),您的脚本将完全按11:00:00
,11:10:00
,11:20:00
执行,依此类推...对于每个服务器您有
因此,您可以将此执行时间用作报告的关键字,这样可以防止多次插入同一报告。
<强>利布斯强>
您可以使用此lib将Cron与Node.js一起使用:node-cron
示例强>
var CronJob = require('cron').CronJob;
new CronJob('* * * * * *', function() {
console.log('You will see this message every second');
}, null, true, 'America/Los_Angeles');
我希望这会对你有所帮助。
答案 1 :(得分:0)
所以我不得不最后比较时间戳并检查它在过去10分钟内插入的内容。这是我提出的解决方案。
setInterval(function(){
var currDate = new Date().getTime();
if(keyPairNameArray) {
var overallreport = mongoose.connection.db.collection('overallreport');
overallreport.find({}).sort({_id:-1}).limit(1).toArray(function(err, res){
if(res.length > 0){
var dbDate = new Date(res[0].datenow).getTime();
var diffDate = currDate - dbDate;
if(diffDate < 600000){
} else {
overallreport.insert({datenow:new Date(),userlist:keyPairNameArray},function(err,doc) {
if(err) throw err;
});
}
} else {
overallreport.insert({datenow:new Date(),userlist:keyPairNameArray},function(err,doc) {
if(err) throw err;
});
}
});
}
},610000);