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