2017-10-03 3 views
0

一般的なElixir Webアプリケーションには通常、APIロジックと組み合わせたEctoクエリを持つpostgresqlバックエンドがあります。Ectoを使用した要求ごとのデータベーススレッド

しかしcowboyが要求ごと(アプリのロジックを含む)子GenServerプロセスを作成するので、これはプールcowboy/poolboyを提供しさえして、nは同時要求のためののn psqlのスレッドを生成する効果を持っているのだろうか?

次に、アプリケーションの複数のインスタンスが存在するシナリオ(たとえば、ドッカーコンテナクラスター)に移動すると、既存のデータベーススレッドの総数に余分な要素が追加されませんか?

答えて

4

カウボーイはリクエストごとに新しいErlangプロセスを作成しますが、そのプロセスからEctoクエリを実行すると、ではなく、という新しいデータベース接続が発生します。 Ectoはデータベースへの接続プールを保持します(db_connection/poolboyを使用)。このプールのサイズは、Repoの設定でpool_sizeオプションを使用して設定します。クエリを開始すると、このプールからの接続が借用され、クエリの実行に使用されます。実行が完了すると、接続はプールに戻されます。 Ectoはクエリごとに新しい接続を作成することはありません。プール内で接続が利用できない場合、設定されたタイムアウト(デフォルトは30秒)で接続がチェックインされていない場合は、接続が使用可能になるか、最終的にタイムアウトになります。

+0

ありがとうございます**アプリケーションデータベースのスレッド数は最大** ** ** appインスタンスは** n ** * 'pool_size'です。 – category

+1

はい、そうです。アプリケーションの各インスタンスは 'pool_size'接続を開きます。 – Dogbert

+0

これは問題ではありませんか?つまり、インスタンスの数が制御不能になった場合、n * pool_sizeスレッドは重い負荷のもとでDBを殺すことができます。その場合、Elixirの世界では何をしますか? –

関連する問題