質問

を使用しております シャープジップリブ. 。サーバー上でファイルを解凍し、別のフォルダーに配置できる必要があります。ファイルを解凍するリクエストは、Web ページ上のユーザーから行われます。ファイルが大きい場合は解凍に時間がかかると思います。 ユーザーがサイトの閲覧を続けるために、解凍が完了するのを待っている間ページに留まることは望ましくありません。

このシナリオに対処する良い方法は何ですか:ファイルの解凍を処理する別のスレッドをスピンオフするか、ファイルを解凍する別の Windows サービスを作成するか、それとも ....

別のスレッドまたはウィンドウ サービスを介して実行する場合の長所と短所は何ですか?

役に立ちましたか?

解決

別プロセスの利点
別のプロセスで行われる作業は、時間的にも物理的にも、セキュリティの観点からもページ フローから切り離すことができます。時間内に分離:選択した場合は、「後で」負荷が低くなり、CPU サイクルに余裕ができるまで、解凍リクエストをバッファリングできます。

物理的にも切り離されています。大規模なシステムの場合、複数のワーカー プロセスを複数の独立したマシンにデプロイして、この作業を非同期的に実行することができ、その処理層は Web ページの処理とは独立して拡張できます。どのようなシステムにもボトルネックは存在します。分散導入の利点は、別々のワークロードを個別に拡張してボトルネックをより効率的に排除できることです。

ただし、この後者の利点は、非常に大規模なシステムでのみ役立つと思います。ほとんどの場合、独立した物理スケーリング レイヤーの恩恵を受けるほどのトランザクション ボリュームは得られません。これは次のことに限らず当てはまります あなたの ただし、全ワークロードの 98% を占めます。YAGNI の原則はスケーラビリティにも当てはまります。

物理的な分離により、異なるワークロード (ページ フローと zip 解凍) を独立して開発することもできます。言い換えれば、作業項目が単純な「ファイルの解凍」ではなく、途中で複数のステップと意思決定ポイントを伴う、より複雑なものであると仮定します。ワークプロセッサを別のプロセスで設計すると、ページフローをワークアイテムの処理とは独立して構築およびテストできます。これは、独立して進化する必要がある場合に大きな利点となります。

この物理的な切り離しは、作業項目が別のチャネル経由で到着する場合にも役立ちます。作業項目が到着する唯一の方法が Web ページではないと仮定します。FTP ドロップ、Web サービス、または作業項目を受信できるマシン監視の電子メール ボックスがあるとします。その場合、ワークアイテムの処理を Web ページの処理から物理的に切り離すことが合理的です。

最後に、これらは実行時のセキュリティにおいて分離されます。一部の Web アプリケーション サーバーの展開では、セキュリティ ルールにより Web サーバーによるディスクへの書き込みが禁止されています。Web サーバーには書き込み可能なディスク ストレージがありません。別の非同期ワーカー プロセスは、十分なストレージを備えたネットワークの別の部分にデプロイできますが、別の一連のセキュリティ要件によって制限される可能性があります。これはあなたに当てはまるかもしれないし、当てはまらないかもしれません。

スレッド処理のメリット
作業を別のスレッドで実行する利点は、はるかに簡単であることです。デカップリングは複雑さとコストをもたらします。作業を別のスレッドで管理すると、別のプロセス (場合によっては別のマシン) の管理に伴う運用上のオーバーヘッドが発生しません。追加の構成や新しいビルド/展開手順は必要ありません。追加のバックアップはありません。追加のセキュリティ ID を維持する必要はありません。(スレッドのディスパッチを超えて) 通信のやり取りを心配する必要はありません。

作業項目の処理をもう少し洗練して、オプションで zip ファイルが十分小さいと思われるときに作業を同期的に実行することもできます。応答時間のしきい値を 4 秒に設定するとします。それを超えると非同期ワークロードが必要になり、4 秒未満では「インライン」で実行されます。もちろん、zip ファイルにどれくらいの時間がかかるかを正確に知ることはできませんが、ファイルのサイズに基づいて適切なヒューリスティックを確立することはできます。この最適化は、非同期作業に外部プロセスを使用する場合でも、別のスレッドを使用する場合でも利用できますが、正直に言うと、別のスレッドを使用する場合の最適化を利用する方が簡単です。追加の作業が少なくなります。したがって、これはスレッド化アプローチの利点です。

