6 Stimmen

Ist Celery für den Einsatz mit vielen kleinen, verteilten Systemen geeignet?

Ich schreibe eine Software, die ein paar hundert Personen verwalten soll. kleine Anlagen im "Feld" über einen intermittierenden 3G (oder ähnliche) Verbindung.

Die Zentrale muss Aufträge an die Systeme vor Ort senden (z. B. "Bericht über Ihren Status", "Aktualisierung Ihrer Software" usw.), und die Systeme vor Ort müssen Aufträge an den Server zurücksenden (z. B. "Es wurde ein Fehler festgestellt", "Hier sind einige Daten" usw.).

Ich habe einige Zeit damit verbracht, mir die Sellerie und es でしょう perfekt passen: celeryd die in der Heimatbasis laufen, könnten Aufträge für die Systeme im Feld sammeln, ein celeryd die auf den Feldsystemen laufen, könnten Aufträge für den Server sammeln, und diese Aufträge könnten ausgetauscht werden, wenn Clients verfügbar werden.

Ist Celery also eine gute Lösung für dieses Problem? Genauer gesagt:

  • Die meisten Aufgaben werden an einen einzelnen Mitarbeiter weitergeleitet (z. B. "Sende den Auftrag 'get_status' an 'system51'") - stellt dies ein Problem dar?
  • Kann es mit ungünstigen Netzbedingungen (z. B. Verbindungsabbrüchen) umgehen?
  • Welche Funktionen sind nur verfügbar, wenn RabbitMQ als Backend verwendet wird? (Ich würde RabbitMQ lieber nicht auf den Feldsystemen betreiben)
  • Gibt es noch einen anderen Grund, warum Sellerie mir das Leben schwer machen könnte, wenn ich ihn so verwende, wie ich es beschrieben habe?

Danke!

(es wäre berechtigt, vorzuschlagen, dass Sellerie ein Overkill ist, aber es gibt andere Gründe, dass es mein Leben einfacher machen würde, also würde ich es gerne in Betracht ziehen)

12voto

asksol Punkte 18373

Die Mehrzahl der Aufgaben wird einem einzelnen Arbeiter zugewiesen (z.B. "send the Auftrag 'get_status' an 'system51'") - Wird dies ein Problem sein?

Ganz und gar nicht. Erstellen Sie einfach eine Warteschlange für jeden Arbeiter, z.B. sagen wir, jeder Knoten hört auf eine Round-Robin-Warteschlange namens default und jeder Knoten hat seine eigene Warteschlange, die nach seinem Knotennamen benannt ist:

(a)$ celeryd -n a.example.com -Q default,a.example.com
(b)$ celeryd -n b.example.com -Q default,b.example.com
(c)$ celeryd -n c.example.com -Q default,c.example.com

Die direkte Weiterleitung einer Aufgabe an einen Knoten ist einfach:

$ get_status.apply_async(args, kwargs, queue="a.example.com")

oder durch Konfiguration mit einer Router :

# Always route "app.get_status" to "a.example.com"
CELERY_ROUTES = {"app.get_status": {"queue": "a.example.com"}}

Wird es anständig behandelt Netzwerkbedingungen (wie z. B, Verbindungsabbrüche)?

Der Worker erholt sich zuverlässig von Verbindungsabbrüchen des Brokers. (zumindest bei RabbitMQ, bei allen anderen Backends bin ich mir nicht sicher, aber das ist einfach zu testen und zu beheben (man muss nur die entsprechenden Ausnahmen in eine Liste eintragen)

Für den Client können Sie immer wieder versuchen, die Aufgabe zu senden, wenn die Verbindung unterbrochen ist, oder Sie können HA mit RabbitMQ einrichten: http://www.rabbitmq.com/pacemaker.html

Welche Funktionen wenn RabbitMQ als Backend verwendet wird Backend verwendet wird? (Ich würde lieber nicht RabbitMQ auf den Feldsystemen laufen lassen)

Fernsteuerungsbefehle, und nur "direkter" Austausch wird unterstützt (nicht "Thema" oder "Fanout"). Dies wird jedoch unterstützt werden in Kombu (http://github.com/ask/kombu) .

Ich würde die Verwendung von RabbitMQ ernsthaft überdenken. Warum denken Sie, dass es nicht gut passt? IMHO würde ich mich für ein solches System nicht anderswo umsehen (außer vielleicht ZeroMQ, wenn das System transient ist und Sie keine Nachrichtenpersistenz benötigen).

Gibt es einen anderen Grund, warum Cele schwierig machen könnte, wenn ich ihn so verwende, wie ich es beschrieben habe?

Ich kann mir unter dem, was Sie oben beschrieben haben, nichts vorstellen. Da das Gleichzeitigkeitsmodell multiprocessing ist, benötigt es etwas Speicher (ich arbeite daran, Unterstützung für Thread-Pools und Eventlet-Pools, die in einigen Fällen helfen können).

wäre es zulässig, vorzuschlagen aber es gibt noch andere Gründe, die mir das Leben leichter machen würden, also würde ich es gerne in Betracht ziehen)

In diesem Fall denke ich, dass Sie das Wort Overkill leichtfertig verwenden. Es kommt wirklich darauf an davon ab, wie viel Code und Tests Sie ohne es schreiben müssen. Ich denke es ist besser, eine bereits vorhandene allgemeine Lösung zu verbessern, und in der Theorie klingt es klingt es so, als sollte es für Ihre Anwendung gut funktionieren.

1voto

Seth Punkte 42154

Ich würde wahrscheinlich einen (Django)-Webdienst einrichten, um Anfragen anzunehmen. Der Webdienst könnte die Aufgabe übernehmen, Anfragen zu validieren und schlechte Anfragen abzuwehren. Dann kann celery einfach die Arbeit machen.

Dies würde allerdings voraussetzen, dass die entfernten Geräte den Webdienst abfragen, um zu sehen, ob ihre Aufgaben erledigt wurden. Je nachdem, was genau Sie vorhaben, kann das sinnvoll sein oder auch nicht.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X