昨日、ステージング<->プロダクションの役割を交換しようとしたときに、ひどい問題/経験がありました。
設定は次のとおりです。
キューからメッセージを取得するworkerroleがあります。これらのメッセージはロールで処理されます。(テーブルストレージの挿入、dbの選択など)。これは、作成する必要のあるテーブルストレージポストの数に応じて、キューメッセージごとに1〜3秒かかる場合があります。すべてが終了すると、彼はメッセージを削除します。
交換時の問題:
私たちのステージングプロジェクトがオンラインになったとき、私たちのプロダクションワーカーの役割はエラーになり始めました。
ロールがキューメッセージを処理したいとき、それは「EntityAlreadyExists」エラーの一定の流れを与えました。これらのエラーのため、キューメッセージは削除されませんでした。これにより、キューメッセージがキューに戻され、処理などに戻されました。
これらのキューメッセージの内部を調べて、それらで何が起こるかを分析すると、実際には処理されたが削除されていないことがわかりました。
これらの誤ったメッセージを削除しても、問題は解決しませんでした。新たにキューメッセージも処理されませんでしたが、これらはまだ処理されておらず、テーブルストレージレコードも追加されていませんでした。これは非常に奇妙に聞こえます。
ステージングと本番環境の両方を削除し、本番環境に再度公開すると、すべてが正常に機能し始めました。
考えられる問題?
実際に何が起こったのかわかりません。
- たぶん、両方の役割が同じメッセージを受け取り、1つは投稿を行い、もう1つはエラーになりましたか?
- ... ???
可能な解決策)?
この「問題」を解決する方法について、いくつかのアイデアがあります。
- ポイズンメッセージをシステムにフェイルオーバーさせますか?デキューカウントがXを超えたら、そのキューメッセージを削除するか、別の「poisonqueue」に配置する必要があります。
- EntityAlreadyExistsエラーをキャッチし、そのキューメッセージを削除するか、別のキューに入れます。
- ... ????
複数の役割
複数の役割を設定するときに同じ問題が発生すると思いますか?
どうもありがとう。
2012年2月24日編集-追加情報
- 実際にGetMessage()を使用します
- キュー内のすべてのアイテムは一意であり、テーブルストレージに一意のメッセージを生成します。プロセスに関するもう少しの情報:ユーザーが何かを投稿し、特定の他のユーザーに配布する必要があります。そのユーザーから生成されたメッセージには、一意のID(GUID)があります。このメッセージはキューに投稿され、ワーカーロールによって取得されます。メッセージは他のいくつかのテーブル(partitionkey-> UserId、rowkey->ティック単位のタイムスタンプと一意のメッセージID)に分散されます。したがって、通常の状況で同じメッセージが投稿される可能性はほとんどありません。
- 一部のメッセージは10〜20個のテーブルに分散される可能性があるため、非表示のタイムアウトは論理的な説明になる可能性があります。これは、バッチオプションなしで10-20挿入を意味します。この不可視タイムアウトを設定または拡張できますか?
- 例外のためにキューメッセージを削除しないことも、ポイズンメッセージフェイルオーバーをまだ実装していないため、説明になる可能性があります;)。