2014-09-30 12 views
5

HoLavoratore di sedano: come consumare da tutte le code?

  • set CELERY_CREATE_MISSING_QUEUES = True
  • non definiti CELERY_QUEUES
  • definito CELERY_DEFAULT_QUEUE = 'default' (di tipo diretto)
  • una classe router personalizzato che crea percorsi al volo, come mostrato in questo biglietto (https://github.com/celery/celery/issues/150) .

Vedo che viene creata la nuova coda nel percorso restituito dal router personalizzato che presumo sia a causa di CELERY_CREATE_MISSING_QUEUES.

Ora nel nodo operaio che ho eseguito, non passare l'argomento -Q e consuma solo dalla coda di 'default' che sembra essere in linea con la documentazione -

Di default consumerà da tutte le code definite nell'impostazione CELERY_QUEUES (che, se non specificato, si imposta automaticamente nella coda con nome sedano).

C'è un modo per far sì che il mio nodo di lavoro consumi da TUTTE le code comprese quelle create dinamicamente?

Grazie,

risposta

3

Il lavoratore deve essere detto su queste code create automaticamente o in modo dinamico, quindi è necessario un modo per ottenere questi nomi di coda e memorizzarli forse quando si crea loro o farli forse da rabbitmqctl list_queues se stiamo usando RabbitMQ come broker, e per esempio aggiungiamo un gestore di segnali per aggiungere queste code dinamiche ai lavoratori da cui consumare.

Ad esempio, utilizzando celeryd_after_setup segnale:

from celery.signals import celeryd_after_setup 

@celeryd_after_setup.connect 
def add_dynamic_queue(sender, instance, **kwargs): 
    # get the dynamic queue, maybe stored somewhere 
    queue = 'dynamic_queue' 
    instance.app.amqp.queues.select_add(queue) 

Se avete sempre nuove code dinamiche create, è anche possibile comandare i lavoratori a iniziare a consumare da queste code in fase di esecuzione utilizzando:

#command all workers to consume from the 'dynamic_queue' queue 
app.control.add_consumer('dynamic_queue', reply=True) 

# command specific workers 
app.control.add_consumer('dynamic_queue', reply=True, destination=[[email protected]]) 

See Adding Consumers.

Spero che questo aiuti, modifico la domanda quando avrò più informazioni su questo.

+0

Grazie. È stato interessante Sì, uso RabbitMQ e pensavo di avere sempre code dinamiche. Speravo di poter dire al lavoratore di consumare da tutte le code usando un qualche tipo di jolly. Ho intenzione di provare i tuoi suggerimenti ora. Domanda - Considerando che i lavoratori possono essere in esecuzione su server diversi, con il broker dei messaggi come unico elemento comune, in che modo app.control.add_consumer (...) comunica le informazioni ai lavoratori? – ksrini

+0

@ksrini yeah Cercavo il codice sorgente per scoprire se è possibile utilizzare un modello jolly, ma il metodo che imposta le code da utilizzare richiede un elenco di code separate da virgole. E i comandi di controllo utilizzano il broker (RabbitMQ) per trasmettere i messaggi ai lavoratori, controllando il modulo 'celery.app.control'. – Pierre

+0

l'approccio suggerito utilizzando il comando di controllo add_consumer ha funzionato! Grazie!Vorrei invocare add_consumer solo se i lavoratori non stanno già consumando da quella coda perché add_consumer sembra richiedere un po 'di tempo (circa 1-2 secondi) se reply = True e stavo pianificando di farlo dal router dove determino la nuova coda come parte del percorso. Se imposto reply = False, è più veloce. Vedi qualche problema con il richiamo di add_consumer anche se i lavoratori potrebbero già consumare da quella coda? – ksrini

Problemi correlati