Bulls 队列性能和可扩展性:Queue.add()、Queue.getJob(jobId)、Job.remove()
Bulls Queue Performance and Scalability: Queue.add(), Queue.getJob(jobId), Job.remove()
我的用例是创建动态延迟 作业。 (我正在使用 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})
这几乎解决了我的问题。
但我担心这些操作会发生的 SCALE。
我预计在不久的将来每分钟将近 50K 个事件,甚至更多。
我的 Queue 大小预计会根据唯一 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 可以保留一些最大数量的 Jobs不到1000万.
然后我可能不得不放弃这个设计并想出一些完全不同的东西。
需要有经验的人的建议,他们可以指导我如何解决这个问题。
感谢任何形式的帮助。
我的用例是创建动态延迟 作业。 (我正在使用 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})
这几乎解决了我的问题。
但我担心这些操作会发生的 SCALE。
我预计在不久的将来每分钟将近 50K 个事件,甚至更多。
我的 Queue 大小预计会根据唯一 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 可以保留一些最大数量的 Jobs不到1000万.
然后我可能不得不放弃这个设计并想出一些完全不同的东西。
需要有经验的人的建议,他们可以指导我如何解决这个问题。
感谢任何形式的帮助。