我有一个场景,客户端发送一个 http 请求来下载文件。该文件需要动态生成,通常需要 5-15 秒。因此,我正在研究将这个操作拆分为 3 个 http 请求的解决方案。
为了实现这一点,我正在研究像 RabbitMQ 这样的消息队列解决方案。它们似乎提供了一个可靠的框架来异步运行长时间运行的任务。然而看完tutorials在 RabbitMQ 上,我不确定如何接收操作结果。
这是我的想法:
前端服务器接收来自客户端的请求,并根据需要将消息发布到 RabbitMQ。此前端服务器将有 3 个端点
/generate
/poll
/download
当客户端调用
/generate
与 GET
参数说 request_uid=AAA
,前端服务器将在负载中使用 request_uid 向 RabbitMQ 发布消息。任何空闲 worker 随后都会收到此消息并开始生成对应于 AAA
的文件。 .客户端将继续轮询
/poll
与 request_uid=AAA
检查任务是否完成。当任务完成时,客户端将调用
/download
与 request_uid=AAA
期待下载文件。问题是如何将
/poll
和 /download
前端服务器的处理程序会知道文件生成作业的状态吗? RabbitMQ 如何将任务的结果传达回生产者。还是我必须在 RabbitMQ 之外实现这种机制? (消费者将其结果放入文件 /var/completed/AAA
)
最佳答案
开始使用 AMQP 的最简单方法是使用主题交换,并创建携带控制消息的队列。例如,你可以有一个 file.ready 队列并在它准备好拾取时发送带有文件路径名的消息,还有一个 file.error 队列以在由于某种原因无法创建文件时进行报告。然后客户端可以使用 file.generate 队列将 GET 信息发送到服务器。
关于rabbitmq - 使用 RabbitMQ 获取长时间运行任务的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5870511/