6

問題数百の sidekiq バックグラウンド プロセスを実行する Rails アプリケーションがあります。それらはすべて 250 の接続を提供することに満足していない PostgreSQL データベースに接続します - それは可能ですが、すべての sidekiq プロセスが誤ってデータベースにクエリを送信すると、それは崩壊します。

オプション 1データベースの前に pgBouncer を追加することを考えていましたが、search_pathどの「国」(PostgreSQL スキーマ) を決定するために各ジョブ処理の開始時に を設定するかに大きく依存しているため、現在はトランザクション モードを使用できません。 (アパートメントジェム)に取り組む。この場合、セッション ベースの接続プーリング モードを使用する必要があります。ただし、これは、私の知る限り、各ジョブの処理後に接続を切断し、接続をプールに解放する必要があり、それはパフォーマンス面で非常にコストがかかりますよね? 私は何かを見逃していますか?

オプション 2アプリケーション層ベースの接続プールを使用することもオプションですが、sidekiq を使用して PostgreSQL でそれを行う方法がよくわかりません。

オプション 3私が思いもよらなかったことはありますか?

4

2 に答える 2

4

オプション 1: そのとおりです。セッションを切断して再接続する必要があり、オーバーヘッドが追加されます。どれだけのコストがかかるかは、アクセス パターンに依存します。つまり、接続/TCP ハンドシェイクなどの総作業量のどの部分が実行され、どのような遅延が必要になるかです。ベンチマークする価値は間違いなくありますが、接続が短命の場合、オーバーヘッドが非常に顕著になります。

オプション 2/3: sidekiq ジョブをレート制限またはスロットルできます。これに取り組むいくつかのプロジェクトがここにあります...

キュー制限

  • Sidekiq Limit Fetch : 指定されたキューを同時に実行できるワーカーの数を制限します。キューを一時停止し、キューの分散サイズを動的に変更できます。また、キューごとのアクティブなワーカーの数も追跡します。グローバル モード (複数の sidekiq プロセス) をサポートします。追加のブロッキング キュー モードがあります。
  • Sidekiq Throttler : Sidekiq::Throttler は、Sidekiq のミドルウェアであり、ワーカーごとにジョブの実行をレート制限する機能を追加します。
  • sidekiq-rate-limiter : Redis がサポートする、ジョブ処理のワーカーごとのレート制限。
  • Sidekiq::Throttled : 同時実行性としきい値の調整。

上記はここから入手しました

https://github.com/mperham/sidekiq/wiki/Related-Projects

アプリケーションでプロセスごとに接続が必要で、より多くのスレッドが接続を使用できる場所でアプリケーションを分割できない場合、それは pgBouncer またはアプリケーション ベースの接続プーリングです。接続プーリングは、DB を保存するために、なんらかの方法でアプリを調整または制限します。

于 2016-04-20T08:13:14.540 に答える
-1

Sidekiq は、ワーカー スレッドごとに 1 つの接続のみを必要とします。同時実行数を妥当な値、たとえば 10 ~ 25 に設定している場合、250 の同時データベース接続を使用するべきではないと思います。実行しているワーカー プロセスの数と、それらの同時実行数は?

また、そのページでは、同時実行性を高く設定している場合でも、そのプロセス内のスレッドによって共有される接続プールを作成できることがわかります。

于 2016-03-19T03:24:38.187 に答える