1

私たちは、PHP から派生した Java で Web アプリケーションを書き直そうとしています。確かではありませんが、接続プーリングに関して問題が発生する可能性があると思います。アプリケーション自体はマルチテナントであり、「別データベース」と「別スキーマ」を組み合わせたものです。

すべての Postgres データベース サーバー インスタンスに対して、複数のスキーマ (スキーマがテナントである場合) を保持する複数のデータベース (schemax_XXX という名前) が存在する可能性があります。サインアップ時に、次の 2 つのいずれかが発生する可能性があります。

  1. 最大番号の schema_XXX データベースに新しいテナント スキーマが作成されます。
  2. サインアップ プロセスは、データベースが完全に割り当てられていることを確認し、新しい schemas_XXX+1 データベースを作成します。この新しいデータベースで、テナント スキーマが作成されます。

すべてのテナントは、中央レジストリ (Postgres データベースでもあります) を介して認識されます。セッションが確立されると、レジストリはテナントのホスト、データベース、およびスキーマを解決し、その HTTP 要求に対してデータベース セッションが確立されます。

さて、私がここで見ていると思う問題は2つあります。

  1. JDBC 接続プールは、アプリケーションの開始時に定義されます。つまり、起動時にすべてのデータベース (ホスト + データベース) が認識されるということです。これは、サインアップ プロセスと競合します。
  2. 私がこれを書いているとき、約 1000 のデータベースを持つ約 20 のデータベース サーバーがあります (合計で約 100,000 (テナント) スキーマ)。これらの数を考えると、アプリケーションのインスタンスごとに 20*1000 のデータ ソースが必要になります。 m は、すべてのプールも、一度または別の時点で開始されていることを前提としています.プールがどれだけのリソースを割り当てるかはわかりませんが、20,000 プールではかなりの量になるはずです.

では、これに接続プールを使用できると想定することは可能でしょうか?

最初の問題については、JMX をサポートするプールを使用でき、新しい schemas_XXX データベースが作成されたときに新しいデータソースを作成すると思います。より大きな問題は、膨大な量のプールの問題です。このためには、接続が開いていないプールを終了できる (また、オンデマンドでプールを開始できる) ある種のプール マネージャーを使用する必要があると思います。これをサポートするものは見つかりませんでした。

どのようなオプションがありますか? それとも、PgBouncer などのプロセス外接続プールにフォールバックして、現在 PHP で処理しているのと同様に、リクエストごとにプレーンな JDBC 接続を確立する必要がありますか?

4

1 に答える 1

1

いくつかのこと:

  1. 接続プールは、アプリケーションの起動時にのみインスタンス化する必要はありません。いつでも作成または破棄できます。
  2. 明らかに、データベースまたはスキーマごとに 1 つの接続プールを熱心に作成して常に開いておく必要はありません。少なくとも 20000 または 100000 の接続を開いたままにしておく必要があります。
  3. おそらく、特定のテナントの接続のリクエストがクラスター化する傾向がある場合は、プールを遅延して動的にインスタンス化し、しばらくリクエストを処理していない場合はタイムアウト後にそれらを破棄することを検討してください。

幸運を!

于 2014-06-09T07:32:50.130 に答える