rabbitmq - 使用 RabbitMQ 获取长时间运行任务的结果

标签 rabbitmq amqp

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

  • 第一个请求触发文件的生成。
  • 客户端每 5 秒轮询一次服务器以检查文件是否准备好下载
  • 当轮询请求的响应为肯定时,客户端开始下载文件

  • 为了实现这一点,我正在研究像 RabbitMQ 这样的消息队列解决方案。它们似乎提供了一个可靠的框架来异步运行长时间运行的任务。然而看完tutorials在 RabbitMQ 上,我不确定如何接收操作结果。

    这是我的想法:

    前端服务器接收来自客户端的请求,并根据需要将消息发布到 RabbitMQ。此前端服务器将有 3 个端点
    /generate
    /poll
    /download
    

    当客户端调用 /generateGET参数说 request_uid=AAA ,前端服务器将在负载中使用 request_uid 向 RabbitMQ 发布消息。任何空闲 worker 随后都会收到此消息并开始生成对应于 AAA 的文件。 .

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

    当任务完成时,客户端将调用 /downloadrequest_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/

    相关文章:

    rabbitmq - 如何一次只处理一条给定类型的消息?

    rabbitmq - 重试时更改 RabbitMQ 消息的标题和正文?

    php - RabbitMQ 错误超时

    python - RabbitMQ 不断关闭连接

    node.js - 如何在 Node Js 中使用和发布来自 Amazon MQ 的消息?

    rabbitmq - 在 RabbitMQ 3+ 中删除不存在的队列不会产生预期的错误;为什么?

    rabbitmq - 在 RabbitMQ 中通过属性或 header 获取消息

    java - 在运行时构造@RabbitListener 的最简单方法

    android - AMQP + 安卓库

    http - 在端口 80 上运行联邦 RabbitMQ