可扩展的动态作业队列处理

时间:2011-11-02 20:48:07

标签: architecture cron scalability scheduled-tasks amqp

我目前正在开展一个需要处理大量重复工作的项目。基本上,当一份工作完成后,我想在15分钟后重新开始工作。

这组作业会随着时间的推移而动态变化,因此我需要监视新的和已删除的作业。 每项工作都需要一些时间来处理,因此我需要能够扩展。我将有一个网站作为管理这些工作的前端。

我正在考虑使用MongoDB(带分片)来存储作业。 然后,我可以创建一个“作业代理”来经常查询数据库以查看是否有任何作业已准备好并使用例如RabbitMQ开始研究一组工人。

但是这个设置有一些非常明显的问题:

  • “职业经纪人”是一个瓶颈和单点失败
  • 在一个潜在的巨大集合上频繁查询MongoDB似乎是一个糟糕的解决方案。

我不受技术的限制,但我根本不知道应该如何为此设计架构。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

您可能考虑的一个选项是beanstalkd。它是一个支持优先级和延迟执行的工作队列。后一个功能可能非常适合您的需求。它允许您将作业提交到队列,该作业将无法供工作人员使用指定的秒数。您可以使用它重新提交要在15分钟后消耗的作业。

几乎所有语言都有客户端库。请参阅list。该协议简单易用。

我们在工作中使用它,并且偶尔用数以千计的工作填充队列而没有问题。事实上,我不记得在超过2年的使用中遇到过稳定性问题。

答案 1 :(得分:0)

使用AMQP。对于每种类型的工作者,都有一个队列,通过消息将作业提供给该工作者。但是添加另一个工人类型,即延迟器。

每个工作人员都会收到一条消息,完成工作,发送消息并向延迟发送消息。

延迟器有点不同,因为它得到一条消息,延迟15分钟,然后将消息发送回源工作者然后确认消息。因为延迟本质上是阻塞的,所以你应该有很多延迟进程,这样消息不会在队列上延迟,但只有当它们在延迟器的手中时才会延迟。