Redis
 sql >> Datenbank >  >> NoSQL >> Redis

Verwendung von Celery für synchrone externe API-Abfragen in Echtzeit mit Gevent

Ich werde versuchen, so viele Fragen wie möglich zu beantworten.

Kann (und sollte) dies mit Sellerie gemacht werden?

Ja, das kannst du

Ich verwende Django. Sollte ich versuchen, Django-Sellerie anstelle von normalem Sellerie zu verwenden?

Django hat eine gute Unterstützung für Sellerie und würde das Leben während der Entwicklung viel einfacher machen

Jede dieser Aufgaben kann andere Aufgaben hervorbringen – wie das Aufzeichnen dessen, was gerade passiert ist, oder andere Arten der Verzweigung. Ist das möglich?

Sie können Unteraufgaben innerhalb einer Aufgabe mit ignore_result =true nur für Nebeneffekte starten

Könnten Tasks die Daten, die sie erhalten, zurückgeben – d. h. potenziell Kb an Daten durch Sellerie (in diesem Fall Redis als Basiswert) oder sollten sie in die DB schreiben und nur Zeiger auf diese Daten weitergeben?

Ich würde vorschlagen, die Ergebnisse in db zu setzen und dann die ID herumzureichen, würde Ihren Makler und Ihre Mitarbeiter glücklich machen. Weniger Datenübertragung/Beizen etc.

Jede Aufgabe ist hauptsächlich E/A-gebunden und sollte ursprünglich nur gevent aus dem Webthread verwenden, um die Anforderungen aufzufächern und das gesamte Warteschlangendesign zu überspringen, aber es stellt sich heraus, dass es für eine andere Komponente wiederverwendet werden würde. Der Versuch, den gesamten Hin- und Rückweg durch die Qs in Echtzeit zu halten, erfordert wahrscheinlich viele Arbeiter, die sicherstellen, dass die Warteschlangen größtenteils leer sind. Oder ist es? Würde das Ausführen des gevent-Workerpools dabei helfen?

Da der Prozess io-gebunden ist, wird gevent hier definitiv helfen. Allerdings suche ich auch nach einer Antwort, wie viel die Parallelität für gevent Pooled Worker sein sollte.

Muss ich gevent-spezifische Aufgaben schreiben oder wird die Verwendung des gevent-Pools automatisch mit Netzwerk-IO verarbeitet?

Gevent führt das Affen-Patching automatisch durch, wenn Sie es im Pool verwenden. Aber die Bibliotheken, die Sie verwenden, sollten gut mit gevent harmonieren. Andernfalls, wenn Sie einige Daten mit simplejson (das in c geschrieben ist) parsen, würde dies andere gevent Greenlets blockieren.

Ist es möglich, bestimmten Aufgaben Prioritäten zuzuweisen?

Sie können bestimmten Aufgaben keine bestimmten Prioritäten zuweisen, sondern sie an verschiedene Warteschlangen weiterleiten und diese Warteschlangen dann von einer unterschiedlichen Anzahl von Mitarbeitern abhören lassen. Je mehr Arbeiter für eine bestimmte Warteschlange vorhanden sind, desto höher wäre die Priorität dieser Aufgaben in dieser Warteschlange.

Wie wäre es damit, sie in Ordnung zu halten?

Kette ist eine Möglichkeit, die Ordnung aufrechtzuerhalten. Akkorde sind eine gute Zusammenfassung. Sellerie kümmert sich darum, also musst du dir keine Sorgen machen. Selbst bei Verwendung von gevent pool wäre es am Ende möglich, über die Reihenfolge der Aufgabenausführung nachzudenken.

Soll ich Sellerie weglassen und einfach Kombu verwenden?

Sie können, wenn sich Ihr Anwendungsfall im Laufe der Zeit nicht zu etwas Komplexerem ändert und wenn Sie auch bereit sind, Ihre Prozesse über celeryd + Supervisor selbst zu verwalten. Auch, wenn Sie sich nicht um die Aufgabenüberwachung kümmern, die mit Tools wie Celerymon, Flower usw. einhergeht.

Es scheint, als wäre Sellerie eher auf "Aufgaben" ausgerichtet, die aufgeschoben werden können und nicht zeitkritisch sind.

Sellerie unterstützt auch geplante Aufgaben. Wenn Sie das mit dieser Aussage gemeint haben.

Bin ich verrückt nach dem Versuch, diese Echtzeit beizubehalten?

Ich glaube nicht. Solange Ihre Verbraucher schnell genug sind, wird es so gut wie in Echtzeit sein.

Welche anderen Technologien sollte ich mir ansehen?

In Bezug auf Sellerie sollten Sie den Vorrat mit Bedacht wählen. Mein Vorschlag wäre, Cassandra zu verwenden. Es ist gut für Echtzeitdaten (sowohl beim Schreiben als auch bei Abfragen). Sie können auch redis oder mongodb verwenden. Sie haben ihre eigenen Probleme als Ergebnisspeicher. Aber dann kann eine kleine Optimierung der Konfiguration viel bewirken.

Wenn Sie etwas völlig anderes als Sellerie meinen, können Sie sich asyncio (python3.5) und zeromq ansehen, um dasselbe zu erreichen. Mehr kann ich dazu aber nicht sagen.