2011-11-02 54 views
1

我目前正在处理一个需要处理大量重复作业的项目。基本上,当一项工作完成后,我想在15分钟后再次开始工作。可扩展的动态作业队列处理

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

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

有与设置虽然一些非常明显的问题:

  • “作业代理”是一个非常频繁的基础上的瓶颈和单点故障
  • 查询的MongoDB潜在的巨大收集似乎是一个不好的解

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

回答

0

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

每位工作人员都会收到一条消息,完成工作,确认其消息并向延迟器发送消息。

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

+0

谢谢迈克尔。我有一个使用AMQP实现的原型,分布式锁定和包含作业的共享数据库。 每个工人都充当入场者和处理者。当工作人员获得分布式锁时,它会在数据库中找到准备处理的作业,在作业上设置处理标志,并通过AMQP发送消息。当工作人员完成一项工作的处理时,它会用新的时间戳修改数据库。 因此,我没有单点失败。 – kfuglsang

1

您可能会考虑的一个选项是beanstalkd。它是一个支持优先级和延迟执行的工作队列。后者功能可能对您所需要的功能非常有用。它允许您将作业提交到队列中,该队列将不会被工作人员用于指定的秒数。您可以使用此功能重新提交将在15分钟后使用的作业。

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

我们在工作中使用它,并在几百个工作中填充排队,没有问题。事实上,我不记得在使用超过2年的时间里有过稳定性问题。