我有一个客户端发送http请求下载文件的场景.该文件需要动态生成,通常需要5-15秒.因此,我正在寻找一种解决方案,将此操作拆分为3个http请求.
为了实现这一点,我正在寻找像RabbitMQ这样的Message Queue解决方案.它们似乎提供了一个可靠的框架来异步运行长时间运行的任务.但是在阅读了关于RabbitMQ 的教程后,我不确定如何收到操作结果.
这就是我的想法:
前端服务器接收来自客户端的请求,并根据需要将消息发送到RabbitMQ.该前端服务器将具有3个端点
/generate
/poll
/download
Run Code Online (Sandbox Code Playgroud)
当客户端/generate使用GET参数调用时request_uid=AAA,前端服务器将使用有效负载中的request_uid向RabbitMQ发送消息.任何自由工作者随后将收到此消息并开始生成对应的文件AAA.
客户端将继续轮询/poll与request_uid=AAA检查任务完成.
任务完成后,客户端将调用/download并request_uid=AAA希望下载该文件.
现在的问题是如何将/poll与/download前端服务器的处理程序会知道有关文件生成作业的状态?RabbitMQ如何将任务结果传达给生产者.或者我必须在RabbitMQ之外实现这样的机制?(消费者将其结果放入文件中/var/completed/AAA)
你的最后一句话击中了要害:
(消费者将其结果放入文件 /var/completed/AAA 中)
您的服务器必须协调多个作业及其工作结果。因此,您将需要某种形式的“主存储库”,其中包含已完成内容的权威记录。将完成的文件复制到特殊目录中是一种合理而简单的方法。
它也不一定需要 RabbitMQ 或任何消息传递解决方案。您的服务器可以按照自己希望的方式将工作外包给这些工作人员:通过生成进程、使用线程池,或者实际上通过生成 AMQP 事件(这些事件最终在代理中并被“工作人员”队列消费者吸收)。这取决于您的应用程序以及最适合它的方式。
| 归档时间: |
|
| 查看次数: |
2964 次 |
| 最近记录: |