2014-11-18 4 views
14

Ich arbeite auf Sellerie und mit Rabbitmq Server und erstellt ein Projekt in Django-Projekt in einem Server (wo Nachrichtenwarteschlange, Datenbank existiert) und es funktioniert gut, ich habe mehrere erstellt Arbeiter auchwie Sellerie Arbeiter auf Remote-System zu konfigurieren und zu betreiben

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

`

aber ich möchte Arbeiter von einem anderen server.so ich einige Informationen benötigen laufen darüber, wie ein Arbeiter in einem anderen System laufen, wenn ich einige Websites, bezeichnet es zu sagen, dass wir brauchen, um Führen Sie das Django-Projekt auf dem Remote-System auch ist es notwendig?

Antwort

0

Wenn Sie möchten, dass Ihre Sellerie-Arbeiter auf einem anderen Server arbeiten, aber trotzdem mit dem Django-Projekt arbeiten, müssen Sie das Django-Projekt auch auf dem anderen Server haben. Wenn die Sellerie-Arbeiter auf dem Remote-Server nur für eine kleine Aufgabe verantwortlich sind (dh für eine einzelne Django-App), können Sie damit fortfahren, diese zu verschieben, aber sie benötigen weiterhin Zugriff auf Ressourcen, Quellcode und Daten, die sie haben müssen die Arbeit erledigen.
Wirklich, wenn Sie wollen, dass zwei Server an den gleichen Aufgaben arbeiten, müssen Sie eine einfache Webschnittstelle (wie Flask) verwenden, um zwischen den Servern zu kommunizieren (und die Funktionalität Ihrer Warteschlange zu erweitern). Dann müssen Sie sicherstellen, dass beide dieselbe Datenquelle verwenden.
Sie sollten Ihre Datenbank remote hosten oder den Remote-Server remote auf die Datenbank zugreifen lassen. In jedem Fall müssen alle Mitarbeiter, die auf einem Server ausgeführt werden, Zugriff auf die Datenbank und den gesamten Quellcode benötigen, um die Aufgabe abzuschließen. Dann müssen Sie einfach die beiden Server eine Messaging-Warteschlange teilen. Hier

+0

danke für die Antwort ist es sehr nützlich für mich, konnte Sie mir helfen, wie der Arbeiter auf dem Remote-Standort zu konfigurieren und ist es notwendig, Kolben sowohl auf der Fernbedienung und Hauptserver – krishna

24

ist der Kern der Idee:

Auf Maschine A:

  1. installieren Sellerie & RabbitMQ.
  2. Konfigurieren Sie rabbitmq so, dass Maschine B eine Verbindung zu ihm herstellen kann.
  3. Erstellen Sie my_tasks.py mit einigen Aufgaben und stellen Sie einige Aufgaben in die Warteschlange.

auf Maschine B:

  1. installieren Sellerie.
  2. Kopieren Sie die Datei my_tasks.py von Maschine A auf dieses System.
  3. einen Arbeiter Führen Sie die Aufgaben

Ich hatte die gleiche Anforderung und experimentierten mit Sellerie zu konsumieren. Es ist viel einfacher, das zu tun. Ich habe an diesen Tagen ein detailliertes Blog geschrieben. Check out how to send tasks to remote machine?

+0

Ich habe die Dokumentation die Datei erstellt wie gezeigt, aber während der Betrieb der Sellerie Arbeiter gibt es die folgenden Fehler ------------- Verbraucher: Kann nicht verbinden mit amqp: // krish: **@123.456.78.9: 5672/321.654.5.111: [Errno 113] Keine Route zum Host. Erneut versuchen in 6,00 Sekunden ... – krishna

+1

sieht aus wie es ein Verbindungsproblem mit Rabbitmq gibt. Versuchen Sie, den Worker auf einem anderen Computer mit derselben Konfiguration auszuführen, und prüfen Sie, ob es funktioniert. – ChillarAnand

+0

Ich habe das gleiche auf einem anderen System versucht, aber es wirft auch das gleiche Problem – krishna

6

Sie können von app.send_task() mit so etwas wie die folgenden in Ihrem django Projekt machen:

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

Wie verwende ich 'send_task' im Falle von 'Teilaufgaben'? 'app.send_task ('myapp.send_push_notification', (json.dumps (Nutzlast1),), link = app.send_task ('differentapp.save_pn_response', (json.dumps (Nutzlast2),)))' – Hussain

0

im Grunde will ich ChillarAnand Antwort nehmen. Ich möchte einen Kommentar zu seiner Antwort hinzufügen, aber ich kann nicht dazu führen, dass ich keinen Ruf habe.

so ...

die Antwort auf Ihre Frage ...

Zuerst möchte "how to send tasks to remote machine?", wie ChillarAnand erwähnt lesen.

Das ist wirklich guter Artikel, mit einem kleinen Fehler, wie "hat nicht '@ app.task' auf der Funktion def add(), im Inhalt remote.py", verursachte es Problem und verwirrte mich als ein Neuling für Sellerie.

Und die Antwort auf "[Errno 113] Keine Route zum Host." Teil,

Ich schätze ... Ich glaube, Sie haben eine Firewall in Ihrem Rabbitmq-Server laufen, Sie möchten vielleicht einen Scheck haben. Die meiste Zeit ist es iptables, aber es könnte etwas anderes. Schalten Sie es aus oder ändern Sie die Regeln. Dann kannst du es noch einmal versuchen.

1

Denken Sie zuerst darüber nach, wie Sellerie wirklich funktioniert?

Der Sellerieproduzent fügt eine Aufgabe hinzu, die mit Namen und anderen wichtigen Kopfzeilen in die Warteschlange eingereiht wird, um den Standort Ihrer Aufgabe zu identifizieren.

Sellerie fügt MQ keine vollständige ausführbare Funktion hinzu.

Also, wenn Sie sich Arbeiter (Verbraucher) Seite betrachten.

Sellerie erhält Aufgabendetails von MQ und versucht, dies auszuführen. Um diese Aufgabe auszuführen, sollte module/files/environment/codebase verfügbar sein, um diese Aufgabe auszuführen.

Nun zu Ihrer Frage kommen lässt ...

Sie versuchen, Arbeiter auf einer separaten Maschine zu setzen, so logisch eine Funktion von der Aufgabe sollten Sie benötigen vollständige Code-Umgebung von Aufgaben und Sie verbinden darauf auszuführen (Wie sonst Sie erhalten Aufgaben von MQ?) mit Ihrem MQ, wo Aufgaben leben.

Verwandte Themen