- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
如果系统中已有相同的作业,我希望 jobs.create
失败。有什么办法可以做到这一点?
我需要每 24 小时运行一次相同的作业,但有些作业可能需要超过 24 小时,因此在添加之前我需要确保该作业不在系统中(事件、排队或失败)
更新:好的,我将简化问题以便能够在这里进行解释。至少我有一个分析服务,我必须每天向我的用户发送一次报告。完成这些报告有时(只是少数情况,但有可能)需要几个小时甚至超过一天。
我需要一种方法来了解哪些是当前正在运行的作业,以避免重复的作业。我无法在 ´´´´kue´´´´ API 中找到任何信息来了解当前正在运行的作业。此外,我需要在需要更多作业时触发某种事件,然后调用我的 getMoreJobs
生产者。
也许我的方法是错误的,如果是这样请告诉我一个更好的方法来解决我的问题。
这是我的简化代码:
var kue = require('kue'),
cluster = require('cluster'),
numCPUs = require('os').cpus().length;
numCPUs = CONFIG.sync.workers || numCPUs;
var jobs = kue.createQueue();
if (cluster.isMaster) {
console.log('Starting master pid:' + process.pid);
jobs.on('job complete', function(id){
kue.Job.get(id, function(err, job){
if (err || !job) return;
job.remove(function(err){
if (err) throw err;
console.log('removed completed job #%d', job.id);
});
});
function getMoreJobs() {
console.log('looking for more jobs...');
getOutdateReports(function (err, reports) {
if (err) return setTimeout(getMoreJobs, 5 * 60 * 60 * 1000);
reports.forEach(function(report) {
jobs.create('reports', {
id: report.id,
title: report.name,
params: report.params
}).attempts(5).save();
});
setTimeout(getMoreJobs, 60 * 60 * 1000);
});
}
//Create the jobs
getMoreJobs();
console.log('Starting ', numCPUs, ' workers');
for (var i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('death', function(worker) {
console.log('worker pid:' + worker.pid + ' died!'.bold.red);
});
} else {
//Process the jobs
console.log('Starting worker pid:' + process.pid);
jobs.process('reports', 20, function(job, done){
//completing my work here
veryHardWorkGeneratingReports(function(err) {
if (err) return done(err);
return done();
});
});
}
最佳答案
您的其中一个问题的答案是,Kue 将它从 redis 队列中弹出的作业置于“事件”状态,除非您寻找它们,否则您永远不会得到它们。
另一个问题的答案是你的分布式工作队列是消费者,而不是任务的生产者。像你一样混合它们是可以的,但是,这是一个困惑的范例。我对 Kue 所做的是为 kue 的 json api 制作一个包装器,以便可以从系统中的任何位置将作业放入队列中。由于您似乎需要将工作铲进去,我建议编写一个单独的生产者应用程序,它除了获取外部工作并将它们放入您的 Kue 工作队列外什么都不做。它可以监控工作队列,了解作业何时运行不足并加载一批,或者,我会做的是让它尽可能快地铲除作业,并假脱机使用消费者应用程序的多个实例来处理负载更快。
重申一下:您的关注点分离在这里不是很好。您应该有一个完全独立于您的任务消费者应用程序的任务生产者。这为您提供了更大的灵 active 、易于扩展(只需在另一台机器上启动另一个消费者,您就可以扩展了!)和整体代码管理的简便性。如果可能的话,您还应该允许任何给您这些任务的人访问您的 Kue 服务器的 JSON api,而不是出去寻找它们。工作生产者可以使用 Kue 安排自己的任务。
关于javascript - kue for node.js 的独特工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9032511/
对于 Prometheus 指标集合,如标题,我真的找不到只能通过 type Summary 完成的用例。 ,似乎它们都可以通过 type Histogram 以某种方式完成还。 让我们以请求并发度量
这个问题在这里已经有了答案: Ignore case while using duplicated (1 个回答) 关闭 9 个月前。 使用不区分大小写的 unique(tolower(x)) 删除
应用程序监控服务的一个有用功能是每次发生新的、独特的错误/问题/异常时发送警报(例如电子邮件)(即不是每次发生)。要么只是第一次,要么最多每次 X 次(一天或一周等)。例如,这可以通过 Visual
应用程序监控服务的一个有用功能是每次发生新的、独特的错误/问题/异常时发送警报(例如电子邮件)(即不是每次发生)。要么只是第一次,要么最多每次 X 次(一天或一周等)。例如,这可以通过 Visual
我想要相当于 DB2 中 MySql 的 GROUP_CONCAT 功能。 我尝试过 DB2 的 XML Aggrigate 函数来合并 murows。 SELECT a.ID, sub
我正在运行 python 数据库迁移脚本 (Flask-Migrate) 并添加了 alembic.ddl.imp import DefaultImpl 来解决第一组错误,但现在我收到以下错误。我正在
我有一个逗号分隔的文件“myfile.csv”,其中第 5 列是日期/时间戳。 (mm/dd/yyyy hh:mm)。 我需要列出所有包含重复日期的行(有很多) 我正在通过 cygwin 为 WinX
我使用的是 MySQL 5.7。 我有一个表格如下: -------------------------------------------------- | id | currentcy_id |
所以我有一个像这样的 ng-repeat: Join Ride /md-switch> 但是,每个 md-switch 都有相同的模型,因此当我在 Control
据我了解, Mongoose 预保存 Hook 在将文档插入集合之前但在验证发生之后触发。因此,如果一次验证失败,则不会调用预保存 Hook 。 就我而言,无论如何都会调用它们: 下面的简单代码的作用
如果我对我的目标文件执行此 grep,我会得到例如 275 作为结果。 但是我想学习 awk,所以在 awk 中尝试了这个: awk 'BEGIN { count=0 } /my pattern/
我是一名优秀的程序员,十分优秀!