2016-09-29 44 views
1

使用virtualenv为我的开发服务器和生产服务器使用相同的服务器。用于开发和生产的隔离芹菜

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

我曾尝试使用不同券商ADRESS,但它不能正常工作:生产

主管脚本:

[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:[email protected]/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, 
) 

谁知道为什么从生产任务将在发展上运行?

+0

它看起来好像你的生产和开发实例使用相同的代码库,因为你为两个芹菜工作者使用相同的目录。这是打算?在我看来,使用与生产服务器相同的代码库的开发服务器并不真正起作用,或者我忽略了一种特殊情况? – Tim

回答

1

TL; DR

分开你的开发和生产服务器一样快,您可以。

完整的答案

有两种开发和生产在同一台服务器上可能会导致很多问题。

通过编写处理边缘案例的代码,您将花费大量时间。例如,dev可能会有一个测试的新功能,但它有一个bug,并且你有内存问题 - 你的产品可能会受到伤害。

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

最好的解决方案将是运行完全相同的代码差不多)不同机器上的配置相同。