我有一个客户端发送http请求来下载文件的场景。该文件需要动态生成,通常需要5-15秒。因此,我正在寻找一种解决方案,将此操作拆分为3个http请求。
为了实现这一点,我正在寻找像RabbitMQ这样的Message Queue解决方案。它们似乎提供了一个可靠的框架来异步运行长时间运行的任务。但是在阅读RabbitMQ上的tutorials后,我不确定如何收到操作结果。
以下是我的想法:
前端服务器接收来自客户端的请求,并根据需要将消息发布到RabbitMQ。该前端服务器将具有3个端点
/generate
/poll
/download
当客户端使用/generate
参数GET
调用request_uid=AAA
时,前端服务器将使用有效负载中的request_uid向RabbitMQ发送消息。随后,任何免费工作人员都会收到此消息,并开始生成与AAA
对应的文件。
客户端会继续使用/poll
对request_uid=AAA
进行投票,以检查任务是否完整。
当任务完成时,客户将调用/download
,request_uid=AAA
期望下载该文件。
问题是前端服务器的/poll
和/download
处理程序将如何了解文件生成作业的状态? RabbitMQ如何将任务结果传达给生产者。或者我必须在RabbitMQ之外实现这样的机制? (消费者将其结果放在文件/var/completed/AAA
)
答案 0 :(得分:3)
开始使用AMQP的最简单方法是使用主题交换,并创建携带控制消息的队列。例如,您可以拥有一个file.ready队列,并在准备好拾取时发送带有文件路径名的消息,并在出于某种原因无法创建文件时报告file.error队列。然后客户端可以使用file.generate队列将GET信息发送到服务器。
答案 1 :(得分:1)
你用最后一行击中了头上的钉子:
(消费者把结果放在一个 file / var / completed / AAA)
您的服务器必须协调多个作业及其工作结果。因此,您需要某种形式的“主存储库”,其中包含已经完成的内容的权威记录。将完成的文件复制到特殊目录中是一种合理而简单的方法。
它也不一定需要RabbitMQ或任何消息传递解决方案。您的服务器可以按照自己的意愿将工作分配给这些工作者:通过生成进程,使用线程池,或者实际生成最终在代理中的AMQP事件,并被“工作”队列消费者吸引。这取决于您的应用程序以及最适合它的应用程序。