CPU、メモリ使用量、スレッドプール使用量-ASP NET Core IDが確認されていないメールユーザーの削除処理-アプリ内または別のアプリ内?

Aug 19 2020

より適切な解決策は何か疑問に思っています。確認メールを送信してから7日間など、未確認の登録ユーザーを確認・削除するロボットを実装する必要があります。(ユーザーが自分のアカウントを確認しない場合は、データベースからユーザーを削除したいと思います)。私は3つの方法について考えました:

  1. ASP NET Coreアプリにデリゲートを直接実装し、24時間スリープのループで非同期タスクとして実行します。
  2. 24時間のスリープでループで実行されるコンソールアプリを作成します
  3. サードパーティのソフトウェア(CronやTaskSchedulerなど)によって定期的に起動されるコンソールアプリを作成します

これらの方法のうち、CPUとメモリの使用量への影響が最も少ないのはどれですか?
また、スレッドプールの使用量には制限があり、ロボットが多いほど、ASPネットサイトにアクセスしようとするユーザーのスレッドが少なくなります。正しいですか?
そして私の最後の質問> Thread.Sleepをそんなに長い間するのは良い考えですか?何かが私にそれが本当にそうではないことを教えてくれます。一方、それは数ヶ月、おそらく数年にわたって実行されるASPです。

とにかく、私はすべてを1つのアプリにまとめるというビジョンが大好きです(1つのファイル内で構成でき、すべてを一度に開始できます)。一方で、何かが私にそれは超素晴らしいアイデアではないことを教えてくれます。

回答

2 JonasH Aug 21 2020 at 18:48

タスクが実際に実行されているとき、メモリとプロセスの使用量は、タスクに必要なものによって支配され、各メソッドで同等である必要があります。したがって、実行されていないときのリソース使用量を確認する方が興味深いはずです。

  1. 処理中、タイマー(またはawait Task.Delay(..)ループ)を使用

これには、タイマーまたは非同期ステートマシン用のメモリと、コード用の追加メモリのみが必要です。これはかなり小さく、おそらく数キロバイトになるはずです。アイドル状態の間、プロセッサ時間やスレッドは使用されません。これは、大きなデータ構造を保持していないことを前提としています。

  1. 別の永続的なコンソールプロセスで

これは、.Netランタイム用に数MBのメモリを使用し、コードとデータ用に追加のメモリを使用します。実際には、コンピュータのメモリが不足した場合、メモリがディスクにページングされることを期待します。アイドル状態の間、プロセッサ時間は使用されません。

  1. 別のスケジュールされたコンソールプロセスで

これはスケジューラオブジェクトのメモリのみを消費するため、最小限に抑える必要があります。明らかに、アイドル状態の間はプロセッサ時間やスレッドは使用されません。

概要

別のプロセスをスケジュールすると、使用するリソースが最も少なくなります。ただし、すべてのメソッドは、アイドル状態のときにかなりわずかな量のリソースを使用する必要があります。したがって、保守や展開が最も簡単なものなど、他の基準に基づいて選択する必要があると私は主張します。

スレッドプールは、必要に応じてより多くのスレッドを割り当てます。スレッドは一般に、実際に何かをしているとき(つまり、のawait task代わりに使用するとき)にのみ使用するtask.Wait()必要があり、ハードウェアスレッドよりもはるかに多くのスレッドプールスレッドがあります。通常よりもはるかに多くのスレッドを観察した場合にのみ、これについて心配します。

Thread.Sleepできれば避けたいと思います。タイマーまたはawait Task.Delay通常はより適切です。