2016-05-13 18 views
14

Considerate questa sessione bash:Come si esegue lo stato/fiore di sedano senza l'opzione -A?

$ export DJANGO_SETTINGS_MODULE=web.settings 
$ celery status -b redis://redis.businessoptics.dev:6379/1 -t 10 
Error: No nodes replied within time constraint. 
$ celery status -b redis://redis.businessoptics.dev:6379/1 -t 10 -A scaffold.tasks.celery_app 
[email protected]: OK 

Perché ho bisogno l'opzione -A? Per quanto posso dire, il sedano dovrebbe essere in grado di rilevare i necessari metadati sui redis.

Analogamente, se eseguo celery flower -b <redis url>, viene visualizzato che si connette correttamente ai redis ma non mostra alcun lavoro/attività/coda reali e mostra diversi messaggi come 'stats' inspect method failed. Ancora una volta, l'aggiunta di -A provoca il suo funzionamento.

Voglio eseguire il fiore in un contenitore Docker autonomo minimo che non contenga il mio codice o le sue dipendenze. Diversi repository come this one offrono questo genere di cose. Quindi, come posso farlo? Il repository collegato offre molte opzioni ma nessun modo per specificare l'opzione -A, il che suggerisce che non è necessario.

Sono un principiante al sedano quindi potrei mancare qualcosa di stupido. Cosa dovrei fare?

Il modulo scaffold.tasks.celery_app appare semplicemente come questo:

from celery import Celery 
from django.conf import settings 

app = Celery() 
app.config_from_object(settings) 

e queste sono le impostazioni di Django che coinvolgono il sedano:

{'BROKER_HEARTBEAT': 0, 
'BROKER_TRANSPORT_OPTIONS': {'fanout_patterns': True, 
           'fanout_prefix': True, 
           'visibility_timeout': 172800}, 
'BROKER_URL': 'redis://redis.businessoptics.dev:6379/1', 
'CELERYBEAT_SCHEDULE': {'journey-heartbeat': {'args':(), 
               'schedule': <crontab: * * * * * (m/h/d/dM/MY)>, 
               'task': 'kms.data.journey.tasks.heartbeat'}}, 
'CELERYD_CONCURRENCY': 1, 
'CELERYD_HIJACK_ROOT_LOGGER': False, 
'CELERYD_LOG_COLOR': False, 
'CELERYD_MAX_TASKS_PER_CHILD': 1, 
'CELERYD_PREFETCH_MULTIPLIER': 1, 
'CELERY_ACCEPT_CONTENT': ['pickle'], 
'CELERY_ACKS_LATE': True, 
'CELERY_DEFAULT_EXCHANGE': 'default', 
'CELERY_DEFAULT_EXCHANGE_TYPE': 'direct', 
'CELERY_DEFAULT_QUEUE': 'default', 
'CELERY_DEFAULT_ROUTING_KEY': 'default', 
'CELERY_IGNORE_RESULT': False, 
'CELERY_IMPORTS': ['kms.knowledge.query.tasks2', 
        # names of several more modules... 
        ], 
'CELERY_QUEUES': [<unbound Queue tablestore -> <unbound Exchange default(direct)> -> kms.data.table_store.tasks.#>, 
        # several more similar-looking Queues... 
        <unbound Queue default -> <unbound Exchange default(direct)> -> default>], 
'CELERY_REDIRECT_STDOUTS': False, 
'CELERY_RESULT_BACKEND': 'database', 
'CELERY_RESULT_DBURI': 'mysql://businessoptics:[email protected]:3306/product', 
'CELERY_RESULT_DB_SHORT_LIVED_SESSIONS': True, 
'CELERY_ROUTES': ['scaffold.tasks.routers.TaskNameRouter'], 
'CELERY_SEND_EVENTS': True, 
'CELERY_SEND_TASK_ERROR_EMAILS': False, 
'CELERY_SEND_TASK_SENT_EVENT': True, 
'CELERY_STORE_ERRORS_EVEN_IF_IGNORED': True, 
'CELERY_TASKNAME_ROUTES': [('tablestore', 'kms.data.table_store.tasks.#'), 
          # bunch of routes... 
          ], 
'CELERY_TASK_RESULT_EXPIRES': None, 
'CELERY_TIMEZONE': 'UTC', 
'CELERY_TRACK_STARTED': True, 
'CELERY_WORKER_DIRECT': True 
} 

Qui ci sono le versioni rilevanti:

celery==3.1.19 
Django==1.8 
django-celery==3.1.0 
redis==2.10.3 
+0

per me 'flower --port = 5555 --broker = 'redis: // ...'' funziona senza passare '-A' – ahmed

risposta

5

Il -Una opzione è quella che passa l'istanza di Celery con la relativa configurazione i includendo il pacchetto contenente le tue attività.

Per utilizzare tutte le funzionalità, i fiori devono essere configurati come un lavoratore, questo significa conoscere il pacchetto in cui si trovano i compiti di sedano e conoscerli.

Aggiungi al vostro contenitore scaricatore il lib python necessario non dovrebbe essere così difficile, per esempio si potrebbe aggiungere alla this file la riga di configurazione CELERY_IMPORTS nel seguente modo:

CELERY_IMPORTS = os.getenv('CELERY_IMPORTS ', 'default.package') 

UPDATE

Come @asksol, creatore di sedano, ha sottolineato nei commenti una spiegazione più dettagliata del perché è necessario l'opzione -A:

Flower è anche un utente consumer e quindi aiuterà a recuperare i messaggi non associati. Poiché hai una visibilità personalizzata definita, l'avvio di un fiore non configurato significa che utilizzerà il timeout di visibilità predefinito e quindi riconsegnerà i messaggi non più veloci più rapidamente dei tuoi dipendenti. Usa sempre -A in modo che la configurazione worker, flower e client sia sincronizzata

+0

Puoi spiegare perché ahmed chi ha commentato la mia domanda non ha bisogno di passare l'opzione? –

+0

Non dovresti chiederglielo. –

+0

La mia domanda iniziale si riduce a "come ha fatto a farlo", quindi se lo sapesse, penso che me lo direbbe. Il mio punto è che è chiaro che l'opzione non è sempre necessaria e la tua risposta mi sta dicendo che lo è. –

Problemi correlati