数字海洋应用平台上的 Django Celery 与 Redis 问题
Posted
技术标签:
【中文标题】数字海洋应用平台上的 Django Celery 与 Redis 问题【英文标题】:Django Celery with Redis Issues on Digital Ocean App Platform 【发布时间】:2022-01-04 18:15:30 【问题描述】:经过相当多的反复试验和逐步尝试找到解决方案后,我想我在这里分享问题并根据我的发现自己回答。除了一些零碎的东西外,没有太多关于这方面的文档,希望将来能对其他人有所帮助。
请注意,这是特定于 Django、Celery、Redis 和 Digital Ocean App Platform 的。
这主要是关于以下错误和进一步的影响:
OSError: [Errno 38] 功能未实现
和
无法连接redis://......
第一个错误发生在你尝试运行 celery 命令celery -A your_app worker --beat -l info
或应用平台上的类似内容。看来数字海洋目前不支持此功能。第二个错误发生在您犯了许多潜在错误时。
【问题讨论】:
【参考方案1】:第 1 部分:
虽然 Digital Ocean 将来可能会解决这个问题,但这里有一种方法可以提供解决方法。问题是不支持的执行池。如果您想了解更多信息以及它们是如何工作的,请谷歌“celery 执行池”。默认值为prefork
。但是您需要的是gevent
或eventlet
。为了我的目的,我选择了前者。
无论您选择哪个,都必须安装它,因为它默认不附带 celery。就我而言,它是:pip install gevent
(不要忘记将其添加到您的要求中)。
完成后,您可以重新运行 celery 命令,但请注意,单个命令中不支持 gevent
和 beat
(将导致错误)。而是执行以下操作:
celery -A your_app worker --pool=gevent -l info
然后在另一个终端/控制台中单独(如果你想运行节拍)
celery -A your_app beat -l info
您还可以在第一行指定concurrency
,如下所示:--concurrency=100
。这不是必需的,但很有用。阅读它的作用,因为这超出了这里的解决方案。
第 2 部分: 在我的具体情况下,我首先在本地(开发)测试了上述内容,以确保它们有效。下一个问题是将其投入生产。我使用 Redis 作为 db/broker。
在我的特定设置中,我的大部分 celery 配置都在 the_main_app/celery/__init__.py
文件中,但有时人们将其直接放入 the_main_app/celery.py
中。无论是哪一个,请确保 REDIS_URL 设置正确。对于开发,它通常看起来像这样:
YOUR_VAR_NAME = os.environ.get('REDIS_URL', 'redis://localhost:6379')
其中YOUR_VAR_NAME
然后设置为代理,所有内容如下:
YOUR_VAR_NAME = os.environ.get('REDIS_URL', 'redis://localhost:6379')
app = Celery('the_main_app')
app.conf.broker_url = YOUR_VAR_NAME
其余的设置都记录在“celery first steps with django”帮助页面上,但与我在这里展示的内容无关。
第 3 部分:
在应用平台上设置 Redis 数据库时(非常简单),您将看到连接详细信息为“公共网络”和“VPC 网络”。
celery documentation 表示使用以下 URL 格式进行生产:redis://:password@hostname:port/db_number
。这没有用。如果您没有使用 yaml 文件,那么您只需从 Redis DB 连接详细信息中复制粘贴整个 连接字符串(从下拉列表中选择!),然后在您的 Digital 中设置一个 App-Level 环境变量命名为REDIS_URL
的海洋项目并粘贴到整个字符串中(并对其进行加密!)。
字符串应该看起来像这样(redis with 2 s!)
rediss://USER:PASS@URL.db.ondigitialocean.com:PORT
.
你快完成了。最后一步是设置工人。我可以在 App Platform 上将第 1 部分命令作为控制台命令运行来测试它们,但最终我为将它们粘贴到运行命令中的每一行设置了一个小型工作器(+ 添加组件)。
这基本上是一步一步的过程。祝你好运!
【讨论】:
以上是关于数字海洋应用平台上的 Django Celery 与 Redis 问题的主要内容,如果未能解决你的问题,请参考以下文章
数字海洋 NGINX 和 gunicorn 上的 CORS 标头访问控制缺少 django
Nginx 无法在数字海洋上提供 django 静态或媒体文件