2017-10-26 10 views
0

スケーラブルなJavaアプリケーションで接続プールの問題を解決する方法が不思議です。スケーラブルなJava Webアプリケーションでの接続プール

私はHikariCPとJava Webアプリケーションを設定(最大プールサイズは20)とPosgtreSQL最大許可された接続100

とそして今、私は私のWebアプリ(どんなに)のスケーラビリティのアプローチを実装する必要があり想像オートスケーリングでも終了します。だから、最終的にどれくらいのWebアプリケーションの複製があるか分からず、(クラスタワークロードなどの理由で)動的に変更される可能性があります。

しかし、問題があります。 5つ以上のWebアプリケーションレプリカを作成すると、合計接続数が最大許容接続数を超えます。

この問題を解決するベストプラクティスはありますか(許容最大接続数が増えているかプールサイズが減っていることは明白です)。

ありがとうございます。

+0

ボトルネックがどこにあるかを測定する必要があります。マシンあたり20個の接続が多すぎるのでしょうか? PosgtreSQLへの100以上の接続を開くことができますか?たぶんあなたはバッファ(キュー)を持っているべきですし、リクエストを抑制するためにキューに更新クエリを提出し、おそらくあなたはスケーラビリティの異なる別のテクノロジを必要とします。 – alfasin

+0

@alfasin良い点は、今のところ私は可能なオプションを研究しています。また、スケーラブルなアプリケーションで接続プールを構成するためのベストプラクティスがあるのだろうかと思います。 –

+0

データベースを複製していますが、これで心配はありませんか?私はwebappごとに別々のdbを意味するわけではありませんが、スケーリング時にボトルネックになるでしょう。 – Kayaman

答えて

0

ウェブアプリケーションでオーケストレーターが必要です。それはスケーリング・イン・アウトを担当し、100の制限を超えないように接続を管理します。トラフィックに応じて接続をオープン・クローズします。

しかし、私の推奨では、スケーラビリティとパフォーマンスに適したソリューションであるno-SQLデータベースへの移行を考慮する必要があります。

+0

返信いただきありがとうございます。私たちはオーケストレーターとしてkubernetesを使用しており、no-SQLデータベースへの移行は選択肢ではありません(複雑なSQLクエリと密接に結びついています)。この文脈で問題を解決する何かを提案できますか? –

+0

スケーラビリティに関する技術要件があります。このコンセプトは、データベースに大きく依存しています。それにもかかわらず、データベースでもスケーラビリティを使用できます。ここをクリックしてください:https://wiki.postgresql.org/wiki/Replication,_Clustering,_and_Connection_Pooling –

0

あなたのDBとの接続が100に制限されている限り、あなたが何をしていても、それは縮尺通りではありません。

これは、2つの既知のトリックを適用することで、パフォーマンスを最適化して「絞り出す」ことができます。

  1. キャッシュ:それはトレードオフを理解するために(一貫対可用性、スループット対レイテンシーおよびなど)が重要ですあなたが特定のselectクエリを予想することができます場合は、からも、多分(オフラインで計算することができますレプリカ?)、結果をキャッシュします。トレードオフ:ユーザーが最新でない結果

  2. は、バッファリング/を絞るれる可能性があります:すべての更新/挿入がキューに移動し、キューからプルする許可されている唯一のいくつかの労働者がありますDBを更新してください。トレードオフ:可用性は増しますが、更新はすぐには表示されないため、最終的には一貫性があります。

  3. selectも非同期で実行する必要があります。つまり、ユーザーがクエリを送信し、準備ができたらクライアントに戻されます(クライアントは数秒ごとに "ポーリング"を保持できます)。これはコールバックでも実装できます。アップデートを(書き込み)からは、あなたが「読み取り専用」であり、これが読み取りクエリのためのウェブサーバで使用できるレプリカを作成することによって、より高いパフォーマンスを得ることができるようになります読み込み分離することにより

+1

スケーリングは常に多くの接続を必要とするわけではありません。接続数を少なくすると、実際には接続数を増やすほどスループットとパフォーマンスが向上します。 –

+0

@MarkRotteveelより多くのリクエストを処理する必要があり、各リクエストでDBへの少なくとも1回のコールが必要な場合(接続プールからの接続を占有することを意味します)、スケーリングにはさらに多くの接続が必要です。そして、あなたが一度効率限界を超えれば、より多くの接続が性能の低下を意味するという事実についてあなたは正しいです。だから私たちはシステムを測定し調整する必要があります。 – alfasin