Verwendung von Tornado mit Pika zur asynchronen Warteschlangenüberwachung

8

Ich habe einen AMQP-Server ( RabbitMQ ), den ich gerne veröffentlichen und in einem Tornado Webserver . Um dies zu tun, dachte ich, ich würde eine asynchrone amqp Python-Bibliothek verwenden; insbesondere Pika (eine Variante, die angeblich Tornado unterstützt).

Ich habe Code geschrieben, der erfolgreich aus der Warteschlange zu lesen scheint, außer dass ich am Ende der Anfrage eine Ausnahme erhalte (der Browser gibt eine gute Antwort zurück):

%Vor%

Ich bin mir nicht ganz sicher, ob ich diese Bibliothek richtig verwende, also könnte ich etwas ganz offensichtlich falsch machen. Der grundlegende Ablauf meines Codes ist:

  1. Die Anfrage kommt in
  2. Erstellen Sie eine Verbindung zu RabbitMQ mit TornadoConnection; Spezifiziere einen Rückruf
  3. Im Verbindungsrückruf einen Kanal erstellen, meine Warteschlange deklarieren / binden und basic_consume aufrufen; Spezifiziere einen Rückruf
  4. Schließen Sie den Kanal im Callback-Modus und rufen Sie die Finish-Funktion von Tornado auf.
  5. Siehe Ausnahme.

Meine Fragen sind ein paar:

  1. Ist dieser Fluss überhaupt richtig? Ich bin mir nicht sicher, was der Zweck des Verbindungsrückrufs ist, außer dass es nicht funktioniert, wenn ich es nicht benutze.
  2. Soll ich pro Webanforderung eine AMQP-Verbindung erstellen? Die Dokumentation von RabbitMQ schlägt vor, nein, ich sollte nicht, aber ich sollte nur Kanäle erstellen. Aber wo würde ich die Verbindung herstellen, und wie versuche ich Wiederverbinden, sollte es kurz untergehen?
  3. Wenn ich eine AMQP-Verbindung pro Webanfrage erstelle, wo soll ich sie schließen? Der Aufruf von amqp.close () in meinem Callback scheint die Dinge noch mehr zu vermasseln.

Ich werde versuchen, ein wenig später einen Beispielcode zu bekommen, aber die oben beschriebenen Schritte legen die verbrauchende Seite der Dinge ziemlich vollständig dar. Ich habe auch Probleme mit der Veröffentlichungsseite, aber der Verbrauch von Warteschlangen ist dringender.

    
dave mankoff 19.12.2010, 14:45
quelle

2 Antworten

8

Es würde helfen, Quellcode zu sehen, aber ich benutze das gleiche tornadounterstützende Pika-Modul ohne Probleme in mehr als einem Produktionsprojekt.

Sie möchten keine Verbindung pro Anfrage erstellen. Erstellen Sie eine Klasse, die alle Ihre AMQP-Vorgänge umschließt und sie als Singleton auf der Tornado-Anwendungsebene instanziiert, die für Anforderungen (und für Anforderungshandler) verwendet werden kann. Ich mache das in einer 'runapp ()' Funktion, die sowas macht und dann den Haupttornado ioloop startet.

Hier ist eine Klasse namens 'Events'. Es ist eine teilweise Implementierung (genauer gesagt, ich definiere 'self.handle_event' hier nicht. Das liegt an dir.

%Vor%

Und dann habe ich das in eine Datei namens 'events.py' eingefügt. Meine RequestHandler und alle Backend-Codes verwenden ein "common.py" -Modul, das Code umschließt, der für beide nützlich ist (meine RequestHandler rufen keine amqp-Modulmethoden direkt auf - auch für db, Cache usw.), also ich define 'events = None' auf der Modulebene in common.py, und ich instanziiere das Event-Objekt so:

%Vor%

Frohes neues Jahr :-D

    
jonesy 01.01.2011 05:29
quelle
0

Jemand hat Erfolg beim Zusammenführen von Tornado und Pika hier gemeldet. Soweit ich das beurteilen kann, ist es nicht so einfach, Pika von Tornado anzurufen, da beide Bibliotheken ihre eigenen Event Loops haben wollen.

    
Marcelo Cantos 20.12.2010 02:06
quelle