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

使用RabbitMQ获取长时间运行任务的结果,rabbitmq,amqp,Rabbitmq,Amqp,我有一个场景,客户端发送http请求下载文件。该文件需要动态生成,通常需要5-15秒。因此,我正在研究一种将此操作拆分为3个http请求的解决方案 第一个请求触发文件的生成 客户端每5秒轮询一次服务器,以检查文件是否已准备好下载 当对轮询请求的响应为肯定时,客户端开始下载该文件 为了实现这一点,我正在研究RabbitMQ等消息队列解决方案。它们似乎为异步运行长时间运行的任务提供了可靠的框架。但是,在阅读了RabbitMQ上的操作后,我不确定如何接收操作的结果 以下是我的想法: 前端服务器接收来自

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

  • 第一个请求触发文件的生成
  • 客户端每5秒轮询一次服务器,以检查文件是否已准备好下载
  • 当对轮询请求的响应为肯定时,客户端开始下载该文件
  • 为了实现这一点,我正在研究RabbitMQ等消息队列解决方案。它们似乎为异步运行长时间运行的任务提供了可靠的框架。但是,在阅读了RabbitMQ上的操作后,我不确定如何接收操作的结果

    以下是我的想法:

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

    /generate
    /poll
    /download
    
    当客户端使用
    GET
    参数调用
    /generate
    时,比如
    request\u uid=AAA
    ,前端服务器将向RabbitMQ发送一条消息,其中包含负载中的请求uid。任何自由工作者随后都将收到此消息,并开始生成与
    AAA
    对应的文件

    客户端将使用
    request\u uid=AAA
    继续轮询
    /poll
    ,以检查任务是否完成

    任务完成后,客户端将调用
    /download
    ,请求uid=AAA以期望下载文件


    问题是前端服务器的
    /poll
    /download
    处理程序将如何了解文件生成作业的状态?RabbitMQ如何将任务的结果传回生产者。或者我必须在RabbitMQ之外实现这样的机制吗?(消费者将其结果放入一个文件
    /var/completed/AAA

    你的最后一句话击中了头部:

    (消费者将其结果放入 文件/var/completed/AAA)

    服务器必须协调多个作业及其工作结果。因此,您需要某种形式的“主存储库”,其中包含已完成工作的权威记录。将完成的文件复制到一个特殊的目录是一种合理而简单的方法


    它也不一定需要RabbitMQ或任何消息传递解决方案。您的服务器可以按照自己的意愿将作业分包给这些工作者:通过生成进程、使用线程池,或者实际上是通过生成AMQP事件,这些事件最终会出现在代理中并被“工作者”队列消费者吞下。这取决于您的应用程序以及最适合的应用程序。

    开始使用AMQP的最简单方法是使用主题交换,并创建包含控制消息的队列。例如,您可以有一个file.ready队列并在准备拾取时发送带有文件路径名的消息,以及一个file.error队列以在由于某种原因无法创建文件时报告。然后,客户端可以使用file.generate队列将GET信息发送到服务器