2011-05-03 177 views
4

我有一个客户端发送http请求来下载文件的场景。该文件需要动态生成,通常需要5-15秒。因此我正在研究一个解决方案,将这个操作分成3个http请求。用RabbitMQ获取长时间运行任务的结果

  1. 第一个请求触发生成该文件。
  2. 客户端轮询服务器每5秒检查文件是否已准备好下载
  3. 当到轮询请求的响应是积极的,在客户端开始下载文件

要实现这一点,我很期待到像RabbitMQ这样的Message Queue解决方案中。他们似乎提供了一个可靠的框架来异步运行长时间运行的任务。然而,在阅读RabbitMQ上的tutorials后,我不确定我将如何收到操作结果。

这是我心中一直:

前端服务器接收来自客户端的请求,并根据需要将其张贴消息的RabbitMQ。该前端服务器将具有3个端点

/generate 
/poll 
/download 

当客户机调用/generateGET参数说request_uid=AAA,前端服务器将发布消息的RabbitMQ与有效载荷中的request_uid。任何免费的工作人员随后都会收到此消息并开始生成对应于AAA的文件。

客户端将继续轮询/pollrequest_uid=AAA检查任务是否完成。

当任务完成时,客户端将调用/downloadrequest_uid=AAA希望下载文件。

问题是前端服务器的/poll/download处理程序将如何知道文件生成作业的状态? RabbitMQ如何将任务结果传回生产者。还是我必须在RabbitMQ之外实现这样的机制? (消费者把它生成的文件/var/completed/AAA

回答

1

你击中了要害你的最后一行:

(消费者把其导致 文件/ var /完成/ AAA)

您的服务器必须协调多个作业及其工作结果。因此,您需要某种形式的“主存储库”,其中包含已经完成的权限记录。将完成的文件复制到一个特殊的目录是一种合理而简单的方法。

它不一定需要RabbitMQ或任何消息解决方案。您的服务器可以按照任何希望的方式为这些工作人员提供工作:通过产生进程,使用线程池,或者实际上产生AMQP事件,这些事件最终发生在代理中,并被“工作”队列消费者吸引。这取决于你的应用程序,最适合它的是什么。

3

开始使用AMQP最简单的方法是使用主题交换,并创建携带控制消息的队列。例如,您可以使用file.ready队列,并在文件路径名已准备好提取时发送消息; file.error队列可以在出于某种原因无法创建文件时进行报告。然后客户端可以使用file.generate队列将GET信息发送到服务器。