2012-10-02 6 views
15

Sto creando un'attività con un intervallo compreso tra 3 e 20 ore e quando guardo il registro dei lavoratori, per questa attività , il lavoratore dice "Got task from broker: ..." ogni ora dopo che l'attività originale è stata ricevuta fino all'esaurimento dell'Eta.i compiti di sedano con eta lungo (8+ ore) vengono eseguiti più volte di seguito quando viene raggiunto l'eta

So che questo ha a che fare con l'impostazione BROKER_TRANSPORT_OPTIONS = {'visibility_timeout': X} dove X è il numero in secondi.

Così ho giocato con visibility_timeout e se l'ho impostato su qualcosa di meno di 1 ora, posso vedere worker che ottiene lo stesso compito ogni X secondi, tuttavia quando imposto lo visibility_timeout su X è maggiore di 1 ora, quindi mantiene impostazione predefinita a 1 ora indipendentemente dall'ora impostata.

Qualcun altro incontra questo problema? È un bug noto?

sto usando Sedano 3.0.11 (Chiastic diapositive) con la versione server di Redis 2.4.15

+0

Ho appena sperimentato anche questo errore, eseguendo Celery v.3.0.19 con un server Redis v.2.4.6, ma sta accadendo anche con un worker in esecuzione sulla stessa macchina del server Redis. – oiez

+0

Osservato anche con. celery == 3.0.21 django-celery == 3.0.21 Python 2.7.3, Server Redis versione 2.2.12. . in esecuzione sulla stessa macchina. –

+0

Anche sperimentando questo bug con il sedano 3.1.17, Redis server 2.8.4, anche quando sia Redis che i worker girano sulla stessa macchina. –

risposta

7

EDIT: Qualsiasi messaggio consumatore utilizzando kombu * collegato allo stesso URL Redis aiuterà ripristino dei messaggi non riscontrati, in modo devi assicurarti che tutti loro siano configurati con lo stesso valore visibility_timeout.

Un errore comune sta iniziando monitorare il fiore simili:

celery flower -b redis://somewhere 

anziché simili:

celery -A proj flower 

quanto i primi mezzi dell'istanza fiore non sarà configurato con la configurazione sedano , quindi mancare BROKER_TRANSPORT_OPTIONS e l'impostazione visibility_timeout.

Oltre a questo, è inoltre necessario assicurarsi che gli orologi da parete siano sincronizzati utilizzando ntp, come descritto nella risposta originale di seguito.

  • kombu è la libreria di messaggistica utilizzata da Celery.

risposta originale:

Anche se non ho sentito parlare di una cosa del genere, potrebbe essere un bug. Ho aggiunto alcune dichiarazioni di stampa a kombu/transport/redis.py per verificare se il parametro visibility_timeout è stato impostato correttamente ed è decisamente per me. Provare che funzioni con valori superiori a un'ora richiederà più tempo (circa 2 ore per essere precisi), quindi posso riferire in quel momento.

Nel frattempo si potrebbe verificare che si sta impostando la visiblity_timeout correttamente aggiungendo l'istruzione print te stesso (ad esempio, per il metodo restore_visible nel trasporto Redis)

Si noti che questa funzione sta usando timestamp, quindi se si avere più di una macchina è importante che gli orologi siano abbastanza sincronizzati (specialmente non andando alla deriva per ore). Si dovrebbe sempre usare ntp su server in rete e sincronizzarsi regolarmente.

+0

Ho strumentato il kombu/transport/redis.py e il visibility_timeout è impostato in modo corretto. Spostare il server redis e il gestore del sedano su una singola macchina ha risolto il problema. Ho controllato le macchine precedenti e erano sincronizzate (ad esempio, l'ora e la data del sistema su entrambi erano uguali) – user1713317

+0

Aggiornamento della risposta con nuovi dettagli! – asksol