3

PageLoadモバイルクライアントアプリからzipファイルを保存するリクエストを基本的に受け入れる単純なWebアプリケーションモジュールがあります。

今、私がやりたいことは、ファイルを解凍し、その中のファイルを読み取り、さらに処理することです..データベースへのエントリの作成を含みます。

更新: zip ファイルとそのコンテンツのサイズはかなり小さくなるため、サーバーに大きな負荷がかかることはありません。

更新 2: IIS が要求をキューに入れるタイミング(グローバル/アプリ レベル)について読みました。つまり、複雑な要求処理メカニズムを実装する必要がなく、IIS がアプリ自体を処理できるということですか?

更新 3:ダウンロードした zip の処理のオフロードを探しています。これは、(パフォーマンスの観点から) オーバーヘッドを最小限に抑えるためだけでなくtable-locking、ファイルが処理され、レコードが同じテーブルに更新されるときの問題を回避するためでもあります。 . 複数のデバイスがページを要求し、バックグラウンド タスク処理データベースが並行して更新されるシナリオでは、例外が発生します。

今のところ、私は2つの解決策に焦点を合わせています:

  • 並行/メッセージ キューを実装するには
  • ファイル処理コードを別のツールに実装し、サーバーでジョブをスケジュールして、未処理のファイルをチェックし、それらを順次処理します。

Queuing Mechanism構成にあまり依存していないように見えるので、私が実装しようとする傾向があります。v/s サーバー側でジョブ/スケジュールを手動で構成します。

それで、あなたはこの目的のために私に何を勧めますか?

さらに、サーバー側で zip ファイルが要求されて保存された後、クライアントとサーバー側の接続が解放されます。私のIISに負担をかけるつもりはありません。

数百のクライアントが同時にページを要求していると想像してください。

私は実際にはどちらも使用したことがないので、サンプルやハウツーがあればさらに高く評価されます.

4

3 に答える 3

4

TPL と Rx 拡張機能をお勧めします。解凍したファイル リストを監視可能なコレクションにし、アイテムごとに非同期で新しいタスクを開始します。

于 2013-02-04T07:51:08.960 に答える
1

キューシステムをお勧めします。

ファイルを受け取ったら、パスをスレッド同期キューに保存します。一方、バックグラウンドワーカー(またはできれば別のマシン)は、このキューで新しいファイルをチェックし、エントリをデキューして処理します。

このようにして、未知の量のスレッド(すべてのzipファイル)を起動せず、1つの場所でzipファイルを処理できます。このようにして、負荷が重くなりすぎたときに、郵便番号を別のマシンに簡単に移動することもできます。共通のキューにアクセスする必要があります。

最も簡単なのは、おそらく-objectでstaticQueueを使用することです。lock実装が最も簡単で、外部リソースを必要としません。ただし、これにより、アプリケーションのリサイクル時にキューが失われます。

zipファイルを失うことは選択肢ではないとおっしゃいましたが、外部リソースに依存したくない場合は、このアプローチは最適ではありません。負荷によっては、外部リソースを利用する価値がある場合があります。つまり、zipファイルを別のマシンの共通ストレージにアップロードし、別のマシンのキューにメッセージを追加します。

ローカルキューの例を次に示します。

ConcurrentQueue<string> queue = new ConcurrentQueue<string>();

void GotNewZip(string pathToZip)
{
    queue.Enqueue(pathToZip); // Added a new work item to the queue
}

void MethodCalledByWorker()
{
    while (true)
    {
        if (queue.IsEmpty)
        {
            // Supposedly no work to be done, wait a few seconds and check again (new iteration)
            Thread.Sleep(TimeSpan.FromSeconds(5));
            continue;
        }

        string pathToZip;
        if (queue.TryDequeue(out pathToZip)) // If TryDeqeue returns false, another thread dequeue the last element already
        {
            HandleZipFile(pathToZip);
        }
    }
}

これは非常に大まかな例です。zipが到着するたびに、キューにパスを追加します。一方、バックグラウンドワーカー(または複数の例のスレッドセーフ)は、次々にzipを処理し、キューからパスを取得します。zipファイルは到着順に処理されます。

その間、アプリケーションがリサイクルされないようにする必要があります。ただし、ローカルマシンにあるすべてのリソースの場合はそうです。マシンがクラッシュすると、それらのリソースは失われます。

于 2013-02-04T07:21:43.687 に答える