Shinyproxy: Comment partager le pool de connexions de base de données entre des applications brillantes sous ShinyProxy

Créé le 1 oct. 2020  ·  8Commentaires  ·  Source: openanalytics/shinyproxy

Dans ma pratique, de nombreuses applications brillantes doivent accéder à la base de données Postgresql installée sur l'hôte. J'utilise pool package pour obtenir le pool de connexion de Postgresql et le définir sur une variable globale partagée pour d'autres applications. Mais à chaque nouvelle application de déclenchement utilisateur, elle obtiendrait une nouvelle connexion de Postgresql. Je crains que Postgresql ne tombe en panne lorsque trop d'utilisateurs simultanés utilisent des applications brillantes. Existe-t-il une solution pour ce scénario ?

introduction du package pool sous forme d'URL ci-dessous. https://shiny.rstudio.com/articles/pool-basics.html

Un expert m'a conseillé d'utiliser pqbouncer, mais je ne sais pas comment l'implémenter dans ShinyProxy, un conseil ou une solution ?

Merci beaucoup.

question

Commentaire le plus utile

Ajoutez juste mes deux cents.

J'ai en fait déployé des services quelque peu similaires mais en utilisant l'API Plumber, comme je l'ai commenté ci-dessus.

C'est un peu plus compliqué et vous devez écrire une fonction wrapper pour l'utiliser. Mais il permet de connecter plusieurs bases de données différentes et ne se limite pas à PostgreSQL.

La façon dont je le fais :

  1. Serveur : configurez un service docker-compose qui exécute une API Plumber. L'API Plumber reçoit SQL et donne un R data.frame. Toutes les données sont sérialisées en tant qu'objets R (au lieu de JSON) afin de gérer plus facilement les cas extrêmes. De plus, la sérialisation des objets R vous permet de renvoyer l'erreur R ou les messages s'il y en a.
  2. Client : écrivez une fonction wrapper pour utiliser httr pour utiliser l'API Plumber déployée. Cette fonction wrapper utilisera la méthode HTTP pour obtenir les données d'interrogation SQL de l'API ou les messages d'erreur, le cas échéant. Vous pouvez distribuer la fonction wrapper via un simple script R ou un package R interne.

Personnellement, je préfère cette méthode car j'utilise presque toujours un wrapper pour obtenir des données SQL (car j'ai besoin de me connecter à plusieurs bases de données différentes et de gérer correctement l'encodage / le fuseau horaire / le type de données n'est pas si facile).

J'espère que cela sera utile à tous ceux qui sont confrontés à des cas similaires comme moi.

Tous les 8 commentaires

Si Shinyproxy prend en charge le pool de connexion à la base de données (ex. postgresql, mysql, etc.) dans les applications brillantes, ce sera beaucoup plus pratique pour les développeurs. C'est possible?

Je ne pense pas qu'il y ait une façon native de faire ça. Mais les solutions de contournement sont nombreuses. Une solution de contournement simple possible consiste à déployer une API à l'aide d'un plombier.

grâce à @shrektan , je vais l'essayer plus

J'installe pgbouncer et mets shiny connect au service pgbouncer, cela résout le problème. Merci beaucoup

Salut @chienyuchuan heureux d'apprendre que vous avez trouvé une solution !
Je clos donc ce sujet maintenant.
N'hésitez pas à ouvrir un nouveau numéro si vous rencontrez un problème avec ShinyProxy !

J'installe pgbouncer et mets shiny connect au service pgbouncer, cela résout le problème. Merci beaucoup

@chienyuchuan Salut ! Pouvez-vous me dire quel package R utilisez-vous pour vous connecter avec pgbouncer ?

Et moi, s'il vous plaît, partagez un exemple de connexion de chaîne ?

J'installe pgbouncer et mets shiny connect au service pgbouncer, cela résout le problème. Merci beaucoup

@chienyuchuan Salut ! Pouvez-vous me dire quel package R utilisez-vous pour vous connecter avec pgbouncer ?

Et moi, s'il vous plaît, partagez un exemple de connexion de chaîne ?

Cher @kuzmenkov111 , j'utilise toujours le package de pool brillant, mais je me connecte à pgbouncer.
Après avoir modifié /etc/pgbouncer/pgbouncer.ini, en saisissant la section [bases de données], vous pouvez écrire le programme R en vous connectant au nom de base de données et au port de la section [bases de données] avec le package de pool.

Voici un site de référence pour vous, j'espère que vous pourrez en tirer des leçons...

PgBouncer + Ubuntu 18.04
https://www.willlandskill.se/en/how-to-setup-pgbouncer-on-ubuntu/

Regroupement de connexions PostgreSQL avec PgBouncer
https://pgdash.io/blog/pgbouncer-connection-pool.html

Utilisation du package pool (bases)
https://shiny.rstudio.com/articles/pool-basics.html

Ajoutez juste mes deux cents.

J'ai en fait déployé des services quelque peu similaires mais en utilisant l'API Plumber, comme je l'ai commenté ci-dessus.

C'est un peu plus compliqué et vous devez écrire une fonction wrapper pour l'utiliser. Mais il permet de connecter plusieurs bases de données différentes et ne se limite pas à PostgreSQL.

La façon dont je le fais :

  1. Serveur : configurez un service docker-compose qui exécute une API Plumber. L'API Plumber reçoit SQL et donne un R data.frame. Toutes les données sont sérialisées en tant qu'objets R (au lieu de JSON) afin de gérer plus facilement les cas extrêmes. De plus, la sérialisation des objets R vous permet de renvoyer l'erreur R ou les messages s'il y en a.
  2. Client : écrivez une fonction wrapper pour utiliser httr pour utiliser l'API Plumber déployée. Cette fonction wrapper utilisera la méthode HTTP pour obtenir les données d'interrogation SQL de l'API ou les messages d'erreur, le cas échéant. Vous pouvez distribuer la fonction wrapper via un simple script R ou un package R interne.

Personnellement, je préfère cette méthode car j'utilise presque toujours un wrapper pour obtenir des données SQL (car j'ai besoin de me connecter à plusieurs bases de données différentes et de gérer correctement l'encodage / le fuseau horaire / le type de données n'est pas si facile).

J'espère que cela sera utile à tous ceux qui sont confrontés à des cas similaires comme moi.

Cette page vous a été utile?
0 / 5 - 0 notes