Shinyproxy: So teilen Sie den Datenbankverbindungspool zwischen glänzenden Apps unter ShinyProxy

Erstellt am 1. Okt. 2020  ·  8Kommentare  ·  Quelle: openanalytics/shinyproxy

In meiner Praxis müssen viele glänzende Apps auf die Postgresql-DB zugreifen, die auf dem Host installiert ist. Ich verwende das Pool-Paket, um den Verbindungspool von Postgresql zu erhalten, und setze es auf die globale Variable, die für andere Apps freigegeben wird. Aber jeder neue Benutzer, der die App auslöst, würde eine neue Verbindung von Postgresql erhalten. Ich fürchte, Postgresql würde abstürzen, wenn zu viele gleichzeitige Benutzer glänzende Apps verwenden. Gibt es eine Lösung für dieses Szenario?

Einführung des Pool-Pakets als folgende URL. https://shiny.rstudio.com/articles/pool-basics.html

Ein Experte rät mir, pqbouncer zu verwenden, aber ich weiß nicht, wie ich es in ShinyProxy implementieren soll. Gibt es einen Rat oder eine Lösung?

Vielen Dank.

question

Hilfreichster Kommentar

Fügen Sie einfach meine zwei Cent hinzu.

Ich habe tatsächlich etwas ähnliche Dienste bereitgestellt, aber die Plumber-API verwendet, wie ich oben kommentiert habe.

Es ist etwas komplizierter und Sie müssen eine Wrapper-Funktion schreiben, um sie zu verwenden. Aber es ermöglicht die Verbindung mehrerer verschiedener Datenbanken und ist nicht auf PostgreSQL beschränkt.

So wie ich es mache:

  1. Server: Richten Sie einen Docker-Compose-Dienst ein, der eine Klempner-API ausführt. Die Klempner-API empfängt SQL und gibt einen R data.frame zurück. Alle Daten werden als R-Objekte (anstelle von JSON) serialisiert, um Eckfälle einfacher handhaben zu können. Darüber hinaus ermöglicht die Serialisierung von R-Objekten die Rückgabe des R-Fehlers oder der R-Nachrichten, falls vorhanden.
  2. Client: Schreiben Sie eine Wrapper-Funktion, um httr zu verwenden, um die bereitgestellte Plumber-API zu verwenden. Diese Wrapper-Funktion verwendet die HTTP-Methode, um die SQL-Abfragedaten von der API oder gegebenenfalls Fehlermeldungen abzurufen. Sie können die Wrapper-Funktion über ein einfaches R-Skript oder ein internes R-Paket verteilen.

Ich persönlich bevorzuge diese Methode, da ich fast immer einen Wrapper verwende, um SQL-Daten zu erhalten (da ich eine Verbindung zu mehreren verschiedenen Datenbanken herstellen muss und die korrekte Handhabung der Kodierung / Zeitzone / Datumsdatentyp nicht so einfach ist).

Ich hoffe, dies ist hilfreich für jeden, der mit ähnlichen Fällen wie mir konfrontiert ist.

Alle 8 Kommentare

Wenn Shinyproxy Datenbankverbindungspools (z. B. postgresql, mysql usw.) in Shiny-Apps unterstützen würde, ist dies für Entwickler viel bequemer. Ist es möglich?

Ich glaube nicht, dass es eine native Methode gibt, dies zu tun. Aber Workarounds gibt es viele. Eine mögliche einfache Problemumgehung besteht darin, eine API mithilfe von Klempner bereitzustellen.

danke an @shrektan , ich werde es später versuchen.

Ich installiere pgbouncer und setze glänzende Verbindung zum pgbouncer-Dienst, es löst das Problem. Vielen Dank

Hi @chienyuchuan freut mich zu hören, dass du eine Lösung gefunden hast!
Daher schließe ich dieses Thema jetzt.
Zögern Sie nicht, eine neue Ausgabe zu eröffnen, wenn Sie ein Problem mit ShinyProxy haben!

Ich installiere pgbouncer und setze glänzende Verbindung zum pgbouncer-Dienst, es löst das Problem. Vielen Dank

@chienyuchuan Hallo! Können Sie mir sagen, welches R-Paket Sie für die Verbindung mit pgbouncer verwenden?

Und meinst du bitte ein Beispiel für eine String-Verbindung?

Ich installiere pgbouncer und setze glänzende Verbindung zum pgbouncer-Dienst, es löst das Problem. Vielen Dank

@chienyuchuan Hallo! Können Sie mir sagen, welches R-Paket Sie für die Verbindung mit pgbouncer verwenden?

Und meinst du bitte ein Beispiel für eine String-Verbindung?

Lieber @kuzmenkov111 , ich verwende immer noch das
Nachdem Sie /etc/pgbouncer/pgbouncer.ini bearbeitet und den Abschnitt [databases] eingegeben haben, können Sie ein R-Programm schreiben, das eine Verbindung zu dbname und port des Abschnitts [databases] mit Pool-Paket herstellt.

Hier ist eine Referenzseite für Sie, ich hoffe, Sie können daraus lernen...

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

PostgreSQL-Verbindungspooling mit PgBouncer
https://pgdash.io/blog/pgbouncer-connection-pool.html

Nutzung des Pool-Pakets (Grundlagen)
https://shiny.rstudio.com/articles/pool-basics.html

Fügen Sie einfach meine zwei Cent hinzu.

Ich habe tatsächlich etwas ähnliche Dienste bereitgestellt, aber die Plumber-API verwendet, wie ich oben kommentiert habe.

Es ist etwas komplizierter und Sie müssen eine Wrapper-Funktion schreiben, um sie zu verwenden. Aber es ermöglicht die Verbindung mehrerer verschiedener Datenbanken und ist nicht auf PostgreSQL beschränkt.

So wie ich es mache:

  1. Server: Richten Sie einen Docker-Compose-Dienst ein, der eine Klempner-API ausführt. Die Klempner-API empfängt SQL und gibt einen R data.frame zurück. Alle Daten werden als R-Objekte (anstelle von JSON) serialisiert, um Eckfälle einfacher handhaben zu können. Darüber hinaus ermöglicht die Serialisierung von R-Objekten die Rückgabe des R-Fehlers oder der R-Nachrichten, falls vorhanden.
  2. Client: Schreiben Sie eine Wrapper-Funktion, um httr zu verwenden, um die bereitgestellte Plumber-API zu verwenden. Diese Wrapper-Funktion verwendet die HTTP-Methode, um die SQL-Abfragedaten von der API oder gegebenenfalls Fehlermeldungen abzurufen. Sie können die Wrapper-Funktion über ein einfaches R-Skript oder ein internes R-Paket verteilen.

Ich persönlich bevorzuge diese Methode, da ich fast immer einen Wrapper verwende, um SQL-Daten zu erhalten (da ich eine Verbindung zu mehreren verschiedenen Datenbanken herstellen muss und die korrekte Handhabung der Kodierung / Zeitzone / Datumsdatentyp nicht so einfach ist).

Ich hoffe, dies ist hilfreich für jeden, der mit ähnlichen Fällen wie mir konfrontiert ist.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen