5

ここでは WEBJOBS_SHUTDOWN_FILE を使用し、ここではキャンセル トークンを使用して正常なシャットダウンについて読んだので、正常なシャットダウンの前提を理解していますが、キュー メッセージの処理中にある Web ジョブにどのように影響するかはわかりません。

シナリオは次のとおりです。

  1. キューをリッスンする機能を備えた Web ジョブがあります。
  2. メッセージがキューに追加され、ジョブが処理を開始します。
  3. 処理中に誰かが開発をプッシュし、再デプロイをトリガーします。

git プッシュでデプロイするために Web ジョブを接続していると仮定すると、このデプロイは Web ジョブの更新もトリガーし、(私が理解している限りでは) ジョブで何らかのシャットダウン ワークフローを開始します。そこで、いくつか質問があります。

  1. キュー メッセージの処理中のジョブは、ジョブが終了する前にメッセージの処理を終了しますか? または、シャットダウン通知は本質的に「この雌犬はシャットダウンしようとしています。それを処理するものが何もない場合、あなたはSOLです。」
  2. 私たちが SOL である場合、基本的にシャットダウンを処理するための最良のオプションは、実行していることを DB トランザクションと同等にラップし、シャットダウン時にすべての変更がロールバックされるようにシャットダウン ハンドラーを実装することですか?
  3. キュー メッセージの処理中に Web ジョブがシャットダウンした場合、そのメッセージは再度キューに入れられますか? そうでない場合、シャットダウン ハンドラがそのメッセージの再キューイングを処理する必要があるということですか?
  4. ジョブをシャットダウンする必要があることが通知された後、キューをリッスンしている関数がそれ以上のキュー メッセージを取得することは可能ですか?

ここでのガイダンスは大歓迎です!また、私が言及したもの以外に、ジョブのシャットダウンを処理する方法に関する他の有用なリンクがあれば、それらを共有していただければ幸いです。

4

1 に答える 1

4

少なからずテストを重ねた結果、自分の疑問に対する答えを見つけたと思います。他の誰かが私の経験から何らかの洞察を得られることを願っています。

注: これらのシナリオはすべて .NET コンソール アプリと Azure キューを使用してテストされているため、BLOB やテーブル ストレージ、またはさまざまな種類のジョブ ファイルの種類がこれらのさまざまなシナリオをどのように処理するかはわかりません。

  1. ジョブが終了するようにマークされた後、実行中のトリガーされた関数には、構成された時間 (猶予期間) (デフォルトでは 5 秒ですが、settings.job ファイルを使用して構成可能だと思います) が設定されてから終了します。終了します。猶予期間内に終了しない場合、関数は終了します。ただし、Main() (または host.RunAndBlock() を宣言したファイル) は、その後のコードの実行を終了します。host.RunAndBlock()猶予期間の残りの時間まで (RunAndBlock の代わりに無限ループを使用した場合、それがどのように機能するかはわかりません)。関数で終了を処理する限り、IsCancellationRequired のトリガーされた関数に渡すことができる CancellationToken を基本的に「リッスン」し、それに応じて処理できます。また、自分でやめなければSOLではありません。ハザ!ポイント#3を参照してください。

  2. 終了を処理しない場合は SOL ではありませんが (ポイント 3 を参照)、すべてのジョブをトランザクションでラップすることをお勧めします。このトランザクションは、ジョブが完全に確定するまでコミットされません。コースを実行しました。これにより、関数がプロセスの途中で終了した場合に、データの破損について心配する必要が少なくなります。トランザクションが通過するときにトランザクションをコミットするシナリオ (バッチ ジョブなど) がいくつか考えられますが、以前に処理されたエンティティがジョブの再起動後に再処理されないように、データまたはロジックを構造化する必要があります。

  3. 離職は自分で処理しなくても問題ありません。カバーの下で何が起こっているかについての私の理解は事実上存在しませんが、結果についてはかなり確信しています. 関数がキュー メッセージの処理の途中で、終了する前に強制終了された場合でも、恐れることはありません。ジョブが処理するメッセージを取得すると、基本的に一定時間キューに非表示になります。メッセージの処理中に関数が終了した場合、そのメッセージは x 時間後に再び「表示される」ようになり、再取得され、展開されたばかりの更新された可能性のあるコードに対して実行されます。

  4. したがって、#4 の調査結果には約 90% の自信があります。そして、それをテストしようとすると、特定の部分で何が起こっているのか実際には完全にはわからないまま、ウィンドウをすばやく切り替える必要があったためです. しかし、ここに私が見つけたものがあります:ジョブが終了する猶予期間b4にキューに新しいメッセージが追加された可能性が低い場合、次の2つのいずれかが発生する可能性があると思います:関数がジョブの前にそのキューをポーリングしない場合終了すると、メッセージはキューに残り、ジョブの再起動時に取得されます。ただし、関数がメッセージを取得する場合、中断された他のメッセージと同じように処理されます。メッセージは再びキューに「表示され」、ジョブの再起動時に再実行されます。

それはほとんどそれを要約しています。他の人がこれを役に立つと思うことを願っています。これについて詳しく説明したい場合はお知らせください。喜んで試します。または、私がそれでいっぱいで、修正がたくさんある場合は、おそらくもっと歓迎されます!

于 2015-01-28T06:37:37.480 に答える