2014-11-18 13 views
14

sto lavorando su sedano e utilizzo server rabbitmq e ho creato un progetto nel progetto django in un server (dove coda di messaggi, database esiste) e sta funzionando bene, ho creato più lavoratori anchecome configurare ed eseguire seder worker su sistema remoto

from kombu import Exchange, Queue 
CELERY_CONCURRENCY = 8 

CELERY_ACCEPT_CONTENT = ['pickle', 'json', 'msgpack', 'yaml'] 

CELERY_RESULT_BACKEND = 'amqp' 
CELERYD_HIJACK_ROOT_LOGGER = True 
CELERY_HIJACK_ROOT_LOGGER = True 
BROKER_URL = 'amqp://guest:[email protected]:5672//' 

CELERY_QUEUES = (
    Queue('default', Exchange('default'), routing_key='default'), 
    Queue('q1', Exchange('A'), routing_key='routingKey1'), 
    Queue('q2', Exchange('B'), routing_key='routingKey2'), 
) 
CELERY_ROUTES = { 
'my_taskA': {'queue': 'q1', 'routing_key': 'routingKey1'}, 
'my_taskB': {'queue': 'q2', 'routing_key': 'routingKey2'}, 
} 


AMQP_SERVER = "127.0.0.1" 
AMQP_PORT = 5672 
AMQP_USER = "guest" 
AMQP_PASSWORD = "guest" 
AMQP_VHOST = "/"` 


CELERY_INCLUDE = ('functions') 

`

ma voglio correre i lavoratori da un altro server.so ho bisogno di alcune informazioni riguardanti come gestire un lavoratore in un altro sistema in cui ho fatto riferimento alcuni siti si sta dicendo che abbiamo bisogno di è anche necessario eseguire il progetto django sul sistema remoto?

risposta

0

Se desideri che i tuoi operatori di sedani operino su un server diverso ma lavori ancora con il progetto django, dovrai sicuramente avere il progetto django anche sull'altro server. Se i lavoratori del celery sul server remoto sono responsabili solo di alcune piccole attività (ad esempio una singola app django), puoi farla franca semplicemente spostandole, ma avranno comunque bisogno di accedere a qualsiasi risorsa, codice sorgente e dati che bisogno di portare a termine il lavoro
In realtà, se si desidera che due server lavorino sulle stesse attività, sarà necessario utilizzare una semplice interfaccia Web (come Flask) per comunicare tra i server (ed estendere la funzionalità della propria coda). Quindi, dovrai assicurarti che entrambi utilizzino la stessa fonte di dati.
Considerare l'hosting del proprio database da remoto o fare in modo che il server remoto acceda al database da remoto. In entrambi i casi, tutti i lavoratori in esecuzione su un server avranno il bisogno di accedere al database e tutto il codice sorgente necessario per completare l'attività. Quindi, è necessario semplicemente che i due server condividano una coda di messaggi.

+0

grazie per la risposta è molto utile per me, potreste aiutarmi a configurare il worker sulla postazione remota ed è necessario avere una boccetta sul server remoto e principale – krishna

24

Ecco il nocciolo dell'idea:

sulla macchina A:

  1. Installare sedano & RabbitMQ.
  2. Configurare rabbitmq in modo che la macchina B possa connettersi ad essa.
  3. Creare my_tasks.py con alcune attività e mettere in coda alcune attività.

sulla macchina B:

  1. installazione di sedano.
  2. Copia il file my_tasks.py dalla macchina A alla macchina.
  3. eseguire un lavoratore di consumare i compiti

Ho avuto la stessa esigenza e sperimentato con il sedano. È molto più facile farlo. Ho scritto un post sul blog dettagliato in quei pochi giorni indietro. Scopri how to send tasks to remote machine?

+0

ho seguito la documentazione creata il file come mostrato ma durante l'esecuzione del gestore del sedano sta dando il seguente errore ------------- consumer: Impossibile connettersi ad amqp: // krish: **@123.456.78.9: 5672/321.654.5.111: [Errno 113] Nessuna route per l'host. Provare di nuovo tra 6.00 secondi ... – krishna

+1

sembra che ci sia un problema di connessione con rabbitmq. prova a eseguire il worker su un'altra macchina con la stessa configurazione e controlla se funziona. – ChillarAnand

+0

ho provato lo stesso su un altro sistema ma sta anche sollevando lo stesso numero – krishna

6

È possibile fare uso di app.send_task() con qualcosa come il seguente nel progetto django:

from celery import Celery 
import my_client_config_module 

app = Celery() 
app.config_from_object(my_client_config_module) 

app.send_task('dotted.path.to.function.on.remote.server.relative.to.worker', 
       args=(1, 2)) 
+0

Come si usa 'send_task' in caso di' sottotasks'? 'app.send_task ('myapp.send_push_notification', (json.dumps (payload1),), link = app.send_task ('differentapp.save_pn_response', (json.dumps (payload2),)))' – Hussain

0

in fondo mi prenderai la risposta di ChillarAnand. Vorrei aggiungere un commento sulla sua risposta, ma non posso causare che non ho 50 reputazione.

quindi ...

la risposta alla tua domanda ...

In primo luogo si desidera leggere "how to send tasks to remote machine?", come ChillarAnand menzionato.

Questo è davvero un buon articolo, con un piccolo difetto, come "non ha '@ app.task' sulla funzione def add(), nel contenuto remote.py", ha causato problemi e mi ha confuso come un novizio di sedano.

E la risposta a "[Errno 113] Nessuna route per l'host." part,

Immagino ... Suppongo che tu abbia un firewall in esecuzione nel tuo server rabbitmq, potresti voler avere un assegno. La maggior parte del tempo, è iptables, ma potrebbe qualcos'altro. Spegnilo o cambia le regole. Quindi puoi fare un altro tentativo.

1

In primo luogo, pensa a come il sedano funziona davvero?

Il produttore di Celery aggiunge un'attività per la coda con nome e altre intestazioni importanti per identificare la posizione dell'attività.

Celery non aggiunge una funzione eseguibile completa a MQ.

Quindi, quando si guarda lato lavoratore (consumatore).

Celery riceve i dettagli dell'attività da MQ e tenta di eseguirlo. Per eseguire questa attività dovrebbero essere disponibili modulo/file/ambiente/codebase per eseguire questa attività.

consente ora di venire alla tua domanda ...

si tenta di impostare lavoratore su una macchina separata in modo logicamente ad eseguire una funzione puntato dal l'attività che deve ambiente codice completo di attività e si dovrebbe collegare (Altrimenti come riceverai compiti da MQ?) con il tuo MQ dove i compiti vivono.

Problemi correlati