我的用例是创建动态延迟作业。(我正在使用可用于创建延迟作业的Bulls Queue 。)
根据某些事件,向延迟间隔添加更多延迟(进一步延迟作业)。
由于我找不到任何function
更新作业的延迟间隔,我想出了以下步骤:
onEvent(jobId):
// queue is of Type Bull.Queue
// job is of type bull.Job
job = queue.getJob(jobId)
data = job.data
delay = job.toJSON().delay
job.remove()
queue.add("jobName", {value: 1}, {jobId: jobId, delayed: delay + someValue})
这几乎解决了我的问题。
但我担心这些操作会发生的规模。
我预计在不久的将来每分钟会有近50K事件甚至更多。
我的队列大小预计会根据唯一的JobId增长。
我期待的不仅仅是:
- 每日100万次入场
- 每周约 4-5 百万次入场
- 10-12 百万每月进入。
此外,在60-70 天后,作业的延迟间隔将达到,并且较旧的作业将被一一删除。
我可以运行多个处理器来处理这些延迟的工作,这不是问题。
我的队列大小将在 60-70 天后稳定下来,我的队列或多或少会有大约 1000 万个工作岗位。
我可以根据需要垂直缩放我的REDIS。
但我想了解以下查询的时间复杂度:
queue.getJob(jobId) // Get Job By Id
job.remove() // remove job from queue
queue.add(name, data, opts) // add a delayed job to this queue
如果这些操作中的任何一个是 O(N) 或者QUEUE可以保留一些小于 1000 万的最大作业数。
然后我可能不得不放弃这个设计并想出一些完全不同的东西。
需要有经验的人的建议,他们可以指导我如何解决这个问题。
任何形式的帮助表示赞赏。