我在 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 相同的问题。
使用以下命令创建配置文件: 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
DigitalOcean 的应用程序平台允许您将应用程序的工作人员指定为组件。以下是已被证明有效的步骤:
doctl
枚举您的应用程序并获取您的应用程序 ID:doctl apps list
doctl apps spec get <app-id> 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 配置正确设置。
如需进一步阅读,请查看这篇文章