9
votes

Utilisation de l'ASYNC PostgreSQL GEM

J'utilise Goliath (qui est alimenté par EventMachine) et le gemme Postgres < code> pg , j'utilise actuellement le gem pg de manière bloquante: conn.exec ("SELECT * à partir de produits ') (par exemple) et je me demande si est un meilleur moyen de se connecter à une base de données Postgres?


0 commentaires

4 Réponses :


1
votes

Je ne suis plus familier avec PG, mais je n'ai pas entendu dire que toute base de données populaire pourrait pour les connexions asynchronisées. Vous devez donc toujours conserver une connexion à la base de données pendant la durée de la requête. Par conséquent, vous devez toujours bloquer certains où dans la pile.

Selon votre application, vous pouvez déjà le faire de la meilleure façon possible.

Mais lorsque vous avez affaire à une sorte d'application de sondage (lorsque le même client envoie une multitude de demandes en peu de temps) et il est plus important d'obtenir la réponse, même si elle est vide, vous pourriez écrire un rubis < Code> Fibre Ou le fil ou le processus soufflé de FLULL ou le processus de longue durée et proxy requis sur la DB et cache les résultats.

Par exemple: une demande est livrée à partir du client A. Goliath App gère la requête au processus de base de données avec un identifiant unique et répond à la requête avec 'Pas encore de données ". Le processus de DB termine la requête et enregistre les résultats dans un cache avec l'ID. Lorsque la demande suivante vient du même client, Goliath voit qu'il a déjà des résultats de requête en attente, supprime les résultats du cache et répond au client. Dans le même temps, il planifie la prochaine requête avec le processus de base de données afin que ce soit prêt plus tôt. Si la demande suivante se trouve avant la fin de la dernière fois, aucune nouvelle requête n'est planifiée (ne multipliant pas les requêtes).

De cette façon, vos réponses sont rapides et non bloquantes, tout en servant toujours de nouvelles données de DB datériaux dB. Bien sûr, ils pourraient être un peu désynchronisés avec des données réelles, mais à nouveau, en fonction de l'application, cela pourrait ne pas être un problème.


0 commentaires

1
votes

L'idée est d'utiliser un adaptateur ASYNC à la base de données (PostgreSQL) en conjonction avec un serveur Web événementiel (Goliath) pour obtenir des performances. Mike Perham a écrit un PG ACTIVERCORD Adaptateur pour rails 2.3 l'an dernier. Peut-être que vous pouvez utiliser cela.

Comme autre exemple, Ilya grigorik a publié cette démo d'une pile ASYNC Rails. Dans ce cas, le serveur éventuel est mince et la base de données est MySQL. Installez la démo et essayez le point de repère avec et sans le pilote de certification EM. La différence est dramatique.


2 commentaires

J'essaie de trouver un adaptateur ASYNC à PostgreSQL, mais je ne trouve aucun ce qui fonctionnera sur son (sans activerecord par exemple) et une mise à jour régulièrement


Je crains que vous soyez trop loin de la courbe pour compter sur quoi que ce soit comme ça à ce stade. Perham est bon et il répond aux demandes d'aide pour le faire fonctionner dans des rails 3. Voici un lien vers la routine de connexion POSTRESQL dans l'adaptateur mentionné ci-dessus, au cas où vous l'avez manqué: GITUB.COM/MPERHAM/EM_POSTGRESQL/BLOB/MASTER/LIB/...



16
votes

La bibliothèque pg offre une prise en charge complète de l'API asynchrone de PostgreSQL. J'ai ajouté un exemple de comment l'utiliser au répertoire échantillons / : xxx

Je vous recommande de lire la documentation sur le pqconnectstart fonction et Traitement de commande asynchrone section du manuel PostgreSQL, puis comparez celui-ci avec l'échantillon ci-dessus.

Je n'ai pas utilisé EventMachine avant, mais si cela vous permet d'enregistrer une prise et des rappels pour quand il devient lisible / écritable, je penserais que cela serait assez facile d'intégrer les appels de base de données.

J'ai voulu utiliser le idées dans article d'Ilya Grigorik sur l'utilisation des fibres pour nettoyer en haut Code éventuel pour faciliter l'utilisation de l'API ASYNC, mais c'est une solution. J'ai Un ticket ouvert < / a> Pour le suivre si vous êtes intéressé / motivé pour le faire vous-même.



3
votes

Oui, vous pouvez accéder aux postgres de manière non bloquante de Goliath. J'ai eu le même besoin et mettre ensemble cette preuve de concept: https://github.com/levicook / Goliath-Postgres-Spike


0 commentaires