0.0.1 • Published 4 years ago

q-manager v0.0.1

Weekly downloads
2
License
MIT
Repository
github
Last release
4 years ago

任务队列管理器

基于bull,简化概念,方便上手使用任务队列,对一些常用功能做了一些封装,个性化的设置也支持(当然过于个性化的就自己写好了)。

概念

bull是基于redis的,原样使用ioredis初始化,相关设置以ioredis为准。

同一个redis里可以通过bull创建多个队列(queue),但是需要命名以免冲突。同时分布式应用或者其他的应用也可以通过同样的命名来确定同一个队列,当一个实例拿到队列里具体的某一个任务时,会在redis里加锁,其他实例就拿不到了,不会出现重复执行的情况。

每个bull实例可以手动指定前缀,同一个redis同时被多个应用使用时可以通过前缀区分,互不干扰。

一个任务队列必然有任务,任务对应的处理函数(processor)以及对应的指定数据(source)。处理函数作为固定参数传入队列实例;指定数据可以是手动添加,也可以是自动读表添加;手动添加的API可以用bull自带的,自动添加的话,这里封装了两个最常见的场景:1、以crontab形式的定时任务添加;2、以队列为空、即当前队列已经执行完了为条件添加。

样例

根据上面的几个概念,可以很轻易地写出一个简单的任务队列。例如,在某个订单处理系统中,我想创建某个订单支付队列,希望每小时自动添加任务:

/* 初始化qm实例 */
const QM = require('queue-manager')
const qm = new QM({
  queueOpts: {
    prefix: 'order',
    redis: {
      port: 6379,
      host: '127.0.0.1',
      db: 4
    }
  }
})

/* 创建一个新队列,已创建的队列可以通过遍历qm.queues得到,重名的队列是不被允许的 */
const payQueue = qm.createQueue({
  /* 当前队列名称 */
  queueName: 'payQueue',
  /* 处理函数 */
  processor: async (job) => {
    const { data } = job
    const payRes = await doPay(data)
    if (!payRes) await doSomethingElse(data)
  },
  /* 自动添加的时机,目前支持最常用的两种 */
  // autoAdd: 'ondrained', // 队列为空时添加
  autoAdd: '0 0 * * * *', // 定时添加
  /* 自动添加所指定的数据源,可以是Array,也可以是一个能返回Array的函数 */
  source: async () => {
    const dataList = await queryMysqlOrSthElse()
    return dataList
  }
})
/* 又或者以下面的格式手动添加任务数据 */
// payQueue.add({
//   data: {
//     k: 3,
//     v: '3'
//   }
// })
// qm.add({
//   queueName: 'payQueue',
//   data: {
//     k: 4,
//     v: '4'
//   }
// })

使用

todo

0.0.1

4 years ago