アプリ サーバーをスケールアップして、1 分あたり 20,000 を超えるリクエストを処理しようとしています。
リクエストのストレス テストを行ったところ、ほとんどのリクエストは 20,000 RPM 以上を簡単に処理できました。
ただし、外部 HTTP 要求 (Facebook ログインなど) を行う必要がある要求は、サーバーをクロール (3,000 RPM) にします。
現在の環境の制限を概念的に理解しています。サーバーごとに 4 つのユニコーン ワーカーを持つ 3 つの負荷分散サーバーは、すべてのサーバーが HTTP 要求を待機している場合でも、一度に 12 の要求しか処理できません。
これをより適切にスケーリングするためのオプションは何ですか? 一度にもっと多くの接続を処理したい。
私が理解している可能な解決策:
総当たり: より多くのユニコーン ワーカー (より多くの RAM) とより多くのサーバーを使用します。
すべてのブロッキング操作をバックグラウンド/ワーカー プロセスにプッシュして、Web プロセスを解放します。クライアントは、要求がいつ完了したかを確認するために、定期的にポーリングする必要があります。
プロセスの代わりにスレッドを使用できるように、Unicorn の代わりに Puma (およびおそらく MRI の Rubinius) に移行します。
基本的に、私が探しているのは、サーバーごとの接続数を増やすことができるように、単一のワーカーが処理できるブロック/キューに入れられたリクエストの数を増やすより良い方法はありますか?
たとえば、EventMachine で Thin を使用するという議論を聞いたことがあります。これにより、Rails ワーカーが現在作業中の Web リクエストを停止し (外部サーバーで待機しているため)、待機中に別のリクエストを受け取る可能性が開けますか? もしそうなら、これはユニコーンやプーマと比較してパフォーマンスを追求する価値のある手段ですか? (アプリのランタイム アクティビティに強く依存しますか?)