4

空間画像データのタイル サーバーと同様に、Django ベースの Web アプリケーションでオンザフライで生成された多くの画像を表示したいと考えています (画像のマージ、色の変更など)。1 つのクライアントが短時間で多数 (>100) のイメージを簡単に要求できるため、Web サーバー (Apache + mod_wsgi) を簡単にダウンさせることができます。

したがって、私は別の方法を探しています。既に Celery を使用しているため、この画像処理を非同期で行い、生成されたデータをクライアントにプッシュすることをお勧めします。それを始めるために、WSGIサーバーをgeventに切り替え、Apacheをプロキシとして使用しました。ただし、まだプッシュ機能を動作させることができておらず、とにかくこれが正しい方向であるかどうかはよくわかりません。それに基づいて、私は3つの質問があります:

  1. これ (Celery、gevent、Socket.IO) は、多くのクライアントが Web サーバーをダウンさせることなくアプリケーションを使用できるようにする賢明な方法だと思いますか? 代替案はありますか?

  2. 画像処理をCeleryに任せて、終わったら画像データをブラウザにプッシュさせたら、Apache経由で接続されませんよね?

  3. クライアントへの何らかのプッシュが使用されている場合、1 つの接続を使用するか、イメージごとに 1 つの接続を使用する方がよいでしょうか (完了したら閉じます)。

バックグラウンド:

私が取り組んでいる Django アプリケーションでは、ユーザーは非常に大きな画像を表示できます。これは、前に大きな画像を並べて表示し、現在関連するタイルのみをグリッドでユーザーに表示することによって行われます。私が理解していることから、これはマッピングおよび空間画像データ (OpenStreetMap など) の分野でデータを提供する標準的な方法です。しかし、マッピング データとは異なり、Z にはユーザーがスクロールできる多くのスライス (生物学的画像) もあります。

タイルが静的に提供される場合、これはすべて正常に機能します。これらのタイルをオンザフライで生成するオプションを追加しました。さまざまな画像がマージされ、色が修正されます。これは機能しますが、1 つの画像が生成されるのに約 0.1 秒かかるため、Web サーバーの負荷が高くなります。現在、Apache と mod_wsgi (WSGIRestrictedEmbedded On) を使用しており、サーバーを簡単にダウンさせることができます。画像スタックを参照するだけで、Web サーバーがハングアップします。すでに MaxClients などを調整しようとして、KeepAlive をオフにしました。また、mod_wsgi のさまざまなスレッド/プロセスの組み合わせも試しました。ただし、複数のユーザーが使用できるようにするのに十分なものはありませんでした。したがって、Comet/WebSocket の方法がここで役立つと考えました。

4

3 に答える 3

1

タイルが静的に提供される場合、これはすべて正常に機能します。これらのタイルをオンザフライで生成するオプションを追加しました。さまざまな画像がマージされ、色が修正されます。これは機能しますが、1 つの画像が生成されるのに約 0.1 秒かかるため、Web サーバーの負荷が高くなります。

重労働を行うのに十分な数のバックエンド サーバーを提供する場合、必要な数の要求を多重化 (およびキャッシュ!) するフロントエンド サーバー (NginX など) に画像要求が送信されるロード バランサーが必要です。

これは、Amazon 分散コンピューティングの典型的なケースのように見えます。タイルを S3 ストレージ (または、EBS 経由の NFS) に保存できます。すべての画像操作サーバーは、単一の画像リポジトリからデータを取得します。

最初は、Web アプリケーションと画像操作サーバーの 1 つのインスタンスの両方を同じマシン上に置くことができます。しかし、基本的にあなたのプロセスは3つです:

  • 画像 URL を計算する Web サービス (操作を URL のパラメーターとしてエンコードする方法が必要です。そうしないと、Cookie とセッション ストレージを使用する必要があり、面倒です)
  • 「画像式」を受け取り、JPEGタイルを提供する画像サーバー
  • 大きな画像または単一の元のタイルへのアクセスを可能にするファイル サーバー

私はいくつかのそのようなアーキテクチャで働いてきました。そこでは、画像レイヤーが単一の画像ファイルに保存されていました (たとえば、5 つのズーム レベル、FIR から UV までの各 15 チャネル、合計 75 の「画像」が一辺に最大 100K ピクセル、クライアントは、「ズーム レベル 2、赤チャネルに加えて、UV-1 チャネルと緑の差の 2 倍、X=157、Y=195 から X=167、Y=205 までのタイル」を要求できます)。

于 2012-09-12T14:24:59.783 に答える
0

Web サーバーをダウンさせるために必要なユーザーが 1 人だけの場合、問題は apache や mod_wsgi ではありません。

まず、タイリング ルーチンを最適化し、実際にユーザーが実際に見るデータのみを配信しているかどうかを確認する必要があります。

その後、より高速な CPU、より多くの RAM、SSD、および積極的なキャッシングにより、パフォーマンスが向上します。

最後に、別の Web サーバーを使用することで追加のポイントが得られる可能性がありますが、あまり期待しないでください。

于 2012-09-12T14:06:28.487 に答える