如何在 DigitalOcean 应用服务器上运行 Python RQ 作业?

问题描述 投票:0回答:2

我在 DigitalOcean 上部署了一个 FastAPI 应用程序,它有多个 API 端点,在其中一些端点中,我必须使用 RQ 包将抓取功能作为后台作业运行,以免用户等待服务器响应。

我已经设法在 DigitalOcean 上创建 Redis 数据库并成功将应用程序连接到它,但我在运行 RQ 工作线程时遇到问题。 这是代码,灵感来自 RQ 的官方文档:

import redis
from rq import Worker, Queue, Connection

listen = ['high', 'default', 'low']

#connecting to DigitalOcean's redis db
REDIS_URL = os.getenv('REDIS_URL')
conn = redis.Redis.from_url(url=REDIS_URL)

#Create a RQ queue using the Redis connection
q = Queue(connection=conn)

with Connection(conn):
    worker = Worker([q], connection=conn) #This instruction works fine
    worker.work() #The deployment fails here, the DigitalOcean server crashes at this instruction

工作线程/作业执行在本地运行良好,但在 DO 的服务器中失败 这可能是因为什么?有什么我遗漏的或者需要在 DO 端点上完成的任何类型的配置吗?

提前谢谢您!

我还尝试使用FastAPI的BackgroundTask类。起初,它运行得很顺利,但是作业中途停止运行,并且没有来自类本身的后台发生的情况的反馈。我猜测这是由于 FastAPI 中似乎没有自定义配置造成的超时(可能是因为它的后台任务意味着低成本且快速)。

我也在考虑尝试 Celery,但我担心我会遇到与 RQ 相同的问题。

python redis fastapi digital-ocean rq
2个回答
0
投票

使用以下命令创建配置文件: sudo nano /etc/systemd/system/myproject.service

[Unit]
Description=Gunicorn instance to serve myproject
After=network.target

[Service]
User=user
Group=www-data
WorkingDirectory=/home/user/myproject
Environment="PATH=/home/user/myproject/myprojectvenv/bin"
ExecStart=/home/user/myproject/myprojectvenv/bin/gunicorn --workers 3 --bind unix:myproject.sock -m 007 wsgi:app


[program:rq_worker]
command=/home/user/myproject/myprojectvenv/bin/rq -A rq_worker -l info
directory=/home/user/myproject
autostart=true
autorestart=true
stderr_logfile=/var/log/celery.err.log
stdout_logfile=/var/log/celery.out.log


[Install]
WantedBy=multi-user.target

0
投票

DigitalOcean 的应用程序平台允许您将应用程序的工作人员指定为组件。以下是已被证明有效的步骤:

  • 在您的计算机上安装 doctl,以允许通过命令行界面 (CLI) 访问平台。
  • 利用
    doctl
    枚举您的应用程序并获取您的应用程序 ID:
doctl apps list
  • 使用以下命令获取应用程序的 appspec.yaml 文件:
doctl apps spec get <app-id> appspec.yaml
  • 修改您的 appspec.yaml 文件以合并您的工作人员,如下所示:
- name: rq-worker
  environment_slug: python
  github:
    repo: <repository URL for the code>
    branch: <repository branch>
    deploy_on_push: true
  run_command: rq worker <additional arguments>
  • 完成文件编辑后,继续使用以下命令更新您的应用程序:
doctl apps update <your-app-id> --spec appspec.yaml

遵循这些步骤将确保您的工作人员的执行。必须确保您的 Redis 配置正确设置。

如需进一步阅读,请查看这篇文章

© www.soinside.com 2019 - 2024. All rights reserved.