Django 分离芹菜用于开发和生产

Django 分离芹菜用于开发和生产,django,celery,django-celery,Django,Celery,Django Celery,我使用virtualenv为我的开发服务器和生产服务器使用相同的服务器 我的问题是芹菜不知道在哪个项目中运行任务。我不希望生产任务在我的开发服务器上运行,反之亦然 我尝试使用不同的代理地址,但无法正常工作: 生产主管脚本: [program:production-celery] command=/home/user/.virtualenvs/production.site.com/bin/celery --app=myproject.celeryconfig:app worker -E -n p

我使用virtualenv为我的开发服务器和生产服务器使用相同的服务器

我的问题是芹菜不知道在哪个项目中运行任务。我不希望生产任务在我的开发服务器上运行,反之亦然

我尝试使用不同的代理地址,但无法正常工作:

生产主管脚本:

[program:production-celery]
command=/home/user/.virtualenvs/production.site.com/bin/celery --app=myproject.celeryconfig:app worker -E -n production --loglevel=INFO --without-mingle --without-gossip -Q default,celery

directory = /home/user/.virtualenvs/production.site.com/myproject
environment=DJANGO_SETTINGS_MODULE='myproject.settings.production'
发展:

[program:development-celery]
command=/home/user/.virtualenvs/development.site.com/bin/celery --app=myproject.celeryconfig:app worker -E -n development --loglevel=INFO --without-mingle --without-gossip -Q default,celery

directory = /home/user/.virtualenvs/development.site.com/myproject
environment=DJANGO_SETTINGS_MODULE='myproject.settings.development'
生产芹菜配置:

import os
from celery import Celery

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings.production')

app = Celery('myproject', broker='amqp://', backend='amqp')
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)


app.conf.update(
    CELERY_ACCEPT_CONTENT = ['pickle', 'json'],
    CELERY_TIMEZONE='Europe/Oslo',
    CELERY_ENABLE_UTC=True,
    CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler',
    CELERY_SEND_TASK_ERROR_EMAILS = True,
    CELERY_SEND_ERROR_EMAILS = True,
    CELERY_STORE_ERRORS_EVEN_IF_IGNORED = True,
    CELERY_IGNORE_RESULT = False,
    CELERY_TASK_RESULT_EXPIRES = 172800,
)
import os
from celery import Celery

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings.development')
app = Celery('myproject', broker='amqp://development:development@localhost/development')
app.config_from_object('django.conf:settings')

app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)


app.conf.update(
    CELERY_ACCEPT_CONTENT = ['pickle', 'json'],
    CELERY_TIMEZONE='Europe/Oslo',
    CELERY_ENABLE_UTC=True,
    CELERY_SEND_TASK_ERROR_EMAILS = False,
    CELERY_STORE_ERRORS_EVEN_IF_IGNORED = True,
    CELERY_IGNORE_RESULT = False,
)
开发celeryconfig:

import os
from celery import Celery

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings.production')

app = Celery('myproject', broker='amqp://', backend='amqp')
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)


app.conf.update(
    CELERY_ACCEPT_CONTENT = ['pickle', 'json'],
    CELERY_TIMEZONE='Europe/Oslo',
    CELERY_ENABLE_UTC=True,
    CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler',
    CELERY_SEND_TASK_ERROR_EMAILS = True,
    CELERY_SEND_ERROR_EMAILS = True,
    CELERY_STORE_ERRORS_EVEN_IF_IGNORED = True,
    CELERY_IGNORE_RESULT = False,
    CELERY_TASK_RESULT_EXPIRES = 172800,
)
import os
from celery import Celery

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings.development')
app = Celery('myproject', broker='amqp://development:development@localhost/development')
app.config_from_object('django.conf:settings')

app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)


app.conf.update(
    CELERY_ACCEPT_CONTENT = ['pickle', 'json'],
    CELERY_TIMEZONE='Europe/Oslo',
    CELERY_ENABLE_UTC=True,
    CELERY_SEND_TASK_ERROR_EMAILS = False,
    CELERY_STORE_ERRORS_EVEN_IF_IGNORED = True,
    CELERY_IGNORE_RESULT = False,
)
有人知道为什么生产任务要在开发中运行吗?

TL;博士 尽可能快地分离开发服务器和生产服务器

完整答案 在同一台服务器上同时使用开发和生产可能会导致很多问题

您将花费大量时间编写代码来处理可能产生的边缘情况。例如,dev可能有一个您测试的新特性,但它有一个bug,您有内存问题—您的产品可能会受到影响

另一件事是您使用的第三方服务,如rabbitMQ-您试图定义不同的队列,但您发现存在问题,需要编写更多代码来维护它(
def确保新功能不删除用户在prudcion()
)。每次你开始玩新东西(redis、memcache、sentry等)时都可能发生这种情况,你必须配置不同的端口/URL/队列名称/


最好的解决方案是使用完全相同的代码,在不同的机器上运行(几乎)相同的配置。

在我看来,生产和开发实例使用相同的代码库,就像芹菜工人使用相同的目录一样。这是有意的吗?在我看来,使用与生产服务器相同的代码库的开发服务器并没有真正发挥作用,或者我忽略了一个特殊情况?