使用RabbitMQ获得长时间运行任务的结果

时间:2011-05-03 13:52:04

标签: rabbitmq amqp

我有一个客户端发送http请求来下载文件的场景。该文件需要动态生成,通常需要5-15秒。因此,我正在寻找一种解决方案,将此操作拆分为3个http请求。

  1. 第一个请求会触发文件的生成。
  2. 客户端每隔5秒轮询服务器以检查文件是否可以下载
  3. 当对轮询请求的响应为肯定时,客户端开始下载文件
  4. 为了实现这一点,我正在寻找像RabbitMQ这样的Message Queue解决方案。它们似乎提供了一个可靠的框架来异步运行长时间运行的任务。但是在阅读RabbitMQ上的tutorials后,我不确定如何收到操作结果。

    以下是我的想法:

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

    /generate
    /poll
    /download
    

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

    客户端会继续使用/pollrequest_uid=AAA进行投票,以检查任务是否完整。

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

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

你用最后一行击中了头上的钉子:

  

(消费者把结果放在一个   file / var / completed / AAA)

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

它也不一定需要RabbitMQ或任何消息传递解决方案。您的服务器可以按照自己的意愿将工作分配给这些工作者:通过生成进程,使用线程池,或者实际生成最终在代理中的AMQP事件,并被“工作”队列消费者吸引。这取决于您的应用程序以及最适合它的应用程序。