2016-10-28 20 views
0

TimerTriggerで実行しているAzure Webjobの2つの配備(ProdとTest)があります。両方のWebアプリケーションには単一インスタンスがあります。 this articleによると、TimeTriggersはシングルトンロックを使用して、並列呼び出しがないことを確認します。これらの2つのインスタンスは同じストレージアカウントを使用します。私たちが直面している問題は、展開のうちの1つだけがロックを取得し、他のものはロックを取得できないように見えるということです。最初のウェブジョブを停止すると、2番目のジョブはロックを獲得して処理を開始し、その逆も同様です。Azure Webjobタイマートリガーは起動しません

ロックはストレージアカウントによって異なりますか?どのようにして、これらの両方のデプロイメントが別々のロック機構を持ち、同時に実行されることを確認できますか?

答えて

4

あなたは正しい、あなたは、異なるストレージ・アカウントを使用する必要があります。 documentationから

:舞台裏

TimerTriggerはあなたのトリガ機能の単一インスタンスのみが任意の時点で実行されていることを確認するためにWebJobs SDKのシングルトン機能を使用しています。 JobHostが起動すると、各TimerTrigger関数に対してBLOBリース(シングルトンロック)が行われます。この分散ロックにより、スケジュールされた関数の1つのインスタンスだけがいつでも実行されます。その関数のBLOBが現在リースされていない場合、関数はリースを取得し、すぐにスケジュールどおりに実行を開始します。 BLOBリースを取得できない場合は、通常、そのファンクションの別のインスタンスが実行されているため、ファンクションは現在のホストで開始されていません。この場合、ホストはリースを取得できるかどうか定期的にチェックし続けます。これは、一種の「回復」モードとして実行され、定常状態で実行されている場合、インスタンスが停止した場合には別のインスタンスの通知を受け取り、他のインスタンスの通知を受け取ります。

あなたがロックmecanism(StorageScheduleMonitor.cs)の実装を見てみると:

  • ジョブが容器の内部ロック(ブロブ)を取得します。
  • blobは特定のディレクトリ(HostIdに基づく)の内部にあります。
  • ブロブの名前は設定できません。

    • が分離ストレージアカウントを持って:あなたは、環境(DEV /ステージング/ PROD)あたりのストレージアカウントをお持ちの場合は理にかなって

    ので、@のボロディミール-bilyachat回答に基づいて、2つの可能性があります

    var config = new JobHostConfiguration(); 
    config.HostId = "dev|staging|prod"; 
    
  • JobHostConfigurationクラスのHosIdプロパティを指定します

  • +0

    'Blob lease'はストレージワイドロックを意味しますか?これは、複数の展開に単一のロックが使用されていることは私には意味がありません。 –

    +0

    私の答えを更新しました – Thomas

    0

    TimerTriggerを使用する場合は、Web Appで常にオンを有効にしてください。

    2

    使用異なるストレージアカウントや設定ホスト

    var config = new JobHostConfiguration(); 
    config.HostId = "dev|prod" 
    var host = new JobHost(config); 
    host.RunAndBlock(); 
    
    +0

    HostIdについて確かですか?それはスケーリングの詳細です。 – Thomas

    +0

    @Thomas私はdevとステージングで同じストレージを使用していたときに同じ問題を抱えていました。そしてそれは私に役立ちます –

    +0

    私はこの問題に直面したときによく知っている:-)別のストレージアカウントを作成 – Thomas

    関連する問題