用RabbitMQ获取长时间运行任务的结果
我有一个客户端发送http请求来下载文件的场景。该文件需要动态生成,通常需要5-15秒。因此我正在研究一个解决方案,将这个操作分成3个http请求。用RabbitMQ获取长时间运行任务的结果
- 第一个请求触发生成该文件。
- 客户端轮询服务器每5秒检查文件是否已准备好下载
- 当到轮询请求的响应是积极的,在客户端开始下载文件
要实现这一点,我很期待到像RabbitMQ这样的Message Queue解决方案中。他们似乎提供了一个可靠的框架来异步运行长时间运行的任务。然而,在阅读RabbitMQ上的tutorials后,我不确定我将如何收到操作结果。
这是我心中一直:
前端服务器接收来自客户端的请求,并根据需要将其张贴消息的RabbitMQ。该前端服务器将具有3个端点
/generate
/poll
/download
当客户机调用/generate
与GET
参数说request_uid=AAA
,前端服务器将发布消息的RabbitMQ与有效载荷中的request_uid。任何免费的工作人员随后都会收到此消息并开始生成对应于AAA
的文件。
客户端将继续轮询/poll
与request_uid=AAA
检查任务是否完成。
当任务完成时,客户端将调用/download
,request_uid=AAA
希望下载文件。
问题是前端服务器的/poll
和/download
处理程序将如何知道文件生成作业的状态? RabbitMQ如何将任务结果传回生产者。还是我必须在RabbitMQ之外实现这样的机制? (消费者把它生成的文件/var/completed/AAA
)
你击中了要害你的最后一行:
(消费者把其导致 文件/ var /完成/ AAA)
您的服务器必须协调多个作业及其工作结果。因此,您需要某种形式的“主存储库”,其中包含已经完成的权限记录。将完成的文件复制到一个特殊的目录是一种合理而简单的方法。
它不一定需要RabbitMQ或任何消息解决方案。您的服务器可以按照任何希望的方式为这些工作人员提供工作:通过产生进程,使用线程池,或者实际上产生AMQP事件,这些事件最终发生在代理中,并被“工作”队列消费者吸引。这取决于你的应用程序,最适合它的是什么。
开始使用AMQP最简单的方法是使用主题交换,并创建携带控制消息的队列。例如,您可以使用file.ready队列,并在文件路径名已准备好提取时发送消息; file.error队列可以在出于某种原因无法创建文件时进行报告。然后客户端可以使用file.generate队列将GET信息发送到服务器。