nginx + gunicorn + djangoの上に実装されたWebサービスで作業しています。クライアントはスマートフォンアプリケーションです。アプリケーションは、外部API(Facebook、Amazon S3 ...)を長時間呼び出す必要があります。そのため、サーバーは単にジョブサーバー(Celeryを使用してRedisを使用)にジョブをキューイングします。nginx/gunicorn/djangoウェブアーキテクチャで長時間実行されるHTTP接続の効率的な処理
サーバーがジョブをキューに入れたら、すぐに戻り、HTTP接続が閉じられます。これは正常に動作し、サーバーは非常に高い負荷を維持することができます。
client server job server
. | |
. | |
|------HTTP request----->| |
| |--------queue job------>|
|<--------close----------| |
. | |
. | |
しかし、場合によっては、クライアントはジョブが終了するとすぐに結果を取得する必要があります。残念ながら、HTTP接続が閉じられると、サーバーがクライアントに接続する方法はありません。 1つの解決策は、ジョブが完了するまで、数秒ごとにサーバーをポーリングするクライアント・アプリケーションに依存することです。可能であれば、このソリューションを避けたいのは、サービスの反応性を妨げ、また多くの不要なポーリング要求をサーバーにロードするためです。
要するに、私は何もしません(何もしないで、TCP接続を維持するために空白を毎回送信することを除いて、ちょうどlike Amazon S3 does)、ジョブが完了するまでサーバーは結果を返します。 、
client server job server
. | |
. | |
|------HTTP request----->| |
| |--------queue job------>|
|<------keep-alive-------| |
| [...] | |
|<------keep-alive-------| |
| |<--------result---------|
|<----result + close-----| |
. | |
. | |
は、どのように私はそれがまだそうではありません(サーバーが非常に高い負荷がかかっていると仮定すると、効率的な方法で実行時間の長いHTTP接続を実装することができますが、目標は、可能な限り最高の負荷を維持できるようにするには1秒あたり数百または数千の要求を伴う)?
実際のジョブを他のサーバーにオフロードすると、サーバーのCPU使用率を低く抑えることができますが、プロセスが重複してサーバーのすべてのRAMを使用したり、
おそらく、ほとんどの場合、nginxとgunicornを適切に設定する必要があります。私はちょっと読んだasync workers based on greenlets in gunicorn:ドキュメントは、非同期ワーカーが "アプリケーション(つまり、外部のWebサービス)、長い呼び出しをブロックすることによって使用されていると言う"、これは完璧な音。また、「」と表示されます。一般的に、アプリケーションは変更なしでこれらのワーカークラスを利用できるはずです "。これはすばらしいですね。これに関するフィードバック?
アドバイスいただきありがとうございます。
あなたはdjangoのAJAX 'long-polling'ソリューションを調査しましたか?それは基本的に同じことのようです。 – dgel
はい、そうです、おそらく同じことでしょう。 AJAXはクライアント側のjavascriptを意味し、Webブラウザに関するものです。私の場合、クライアントはソフトフォンアプリケーションです。しかし、サーバー側はおそらくほぼ同じ、優れたアイデアです。 – MiniQuark