我目前正在设计一个Web应用程序,允许用户安排将针对HTTP API(代表他们)执行的任务。任务可以重复进行,可用于安排的最小时间分辨率将是一分钟。由于任务的性质,我认为以异步方式执行它们是有意义的。但是,这部分的架构应该如何?
我考虑过使用任务队列来创建Web应用程序的任务,让它们由工作人员执行。在这种情况下,我有几个问题:
我还能考虑什么?既然我认为我不是唯一考虑过这种Web应用程序架构的人,那么有没有“最佳实践”?任务队列是可行的吗?
答案 0 :(得分:9)
是的,这是一个众所周知的模式,用于处理Web应用程序后端的长期任务。根据您的语言和应用程序框架,有许多队列实现 - 例如Resque或Beanstalkd或ActiveMQ或者如果您的性能要求不高,您可以将数据库表用作一种队列。
基本思想是您的Web应用程序将作业放在具有足够内容的队列中,以使作业能够继续。后台中的一组工作进程(理想情况下独立于Web应用程序运行)从队列中读取作业并执行它们。结果可以写回到回复队列中,也可以写入数据库中。这取决于您希望如何将结果显示给用户。对于Web应用程序,将结果写入数据库可能会更有意义。
根据您的队列处理程序,它们可以使作业持久化。例如。 ActiveMQ支持持久消息传递,以便在发生故障时恢复队列中的消息。
您询问重复性工作 - 我认为答案取决于他们何时需要重复工作。
直接消息队列将在工作人员可用时立即处理/释放消息。因此调度很棘手或不可能。为了支持预定作业(包括在给定时间或经过一段时间后重复出现的作业),您可能应该将数据库表用作具有“开始时间”属性的简单队列。
我最近描述了类似的模式here。