mit dem PostgreSQL-Gem Async

8

Ich benutze Goliath (welches von eventmachine betrieben wird) und den postgres gem pg , momentan I verwende das pg gem blockweise: conn.exec('SELECT * FROM products') (zum Beispiel) und ich frage mich, ob es eine bessere Möglichkeit gibt, eine Verbindung zu einer Postgres-Datenbank herzustellen?

    
errorhandler 05.05.2011, 06:29
quelle

4 Antworten

15

Die pg -Bibliothek bietet vollständige Unterstützung für die asynchrone API von PostgreSQL. Ich habe ein Beispiel hinzugefügt, wie man es für samples/ verwendet. Verzeichnis:

%Vor%

Ich würde empfehlen, dass Sie die Dokumentation zu PQconnectStart Funktion und den Abschnitt Asynchrone Befehlsverarbeitung des PostgreSQL-Handbuchs und vergleichen Sie das dann mit das obige Beispiel.

Ich habe EventMachine vorher noch nicht benutzt, aber wenn Sie einen Socket und Callbacks für lesbare / schreibbare Daten registrieren können, würde es meiner Meinung nach ziemlich einfach sein, Datenbankaufrufe in das Programm zu integrieren.

Ich wollte die Ideen in Ilya Grigoriks verwenden Artikel über die Verwendung von Fibers zum Bereinigen von evented-Code , um die Verwendung der asynchronen API zu vereinfachen, aber das ist noch lange nicht alles. Ich habe ein Ticket geöffnet , um es zu verfolgen wenn Sie daran interessiert / motiviert sind, es selbst zu tun.

    
Michael Granger 19.05.2011, 00:18
quelle
3

Ja, du kannst auf postgres non-blocking von Goliath zugreifen. Ich hatte das gleiche Bedürfnis und stellte diesen Beweis des Konzepts zusammen: Ссылка

    
Levi 15.03.2012 21:38
quelle
1

Ich bin mit Pg nicht (mehr) vertraut, aber ich habe nicht gehört, dass irgendeine populäre Datenbank Verbindungen asynchronisieren könnte. Daher müssen Sie für die Dauer der Abfrage weiterhin eine Verbindung zur Datenbank aufrechterhalten. Daher müssen Sie immer noch einige im Stapel blockieren.

Abhängig von Ihrer Anwendung werden Sie möglicherweise bereits den bestmöglichen Weg gehen.

Aber wenn Sie mit einer Art von Polling-App zu tun haben (wo der gleiche Kunde eine Vielzahl von Anfragen in kurzer Zeit versendet) und es wichtiger ist, die Antwort zu bekommen, auch wenn sie leer ist, dann könnten Sie einen Ruby schreiben co_de% oder flull blased thread oder process, das langlebig ist und Abfragen an die DB weiterleitet und die Ergebnisse zwischenspeichert.

Beispiel: Eine Anfrage kommt von Client A. Die Goliath-App behandelt die Anfrage an den DB-Prozess mit einer eindeutigen ID und antwortet auf die Anfrage mit 'noch keine Daten' . Der Datenbankprozess beendet die Abfrage und speichert die Ergebnisse in einem Cache mit der ID. Wenn die nächste Anfrage von demselben Client eingeht, sieht Goliath, dass bereits Abfrageergebnisse vorliegen, entfernt die Ergebnisse aus dem Cache und antwortet dem Client. Gleichzeitig plant es die nächste Abfrage mit dem DB-Prozess, so dass es früher bereit wäre. Wenn die nächste Anfrage eingeht, bevor die letzte abgeschlossen ist, wird keine neue Abfrage geplant (die Abfragen werden nicht multipliziert).

Auf diese Weise sind Ihre Antworten schnell und nicht blockierend, während Sie immer noch neue Daten von DB ASAP bereitstellen. Natürlich könnten sie mit den tatsächlichen Daten nicht mehr synchron sein, aber auch dies ist je nach Anwendung kein Problem.

    
Laas 05.05.2011 09:17
quelle
1

Die Idee ist, einen asynchronen Adapter zur Datenbank (Postgresql) in Verbindung mit einem ausgeglichenen Webserver (Goliath) zu verwenden, um Leistung zu erzielen. Mike Perham schrieb letztes Jahr einen PG-ActiveRecord-Adapter für Rails 2.3. Vielleicht kannst du das benutzen.

Als ein weiteres Beispiel veröffentlichte Ilya Grigorik diese Demo eines asynchronen Rails-Stacks. In diesem Fall ist der ausgeglichene Server Thin und die Datenbank ist Mysql. Installieren Sie die Demo und testen Sie den Benchmark mit und ohne den EM-fähigen Treiber. Der Unterschied ist dramatisch.

    
seph 05.05.2011 15:34
quelle