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



这是一个示例作业:

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'))

现在,如果我看DB,我可以看到有11个作业排队并准备好了(就像我期望的那样)。

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

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

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

到目前为止,一切都很好,但是如果我启动另一个工作过程(与上面的过程相同),我希望将5个工作列入队列,以便总共有10个运行(每个过程5个),并且一个在队列上。

但是,当第二名工人启动时,它不会撤消任何工作,它只是闲置。

我希望 defaultConcurrency是可以在任何给定时刻每个过程>的作业数量,但是看起来它是一个适用于汇总时刻的作业数量的设置,在所有议程过程中

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

问题是需要设置defaultLockLimit

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

通过将defaultLockLimit设置为与defaultConcurrency相同的值,这可以确保工人只能锁定正在积极处理的作业。

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

最新更新