如何正确设置议程工作并发

时间:2017-09-21 17:32:16

标签: node.js agenda

这是一个示例工作:

const Agenda = require('agenda')
const agenda = new Agenda({db: {address: process.env.MONGO_URL}})

agenda.define('example-job', (job) => {
  console.log('took a job -', job.attrs._id)
})

现在,让我们说我排队了11个这样的议程工作:

const times = require('lodash/times')
times(11, () => agenda.now('example-job'))

现在,如果我查看数据库,我可以看到有11个工作排队并准备就绪(就像我期望的那样)。

所以现在我开始一个工作流程:

agenda.on('ready', () => {
  require('./jobs/example_job')
  agenda.start()
}) 

当该过程开始时,我看到5个作业被从队列中拉出,这是有道理的,因为defaultConcurrency是5 https://github.com/agenda/agenda#defaultconcurrencynumber

到目前为止一切顺利,但如果我启动另一个工作进程(与上面的工作相同),我希望从队列中删除5个以上的作业,这样总共会有10个工作(每个进程5个),并且一个人留在队列中。

然而,当第二个工人开始工作时,它不会再裁减任何工作,只是空闲。

我希望defaultConcurrency是在任何特定时刻每个进程可以运行的作业数量,但看起来它是一个适用于作业数量的设置任何时刻,贯穿所有议程进程

我在这里缺少什么或者指定每个流程可以运行多少个作业的正确方法,而不限制可以在所有流程中运行的作业数量。

1 个答案:

答案 0 :(得分:0)

问题是需要设置defaultLockLimit

默认情况下,锁定限制为0,这意味着没有限制,这意味着一个工作人员将锁定所有可用的作业,不允许其他工作人员声明它们。

通过将defaultLockLimit设置为与defaultConcurrency相同的值,可确保工作人员仅锁定正在处理的作业。

请参阅:https://github.com/agenda/agenda/issues/412#issuecomment-374430070