2011-04-30 31 views
8

我目前正在设计一个Web应用程序,它将允许用户安排将针对HTTP API(代表他们)执行的任务。这些任务可以重复发生,可用于调度的最小时间分辨率将为一分钟。由于任务的性质,我认为非同步地执行它们是有意义的。但是,这部分的结构应该如何?Web应用程序体系结构 - 作业/任务队列需要吗?

我曾考虑过使用任务队列来创建Web应用程序的任务,并让它们由工作人员执行。在这种情况下,我有几个问题:

  • 如何处理重复执行的任务?
  • 如何轻松保存任务的结果?
  • 是否容易使队列“持久”?
  • 工作人员应该直接与数据库交互吗?
  • 我应该手动排列循环任务吗?

我还能考虑什么?因为我认为我不是唯一一个想到这种Web应用程序架构的人,有没有什么“最佳实践”?任务队列要走吗?

+0

这是[相关](http://stackoverflow.com/questions/5636051/cronjobs-in-node-js/5636298#5636298)。它展示了如何在'node.js'中实现未来的任务。只需通过发送HTTP请求来更改作业的运行。 – Raynos 2011-05-06 12:38:20

回答

9

是的这是一个众所周知的模式,用于处理Web应用程序后端的长期任务。根据您的语言和应用程序框架,有许多队列实现 - 例如ResqueBeanstalkdActiveMQ或者如果您的性能要求不高,可以使用数据库表作为一种队列。

基本思想是您的Web应用程序将作业放置在具有足够内容的队列中,以启用作业继续。后台的一组工作进程(最好独立于Web应用程序运行)从队列中读取作业并执行它们。结果可以写回到回复队列中,或写入数据库。这取决于你想如何显示结果回给用户。对于Web应用程序,将结果写入数据库可能更有意义。

根据您的队列处理程序,他们可以使作业持久。例如。 ActiveMQ支持持久消息传递,以便在发生故障时恢复队列中的消息。

你问关于经常性工作 - 我想答案取决于他们何时需要复发。

直接消息队列将在工作人员可用时立即处理/释放消息。所以调度是棘手的或不可能的。为了支持预定作业(包括在给定时间或经过一段时间后重复出现的作业),您应该将数据库表用作具有“开始时间”属性的简单队列。

我最近描述了一个类似的模式here

+0

非常感谢。 – Simon 2011-05-10 07:36:08

+0

假设我使用RabbitMq,是否需要运行服务来管理队列?这项工作通常如何完成?什么是服务的好替代方案? – SynBiotik 2016-02-23 00:33:12