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

Jay*_*esh 5 amqp rabbitmq

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

  1. 第一个请求会触发文件的生成.
  2. 客户端每5秒轮询一次服务器以检查文件是否可以下载
  3. 当对轮询请求的响应为肯定时,客户端开始下载该文件

为了实现这一点,我正在寻找像RabbitMQ这样的Message Queue解决方案.它们似乎提供了一个可靠的框架来异步运行长时间运行的任务.但是在阅读了关于RabbitMQ 的教程后,我不确定如何收到操作结果.

这就是我的想法:

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

/generate
/poll
/download
Run Code Online (Sandbox Code Playgroud)

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

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

任务完成后,客户端将调用/downloadrequest_uid=AAA希望下载该文件.

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

Bri*_*lly 1

你的最后一句话击中了要害:

(消费者将其结果放入文件 /var/completed/AAA 中)

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

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