【问题标题】:Celery with multiple django sites具有多个 Django 站点的 Celery
【发布时间】:2019-04-02 03:42:27
【问题描述】:

我为少数客户的网站提供了一个 django 后端:

my_proj
    |- my_proj
        |- __init__.py
        |- settings.py
        |- settings_development.py
        |- settings_production_1.py
        |- settings_production_2.py
        |- settings_production_3.py
    |- my_app_1
    |- my_app_2
    ...

settings_production_1.py:

from settings import *

DEBUG = False
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'customer_1_db',
        'USER': 'some_user',
        'PASSWORD': 'some_passw',
        'HOST': '127.0.0.1',
        'PORT': '',
    }
}
MEDIA_ROOT = 'media/customer_1'

每个站点都是由 supervisord 管理的单独进程,并使用单独的数据库。另外我在单独的服务器上有一个 redis。

我需要一些具有数据库访问权限的 celery 后台任务。

我该怎么做?

更新

好的,我可以运行多个 celery worker。我可以从控制台做到这一点

$ export DJANGO_SETTINGS_MODULE=my_proj.settings_production_2
$ /home/.../my_vitrual_env/bin/celery -A my_proj worker -l info

但我无法从 supervisord 运行它

[program:celery2]
directory=/home/.../my_proj
command=/home/.../my_vitrual_env/bin/celery -A asl worker -l info
environment=DJANGO_SETTINGS_MODULE=my_proj.settings_production_2
...

【问题讨论】:

  • 您可能需要为每个站点编写单独的任务,因为每个站点使用不同的数据库和所有内容。
  • 单个任务文件或单个tasks.py中的单个任务?
  • 个人任务。因此,您拥有的每个任务将被写入 3 次,并且在每个任务中您将指定要读取/写入的不同数据库。另一个成本效益不高的解决方案是让 3 个工作实例分别在特定的设置文件上运行。更容易实施,但两种解决方案都难以管理。
  • @devdob 如何使用特定设置文件运行工作实例?
  • Celery.py 查找名为 DJANGO_SETTINGS_MODULE 的环境变量或默认为您指定的常规 settings.py 文件,查看它显示 os.environ.setdefault(...) 的行。因此,在每台服务器上,您都可以将此环境变量设置为您希望它运行的设置。

标签: django redis celery


【解决方案1】:

您为您的项目配置一个应用程序。例如:


    my_proj
      | - my_proj
        |- __init__.py
        |- celery.py
        |- settings.py
        |- settings_development.py
        |- settings_production_1.py
        |- settings_production_2.py
        |- settings_production_3.py

等等

在 celery.py 中,您通过设置 DJANGO_SETTINGS_MODULE 环境变量从 the appropriate settings object 配置 celery 应用程序,并使用它来加载适当的设置。

然后在 supervisord 中,通过将起始行指定为 celery multi -A my_proj 并使用正确的 DJANGO_SETTINGS_MODULE env 变量,为每个站点提供自己的 celery。

【讨论】:

  • 所以,我需要将 settings_production_1.py、settings_production_2.py 和 settings_production_3.py 放在一个单独的文件夹中,并在每个文件夹中放入一个带有适当 DJANGO_SETTINGS_MODULE 的 celery.py?
  • 你可以这样做。或者,您也可以在 supervisord 中设置 DJANGO_SETTINGS_MODULE 环境变量,例如 DJANGO_SETTINGS_MODULE="my_profj.settings_development"
  • @maksymov:您是否尝试过使用 multi 或 worker 或两者兼而有之?
  • 好的,一般来说,当从 supervisord 或 systemd 启动 celery 时,你必须使用 multi 来分离 worker。您还需要设置一个运行 celery 的应用程序用户,您可以使用 --uid 指定它
猜你喜欢
  • 2015-06-23
  • 2012-05-27
  • 2015-02-03
  • 2013-02-02
  • 2013-09-21
  • 2012-03-30
  • 1970-01-01
  • 2017-06-26
  • 2011-01-08
相关资源
最近更新 更多