2017-12-01 6 views
1

私はAzureで実行しているWeb APIアプリケーションを持っています。毎日午前2時にスケジューラの仕事をして、たくさんのハングファイヤージョブを作ります。AzureのすべてのインスタンスでHangfireジョブをディスパッチする方法はありますか?

現時点では、Web APIアプリケーションには、CPUメトリックに基づいてスケールアウトするように構成されたインスタンスが1つしかありません。これらの実行中のハングファイアジョブはCPUのパーセンテージを制限値まで上げ、apiアプリケーションの新しいインスタンスを作成します。

残念ながら、特定のハングファイアジョブが作成されたインスタンス上で実行されているようです。使用可能なすべてのインスタンスにジョブをディスパッチするにはどうすればよいですか?

+0

アプリケーションをクラウド上で実行するときに、Hangfireジョブの代わりにAzure関数を検討してください。より良いアプローチでなければなりません:https://docs.microsoft.com/en-us/azure/azure-functions/functions-overview。例:Azureは消費計画を使用するとコードが実行される時間にのみ支払います。 –

答えて

3

残念ながら、特定のハングファイアジョブが作成されたインスタンスで実行されているようです。使用可能なすべてのインスタンスにジョブをディスパッチするにはどうすればよいですか?

AFAIKの場合、ジョブはデフォルトでdefaultキューに格納されます。複数のサーバーインスタンスを実行すると、そのジョブは使用可能なインスタンスに分散されます。私は2つのサーバーインスタンスを開始し、私は以下の結果を得た

using (var server = new BackgroundJobServer()) 
{ 
    Console.WriteLine("Hangfire Server started. Press any key to exit..."); 
    Console.ReadKey(); 
} 

Enumerable.Range(11, 30).ForEach(i => 
{ 
    BackgroundJob.Enqueue(() => Console.WriteLine($"[Task-{i}] Getting Started with HangFire!")); 
}); 

を次に、以下のようにコンソールアプリケーション内のジョブを処理して、次のようにテストのために、私はちょうど私のタスクを追加する

enter image description here

また、ジョブ・キューを構成するために、あなたはhereに従うことができます。また、1つのサーバーインスタンスでのみジョブを実行することに関する問題とは逆のissueもあります。

+0

AzureでWeb APIとVMを使用してジョブの配布に気づきました。オートスケールに設定されたWeb APIのみを使用すると、ディスパッチは見られませんでしたが、再試行します。 – PMerlet

0

この動作は、ジョブがキューイングされて同じインスタンスで処理されたときにゼロ遅延ジョブ処理を追加するthis pull requestと接続されているようです。

コードを見れば、キューに新しいジョブを追加するたびに、WaitAnyのイベントはSetです。次に、キューからジョブを再度取得しようとします。これにより、ジョブの待ち時間が短縮されます。

私の仮説は、現在のインスタンスがビジー状態のときはいつでも、複数のジョブがあなたの他のインスタンスに配布されるということです。

関連する問題