隔离芹菜用于开发和生产

时间:2016-09-29 12:14:56

标签: django celery django-celery

我使用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'

生产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,
)

开发celeryconfig:

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,
)

任何人都知道为什么生产任务会在开发上运行?

1 个答案:

答案 0 :(得分:1)

TL; DR

尽可能快地分离您的开发者和生产服务器。

完整答案

在同一台服务器上同时使用dev和production可能会导致很多问题。

您将花费大量时间编写处理可能产生的边缘情况的代码。例如,开发人员可能有一个新功能,你测试但它有一个错误,你有内存问题 - 你的生产可能会受到伤害。

另一件事是你使用的第三方服务,比如rabbitMQ - 你试图定义不同的队列,但是你看到你遇到了问题,你需要编写更多的代码来维护它(def make_sure_new_feature_not_deleteing_users_on_prudction())。这可能发生在你每次开始玩新东西时(redis,memcache,sentry等),你必须配置不同的端口/ url /队列名称/

最佳解决方案是在不同的计算机上运行完全相同的代码(几乎)相同的配置。