【问题标题】:Scalable dynamic job queue processing可扩展的动态作业队列处理
【发布时间】:2011-11-02 20:48:06
【问题描述】:

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

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

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

但该设置存在一些非常明显的问题:

  • “作业代理”是瓶颈和单点故障
  • 对可能非常庞大的集合频繁查询 MongoDB 似乎是一个糟糕的解决方案。

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

【问题讨论】:

    标签: architecture cron scalability scheduled-tasks amqp


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      每个工作人员都会收到一条消息,完成工作,确认它的消息,然后向延迟器发送一条消息。

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

      【讨论】:

      • 谢谢迈克尔。我有一个使用 AMQP、分布式锁定和包含作业的共享数据库实现的原型。每个工作人员都充当入队者和处理器。当工作人员获得分布式锁时,它将在数据库中找到准备处理的作业,在作业上设置处理标志,并通过 AMQP 发送消息。当工作人员完成作业处理后,它会使用新的时间戳修改数据库。因此我没有单点故障。
      猜你喜欢
      • 1970-01-01
      • 2019-01-02
      • 1970-01-01
      • 2018-06-18
      • 2018-02-23
      • 1970-01-01
      • 2015-05-05
      • 1970-01-01
      • 2017-02-01
      相关资源
      最近更新 更多