2016-09-29 79 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 /隊列名稱/

最好的解決方案將是運行完全相同的代碼差不多)不同機器上的配置相同。