非差別化要因
作業項目ステータスの通知に AJAX ポーリング メカニズムを使用することを選択した場合、それは別のプロセスまたは別のスレッドで機能します。作業項目の追跡をどのように行うのかわかりませんが、特定の作業項目 (zip ファイル?) が完了したら、どこかのレコード (ファイル システム内のファイル、データベース内のテーブル) を更新すると思います。 。この更新は、同じプロセス内のスレッドによって行われるか、別のプロセス (Windows サービス) によって行われるかに関係なく発生します。したがって、ポーリングする AJAX クライアントは、アーキテクチャの決定に関係なく、どのような場合でもデータベース テーブルまたはファイル システムをチェックするだけで、同じ方法で作業項目のステータスの通知を受け取ります。

決め方
この理論は興味深いものですが、実際の運用上の制約がなければ最終的には役に立ちません。

ワークロードは、現実世界の重要な項目の 1 つです。これらの zip ファイルの大きさについては言及されていませんが、おそらく「通常のサイズ」だと思います。4GB以下くらいかな。通常、このような zip ファイルをラップトップで解凍するには 20 ~ 60 秒かかりますが、実際のストレージ システムと高速な CPU を備えたサーバーでは、当然、時間は短くなります。また、トランザクションの同時実行性、つまりこれらの処理が一度にどれだけ発生するかについても説明していません。同時実行性はそれほど高くないと思います。

その場合、私はより単純な非同期スレッドのアプローチに固執します。これは ASP.NET で実行されており、おそらくサーバー OS 上で実行されていると思います。CLR は優れたスレッド管理を備えており、ASP.NET は優れたプロセス スケールアウト機能を備えています。そのため、ワークロードが高い場合でも、多大な構成作業を行わなくても、良好な CPU 使用率と拡張性が得られます。

作業項目の実行時間が長く、たとえば数時間または数日程度で、その時間が予測不可能 (在庫注文の終了など) だった場合、その場合は非同期プロセスを使用することになります。同時実行数が 1 秒あたり数千件であるか、非常に予測不可能な場合も、別のプロセスを推奨します。障害モードが十分に複雑な場合は、それを管理するためだけに作業項目を別のプロセスに含める必要があるかもしれません。作業項目の処理が定期的に変更される可能性がある場合 (ビジネス状況の変化に応じて追加のステップを追加する場合)、それを別のプロセスに含める必要があるかもしれません。

しかし、あなたの場合、zip ファイルを解凍する場合、これらのことはどれも当てはまらないようです。

他のヒント

別スレッドの欠点は次のとおりです。

  1. ページが終了したときに、他のスレッドが何をしているのかを簡単に通知する方法はありません。
  2. アプリケーションはいつでも再起動できます。
  3. ユーザーがページを 2 回続けて送信すると、誤ってプロセスが 2 回開始されてしまう可能性があります。
  4. マルチスレッドコードはデバッグが困難です。

別のスレッドの利点は次のとおりです。

  1. コードの削減
  2. 解凍完了時にユーザーに通知する必要がない場合は、起動して忘れるのが簡単です。
  3. インストールするための追加の作業はありません。

Windows サービスの長所と短所は、上記とはほぼ逆になります。

個人的に私は、このような状態を監視するために使用することができ解凍するhandleを返すよう、進歩のためのそれらの間のメッセージングを使用してWindowsサービスのルートを下ると思います。

しかし、あなたはまた、私はおそらくそれを行うためのスレッドをスピンオフし、それは喜んで実行し、ページに戻ります考えることができます。

私はあなたが簡単にAJAX対応ページからポーリングすることができる非同期プロセスを使用します。完了すると、ページのAJAXの部分は、ユーザーが同期完了するのプロセスを待っている間、あなたが正常に提示していると思います。

の詳細を提示することができます
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top