我目前正在开展一个需要处理大量重复工作的项目。基本上,当一份工作完成后,我想在15分钟后重新开始工作。
这组作业会随着时间的推移而动态变化,因此我需要监视新的和已删除的作业。 每项工作都需要一些时间来处理,因此我需要能够扩展。我将有一个网站作为管理这些工作的前端。
我正在考虑使用MongoDB(带分片)来存储作业。 然后,我可以创建一个“作业代理”来经常查询数据库以查看是否有任何作业已准备好并使用例如RabbitMQ开始研究一组工人。
但是这个设置有一些非常明显的问题:
我不受技术的限制,但我根本不知道应该如何为此设计架构。有什么想法吗?
答案 0 :(得分:1)
您可能考虑的一个选项是beanstalkd。它是一个支持优先级和延迟执行的工作队列。后一个功能可能非常适合您的需求。它允许您将作业提交到队列,该作业将无法供工作人员使用指定的秒数。您可以使用它重新提交要在15分钟后消耗的作业。
几乎所有语言都有客户端库。请参阅list。该协议简单易用。
我们在工作中使用它,并且偶尔用数以千计的工作填充队列而没有问题。事实上,我不记得在超过2年的使用中遇到过稳定性问题。
答案 1 :(得分:0)
使用AMQP。对于每种类型的工作者,都有一个队列,通过消息将作业提供给该工作者。但是添加另一个工人类型,即延迟器。
每个工作人员都会收到一条消息,完成工作,发送消息并向延迟发送消息。
延迟器有点不同,因为它得到一条消息,延迟15分钟,然后将消息发送回源工作者然后确认消息。因为延迟本质上是阻塞的,所以你应该有很多延迟进程,这样消息不会在队列上延迟,但只有当它们在延迟器的手中时才会延迟。