【问题标题】:How to set agenda job concurrency properly如何正确设置议程作业并发
【发布时间】:2018-03-03 03:52:18
【问题描述】:

这是一个示例作业:

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 是在任何给定时刻每个进程可以运行的作业数,但它看起来像是一个适用于任何时刻作业数的设置总的来说,所有议程流程

我在这里遗漏了什么或者指定每个进程可以运行多少个作业的正确方法是什么,而不限制可以跨所有进程运行的作业数。

【问题讨论】:

    标签: node.js agenda


    【解决方案1】:

    问题是defaultLockLimit需要设置。

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

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

    见:https://github.com/agenda/agenda/issues/412#issuecomment-374430070

    【讨论】:

      猜你喜欢
      • 2020-08-29
      • 2015-07-05
      • 2019-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-30
      • 2013-01-03
      相关资源
      最近更新 更多