ワーカーがキューからメッセージを処理できなかった場合、メッセージが再び表示されるようになり、これに対してコーディングする必要があることを知っています (べき等)。しかし、ワーカーがメッセージを 2 回デキューできる可能性はありますか? ログに基づいて、この動作が見られるようですが、その理由はわかりません。次のメッセージを取得するまでの間にメッセージを削除していますが、もう一度取得したようです。
3 に答える
はい、同じメッセージを 2 回デキューできます。これは、次の 2 つの理由で発生する可能性があります。
- ワーカー A がメッセージ B をデキューし、非表示タイムアウトが期限切れになります。メッセージ B が再び表示されるようになり、ワーカー C がメッセージ B をデキューし、ワーカー A の pop レシートが無効になります。ワーカー A が作業を終了し、メッセージ B を削除しようとすると、エラーがスローされます。これが最も一般的です。
- 特定の条件 (非常に頻繁なキュー ポーリング) では、
GetMessage
. これは、まれに発生するタイプの競合状態です。ワーカー A と B は非常に迅速にポーリングし、同時にキューにヒットし、両方とも同じメッセージを受け取ります。これは以前は (SDK 1.0 の時間枠で) 高いポーリング シナリオではより一般的でしたが、最近のストレージの更新では非常にまれになりました (最近これを見たことを思い出すことはできません)。
そうは言っても、メッセージをポップするワーカーが 1 つしかない場合は、メッセージを 2 回キューに入れていることになります。1 と 2 は、複数のワーカーがある場合にのみ発生します。
2回デキューできないはずです。そして、私が物事を正しく思い出せば、2回目のデキューとロックの後にpopレシートが変更されるため、2回削除することさえできないはずです。
SilverNinja が示唆するように、メッセージが誤って 2 回キューに入れられた可能性があるかどうかを確認します。
複数のワーカー ロールがありますか?
ロールが実行中の処理を完了する前に、キュー アイテムの可視性のタイムアウトが終了する可能性があります (特に時間がかかるプロセスの場合)。この場合、別の同一のロールが同じメッセージを取得する可能性があります (これは事実上、許可する必要があるものです。同じメッセージが複数回処理される場合に問題になることは望ましくありません)。
この時点で、最初のロールが終了してメッセージをデキューし、タイムアウト後にそれを取得した他のロールが終了してメッセージをデキューしようとします。頭のてっぺんから、ロールが既にデキューされたメッセージをデキューしようとしたときに正確に何が起こるか思い出せません。