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

Architecture 可扩展的动态作业队列处理,architecture,cron,scalability,scheduled-tasks,amqp,Architecture,Cron,Scalability,Scheduled Tasks,Amqp,我目前正在做一个项目,我需要处理大量的重复性工作。基本上,当一项工作完成后,我想在15分钟后重新开始 作业集随时间动态变化,因此我需要监视新作业和删除的作业。 每项工作都需要一些时间来处理,因此我需要能够扩展。我将有一个网站作为前端来管理这些工作 我正在考虑使用MongoDB(带切分)来存储作业。 然后,我可以创建一个“作业代理”来频繁查询数据库,查看是否有任何作业已准备就绪,并使用RabbitMQ等工具在一组工作人员上开始工作 不过,该设置存在一些非常明显的问题: “作业代理”是一个瓶颈和单

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

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

我正在考虑使用MongoDB(带切分)来存储作业。 然后,我可以创建一个“作业代理”来频繁查询数据库,查看是否有任何作业已准备就绪,并使用RabbitMQ等工具在一组工作人员上开始工作

不过,该设置存在一些非常明显的问题:

  • “作业代理”是一个瓶颈和单点故障
  • 在一个潜在的巨大集合上频繁地查询MongoDB似乎是一个糟糕的解决方案

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

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

每个工作人员将收到一条消息,完成工作,确认其消息,并向延迟者发送一条消息


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

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

每个工作人员将收到一条消息,完成工作,确认其消息,并向延迟者发送一条消息


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

< P> >您可以考虑的一个选项是。它是一个支持优先级和延迟执行的工作队列。后一个特性可能非常适合您的需要。它允许您向队列提交作业,该作业在指定的秒数内无法供工作人员使用。您可以使用此选项重新提交作业,以便在15分钟后使用

几乎每种语言都有客户端库。看。该协议简单易用


我们在工作中使用它,有时会在队列中填满成百上千个没有问题的工作。事实上,我不记得在超过2年的使用中有过稳定性问题 几乎每种语言都有客户端库。看。该协议简单易用


我们在工作中使用它,有时会在队列中填满成百上千个没有问题的工作。事实上,我不记得在超过2年的使用中有过稳定性问题

谢谢你,迈克尔。我使用AMQP、分布式锁定和包含作业的共享数据库实现了一个原型。每个工作者同时充当排队者和处理器。当工作程序获得分布式锁时,它将在数据库中找到准备好处理的作业,在作业上设置处理标志,并通过AMQP发送消息。当工作程序完成作业处理后,它会使用新的时间戳修改数据库。因此,我没有单一的失败点。谢谢迈克尔。我使用AMQP、分布式锁定和包含作业的共享数据库实现了一个原型。每个工作者同时充当排队者和处理器。当工作程序获得分布式锁时,它将在数据库中找到准备好处理的作业,在作业上设置处理标志,并通过AMQP发送消息。当工作程序完成作业处理后,它会使用新的时间戳修改数据库。因此,我没有单一的失败点。