Shinyproxy: ShinyProxyの下で光沢のあるアプリ間でデータベース接続プールを共有する方法

作成日 2020年10月01日  ·  8コメント  ·  ソース: openanalytics/shinyproxy

私の練習では、多くの光沢のあるアプリは、ホストにインストールされているPostgresqlDBにアクセスする必要があります。 プールパッケージを使用してPostgresqlの接続プールを取得し、他のアプリで共有されるグローバル変数に設定します。 しかし、新しいユーザーがアプリをトリガーするたびに、Postgresqlの新しい接続が取得されます。 あまりにも多くの同時ユーザーが光沢のあるアプリを使用すると、Postgresqlがクラッシュするのではないかと心配しています。 このセセナリオの解決策はありますか?

以下のURLとしてのプールパッケージの紹介。 https://shiny.rstudio.com/articles/pool-basics.html

ある専門家がpqbouncerの使用を勧めていますが、ShinyProxyに実装する方法がわかりません。アドバイスや解決策はありますか?

どうもありがとう。

question

最も参考になるコメント

私の2セントを追加するだけです。

上でコメントしたように、実際には似たようなサービスをデプロイしましたが、PlumberAPIを使用しました。

これはもう少し複雑で、使用するにはラッパー関数を作成する必要があります。 ただし、PostgreSQLに限らず、複数の異なるデータベースに接続できます。

私のやり方:

  1. サーバー:PlumberAPIを実行するdocker-composeサービスをセットアップします。 Plumber APIはSQLを受け取り、Rdata.frameを提供します。 コーナーケースをより簡単に処理するために、すべてのデータは(JSONではなく)Rオブジェクトとしてシリアル化されます。 さらに、Rオブジェクトをシリアル化すると、Rエラーまたはメッセージ(存在する場合)を返すことができます。
  2. クライアント:デプロイされたPlumber APIを使用するためにhttrを使用するラッパー関数を記述します。 このラッパー関数は、HTTPメソッドを使用して、APIまたはエラーメッセージ(存在する場合)からSQLクエリデータを取得します。 ラッパー関数は、単純なRスクリプトまたは内部Rパッケージを介して配布できます。

私はほとんどの場合、ラッパーを使用してSQLデータを取得するため、この方法を個人的に好みます(複数の異なるデータベースに接続する必要があり、エンコーディング/タイムゾーン/日付データ型を正しく処理するのはそれほど簡単ではないため)。

これが私のような同様のケースに直面している人にとって役立つことを願っています。

全てのコメント8件

Shinyproxyが光沢のあるアプリでデータベース接続プール(postgresql、mysqlなど)をサポートする場合、開発者にとってはるかに便利です。 出来ますか?

これを行うためのネイティブな方法はないと思います。 しかし、回避策はたくさんあります。 考えられる簡単な回避策の1つは、配管工を使用してAPIをデプロイすることです。

@shrektanのおかげで、後で試してみます。

pgbouncerをインストールし、pgbouncerサービスにshiny connectを設定すると、問題が解決します。 どうもありがとう

こんにちは@chienyuchuanあなたが解決策を見つけたと聞いてうれしいです!
したがって、私は今この問題を閉じています。
ShinyProxyで問題が発生した場合は、遠慮なく新しい問題を開いてください。

pgbouncerをインストールし、pgbouncerサービスにshiny connectを設定すると、問題が解決します。 どうもありがとう

@chienyuchuanこんにちは! pgbouncerとの接続に使用するRパッケージを教えてください。

文字列接続の例を教えてください。

pgbouncerをインストールし、pgbouncerサービスにshiny connectを設定すると、問題が解決します。 どうもありがとう

@chienyuchuanこんにちは! pgbouncerとの接続に使用するRパッケージを教えてください。

文字列接続の例を教えてください。

親愛なる@ kuzmenkov111 、私はまだ光沢のあるプールパッケージを使用していますが、pgbouncerに接続します。
/etc/pgbouncer/pgbouncer.iniを編集し、[databases]セクションを入力すると、プールパッケージを使用して[databases]セクションのdbnameとポートに接続するRプログラムを作成できます。

ここにあなたのためのいくつかのリファレンスサイトがあります、あなたがそれから学ぶことができることを願っています...

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

PgBouncerを使用したPostgreSQL接続プール
https://pgdash.io/blog/pgbouncer-connection-pool.html

プールパッケージの使用(基本)
https://shiny.rstudio.com/articles/pool-basics.html

私の2セントを追加するだけです。

上でコメントしたように、実際には似たようなサービスをデプロイしましたが、PlumberAPIを使用しました。

これはもう少し複雑で、使用するにはラッパー関数を作成する必要があります。 ただし、PostgreSQLに限らず、複数の異なるデータベースに接続できます。

私のやり方:

  1. サーバー:PlumberAPIを実行するdocker-composeサービスをセットアップします。 Plumber APIはSQLを受け取り、Rdata.frameを提供します。 コーナーケースをより簡単に処理するために、すべてのデータは(JSONではなく)Rオブジェクトとしてシリアル化されます。 さらに、Rオブジェクトをシリアル化すると、Rエラーまたはメッセージ(存在する場合)を返すことができます。
  2. クライアント:デプロイされたPlumber APIを使用するためにhttrを使用するラッパー関数を記述します。 このラッパー関数は、HTTPメソッドを使用して、APIまたはエラーメッセージ(存在する場合)からSQLクエリデータを取得します。 ラッパー関数は、単純なRスクリプトまたは内部Rパッケージを介して配布できます。

私はほとんどの場合、ラッパーを使用してSQLデータを取得するため、この方法を個人的に好みます(複数の異なるデータベースに接続する必要があり、エンコーディング/タイムゾーン/日付データ型を正しく処理するのはそれほど簡単ではないため)。

これが私のような同様のケースに直面している人にとって役立つことを願っています。

このページは役に立ちましたか?
0 / 5 - 0 評価