1

IIS-8内に展開されたasp.net mvc 5 Webアプリケーションに取り組んでおり、アプリケーション内に、主にサーバーとVMのネットワークをスキャンし、スキャン結果でデータベースを更新する長時間実行タスクを実行するメソッドがあります. メソッドの実行は、本番環境で完了するまでに 30 ~ 40 分かかる場合があります。このメソッドを 1 日に 2 回呼び出す Hangfire という名前のスケジュール ツールを使用しています。

これは、startup.cs ファイル内のジョブ定義で、8:01 am&でメソッドを呼び出します8:01 pm:-

public void Configuration(IAppBuilder app)
{
    var options = new SqlServerStorageOptions
    {
        PrepareSchemaIfNecessary = false
    };
    GlobalConfiguration.Configuration.UseSqlServerStorage("scanservice",options);

    RecurringJob.AddOrUpdate(() => ss.Scan(), "01 8,20 ***");
}

スケジュール ツールによって 1 日に 2 回呼び出されるメソッドは次のとおりです。

public void Scan()
{
    Service ss = new Service();
    ss.NetworkScan().Wait();
}

最後に、実際のスキャンを実行する方法は次のとおりです (私は、その方法が何を行うかについての高レベルの説明のみを提供します):-

public async Task<ScanResult> NetworkScan()
{
    // retrieve the server info from the DB
    // loop over all servers & then execute some power shell commands to scan the network & retrieve the info for each server one by one...
    // after the shell command completed for each server, i will update the related server info inside the DB 

現在、私はテスト環境でいくつかのテストを行い、すべてがうまく機能しました.2つのテストサーバーをスキャンするのに約25秒かかりました.しかし、現在、アプリケーションを本番環境に移行する予定で、スキャンするサーバーは約120++あります. そのため、本番環境でメソッドの実行が完了するまでに約 30 ~ 40 分かかると見積もっています。私の質問は、この実行が期限切れにならず、ScanNetwork() メソッドが最後まで完了するようにするにはどうすればよいですか?

4

1 に答える 1

2

タスクのタイムアウトを心配する代わりに、サーバーごとに新しいタスクを開始できます。このように、各タスクは非常に短時間で終了し、1 つのサーバーのスキャンによって例外が発生しても、他のすべてのサーバーには影響しません。さらに、IIS でアプリケーションを再起動すると、まだ完了していないスキャンが再開されます。すべてのスキャンが 1 つの順次タスクで行われるため、これは不可能です。ほとんどの時間はリモート サーバーでの待機に費やされる可能性が高いため、ネットワーク全体のスキャンを完了するための合計時間も急落する可能性があります。

public void Scan()
{
    Service ss = new Service();
    foreach (var server in ss.GetServers())
    {
        BackgroundJob.Enqueue<Service>(s => s.ServerScan(server));
    }
}

これで、スケジュールされたタスクは、サーバーごとに 1 つの新しいタスクをキューに入れるだけになります。

于 2015-10-07T20:10:51.190 に答える