【问题标题】:Web Application Architecture - Job/Task Queue needed?Web 应用程序架构 - 需要作业/任务队列?
【发布时间】:2011-04-30 09:13:11
【问题描述】:

我目前正在设计一个 Web 应用程序,它允许用户安排将针对 HTTP API(代表他们)执行的任务。这些任务可以重复出现,并且可用于调度的最小时间分辨率将是一分钟。由于任务的性质,我认为异步执行它们是有意义的。但是,这部分的架构应该是怎样的呢?

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

  • 如何处理重复性任务?
  • 如何轻松保存任务结果?
  • 是否可以轻松地使队列“持久化”?
  • 工作人员是否应直接与数据库交互?
  • 我应该手动将重复任务排队吗?

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

【问题讨论】:

  • 这是relevant。它展示了如何在node.js 中实现未来的任务。只需通过发送 HTTP 请求来更改作业的运行。

标签: web-applications architecture asynchronous task-queue


【解决方案1】:

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

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

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

您询问重复工作 - 我认为答案取决于他们何时需要重复工作。

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

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

【讨论】:

  • 假设我正在使用 RabbitMq,我是否需要运行服务来管理队列?这项工作通常是如何完成的?什么是服务的好替代品?
猜你喜欢
  • 2011-04-04
  • 1970-01-01
  • 1970-01-01
  • 2014-04-09
  • 2013-12-16
  • 2011-05-05
  • 2011-08-06
  • 2017-11-22
  • 2015-08-27
相关资源
最近更新 更多