ASP.NET でメンテナンス プロセスを開始するためのベスト プラクティスは何ですか [終了]
-
09-06-2019 - |
質問
ASP.NET アプリケーションの場合、メンテナンス プロセスを定期的に (毎日、時間ごとなど) 実行する必要があります。
サーバー上のスケジュールされたタスクなどの外部プロセスに依存せずにこれを達成する最善の方法は何ですか(サーバー - 共有ホスティング環境にアクセスできないと仮定します)。
解決
StackOverflow がそれを行う方法は次のとおりです。
private static CacheItemRemovedCallback OnCacheRemove = null;
protected void Application_Start(object sender, EventArgs e)
{
AddTask("DoStuff", 60);
}
private void AddTask(string name, int seconds)
{
OnCacheRemove = new CacheItemRemovedCallback(CacheItemRemoved);
HttpRuntime.Cache.Insert(name, seconds, null,
DateTime.Now.AddSeconds(seconds), Cache.NoSlidingExpiration,
CacheItemPriority.NotRemovable, OnCacheRemove);
}
public void CacheItemRemoved(string k, object v, CacheItemRemovedReason r)
{
// do stuff here if it matches our taskname, like WebRequest
// re-add our task so it recurs
AddTask(k, Convert.ToInt32(v));
}
詳細: http://blog.stackoverflow.com/2008/07/easy-background-tasks-in-aspnet/
他のヒント
スケジュールされた時間に実行する必要はないが、「たまに」クリーンアップする必要がある場合、これを行う 1 つの方法は、Global.asax Session_OnEnd() にランダムなデータを作成する関数を作成することです。 1 ~ 100 の数値を入力し、数値が 50 の場合は、メンテナンス タスクを実行します。
もちろん、「100」を減らしてタスクをより頻繁に実行することもできます。
また、「スケジュールされたジョブを実行するために ASP.NET を使用して Windows サービスをシミュレートする」というタイトルの記事もあります。 http://www.codeproject.com/aspnet/ASPNETService.asp 期限切れキャッシュを使用してタイマーをシミュレートします。ホストされている任意のサイトで実行できると主張しています。
最後の方法を使用している場合は、このテクニックに関する投稿のコメントをお読みください。
実行中のタスクの長さに本当に注意する必要があります。すべての新しいタスクは新しいワーカーのスレッドであり、それらの数は限られています - それはマネージドスレッドプールからスレッドを「借りる」ためです。
フレームワークのv3.5から始まり、スレッドの最大数は25から250に10倍増加しました。しかし、今では彼らに対数起動がありますので、より多くのスレッドを排除するにつれて、それは彼らとは辛くなります。管理されたスレッドプールで利用可能なスレッドがなくなった場合、応答時間は屋根を通過します。
ここで本当に書いているのは、メッセージング/キューイングシステムです。
キャッシュを更新するなどのことをしている場合は、常に新しいタスクを開始します。セカンダリHTTPリソースや何らかの集中的なデータベース作業をダウンロードするなどのことを行っている場合は、Windowsサービスを作成し、毎回「噛む」量をさらに制御できるキューを使用します。
キャッシュ ソリューションは単純な場合には機能しますが、スケジュールのニーズが変更されると、運が悪くなるでしょう。代わりに、次を使用できます。 Quartz.NET, 、人気のある Java フレームワークの移植版 石英, 、非常に柔軟です。
StackOverflow がこれを行う方法は間違いなく独特ですが、これを監視することをお勧めします。 質問 また、関連するので。
これは外部プロセスであり、どの程度信頼できるかはわかりませんが、常に稼働していることがわかっているマシン上で同様のものを設定することはできます。 www.webcron.org.
基本的には、要求したスケジュールで要求したページをヒットします。
基本的に、定期的なスケジュールでページにアクセスすると、メンテナンス タスクが開始されます。
ジェフとジョエルは、最近のポッドキャストでも別の方法で同様のことを行うことについて話し合いました。