首页 > 解决方案 > 如何为我的烧瓶应用程序为在线用户创建 rq 工作人员?(使用redis服务器)

问题描述

我对 rq 工作人员的工作方式感到困惑!我创建了一个烧瓶 Web 应用程序,它在 redis 服务器上运行一个后台进程,然后返回结果。到目前为止,在开发过程中,我一直在使用命令行在我的机器上启动 rq 工作进程。但是,现在我已准备好在线启动我的应用程序。但是当远程用户尝试在线运行应用程序时,worker 托管在哪里?

我尝试使用直接在我的代码中启动它们with Connection():并且它有效,但它也中断了启动 Web 应用程序以在我的浏览器中运行的过程。

谢谢你的帮助!

编辑:为了使我的问题更具体,我在我的机器上使用命令行启动了一个 rq 工作人员,但是当我在远程 redis 服务器(托管在 AWS EC2 上)上启动任务时,应用程序停止并且没有工作人员活动。我的 rq 工作人员的配置是否有问题,或者我应该以另一种方式启动它们?我所做的只是import rq然后运行rq worker simulator,这对于本地开发来说已经足够了;如果有我需要更改的配置,我是否在命令行中这样做?

编辑2:我让它工作了。我只需要运行rq worker simulator --url {ec2 address}。感谢 Paul Becotte 的解释为我指明了正确的方向。

标签: pythonflaskredis

解决方案


通常使用任务队列(我对 rq 只是模糊地熟悉——请原谅我缺乏细节,但认为这里没有必要)这个想法是将工作从请求/响应周期中分离出来。您不希望需要 30 秒的请求 - 尤其是当您有其他请求进来时!

在这个世界上,你有一个状态源(redis)和一堆使用它的客户端。您的用户连接到您的 api 以发送请求。您的 api 连接到状态源。为此,可能有两个端点——启动任务和检查状态。您的 api 在“开始任务”上向 pub/sub 发送一条消息,并在调用检查状态时查找该任务的结果。

您还可以启动 X 工作进程。它们连接到 redis 以及订阅者。当一个任务进入时,一个工作人员将它捡起并工作,然后将结果发送回redis。您运行了足够多的这些流程,以使您的流量保持较低的总周期时间。

您根本不会在任何工作程序或 api 端点中存储任何状态,因此您可以水平扩展它们 - 在任意数量的机器上启动任意数量的机器。那么你唯一需要维护的是你的redis服务器——确保它是稳定的并备份了一切(你也可以集群redis并获得HA,但这是一个更长的讨论)。


推荐阅读