2016-09-29 3 views
1

Ich benutze den gleichen Server für meine Entwicklung Server und Produktionsserver, mit virtualenv.Isolieren Sellerie für Entwicklung und Produktion

Mein Problem ist Sellerie nicht zu wissen, in welchem ​​Projekt die Aufgabe ausgeführt wird. Ich möchte keine Aufgabe von der Produktion auf meinem Entwicklungsserver laufen und umgekehrt.

Ich habe versucht, verschiedene Broker-Adresse zu verwenden, aber es funktioniert nicht richtig:

Supervisor Skript für die Produktion:

[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' 

Entwicklung:

[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' 

Produktion 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

Entwicklung:

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

Wer weiß, warum Aufgabe von der Produktion auf die Entwicklung ausgeführt werden würde?

+0

Es sieht für mich so aus, als ob Ihre Produktions- und Entwicklungsinstanzen die gleiche Codebasis verwenden, da Sie für beide Selleriearbeiter dasselbe Verzeichnis verwenden. Ist das beabsichtigt? Es scheint mir, dass ein Entwicklungsserver, der dieselbe Codebasis wie der Produktionsserver verwendet, nicht wirklich einen Zweck erfüllt, oder gibt es einen speziellen Fall, den ich übersehen habe? – Tim

Antwort

1

TL; DR

Trennen Sie Ihren Entwicklungs- und Produktionsserver so schnell wie möglich.

Voll Antwort

sowohl Entwickler und Produktion auf dem gleichen Server zu haben, kann eine Menge Probleme verursachen.

Sie werden eine Menge Zeit damit verbringen, Code zu codieren, der Kantenfälle behandelt, die entstehen könnten. Zum Beispiel könnte dev eine neue Funktion haben, die Sie testen, aber es hatte einen Fehler und Sie haben Speicherprobleme - Ihre Produktion könnte verletzt werden.

Eine andere Sache ist die dritte Partei Dienste, die Sie verwenden, wie RabbitMQ - Sie versucht, verschiedene Warteschlangen zu definieren, aber wie Sie gesehen haben, hatten Sie Probleme und Sie müssen mehr Code schreiben, um es zu pflegen (def make_sure_new_feature_not_deleteing_users_on_prudction()). Dies kann jedes Mal passieren, wenn Sie anfangen, mit etwas Neuem zu spielen (redis, memcache, sentry, etc), müssen Sie verschiedene Ports konfigurieren/urls/queues name/

Beste Lösung wird sein, genau den gleichen Code zu haben, der (fast) die gleichen Konfigurationen auf verschiedenen Maschinen.

Verwandte Themen