2012-05-02 6 views
4

私が知っているのは、作業者がキューからメッセージを処理しないと、再び表示され、これに対して(冪等の)コードを付けなければならないことです。しかし、作業者がメッセージを2回デキューできる可能性はありますか?私の伐採に基づいて、私はこのような行動を見ているように見えますが、なぜその理由がわかりません。私は次のメッセージを手に入れようとする間にメッセージを削除していても、もう一度手に入れたようです。空白のストレージキューからメッセージを2回取得することはできますか?

+1

本当に2回送信していませんか?メッセージを削除/デキューすると、メッセージは削除されます。 – SliverNinja

+1

メッセージを待ち行列に入れてもそれが2回キューに入れられているのを見ることはできませんが、私は何か不足している可能性があります。より多くのログを追加し、もう少しこれを考える時間。ありがとう – Bryan

+1

そして、そこに行く - それは、私の側に1つのケースで2回、それを記録せずにキューイングするバグだった。 – Bryan

答えて

0

デキューできないようにする必要があります。そして、私が物事を正しく思い出すと、2回目のデキューとロック後にポップレシートが変わるので、2度も削除することはできません。

SilverNinjaが示唆しているように、おそらくメッセージが誤って2回キューに入れられていたかどうかを確認したいと思います。

0

複数のワーカーロールがありますか?

キューアイテムの可視性のタイムアウトが、処理中に何時でも処理が完了する前に終了する可能性があります(特に、処理に時間がかかる)。この場合、別の同じ役割が同じメッセージを受け取る可能性があります(これは効果的に許可する必要があります。同じメッセージが複数回処理されても問題ありません)。

この時点で、最初のロールが終了してメッセージをデキューし、次にタイムアウト後にそれを選択した他のロールが終了し、メッセージをデキューしようとします。私の頭の上から、ロールがデキューされたメッセージをデキューしようとしたときに、正確に何が起こったのかを思い出さない。

+0

はい - 私は2人の労働者のインスタンスを持っています。しかし、私の操作は非常に速く、長時間走っているわけではありません。それはGetMessageとDeleteのようなものです。しかし、上記に基づいて、スケジューリングのバグや可能性が高いです。デキュー時の値にバグがない限り、メッセージが再び見えるようになっているとは思えません。デフォルトでは5分でなければなりませんが、設定を許可します。 – Bryan

5

はい、同じメッセージを2回デキューできます。これは、2つの理由で発生します。

  1. ワーカーAのメッセージBおよび不可視タイムアウトが期限切れです。メッセージBが再び表示され、ワー​​カーCのメッセージBがデキューされ、ワー​​カーAのポップレシートが無効になります。作業者Aは作業を終了し、メッセージBを削除してエラーがスローされます。これが最も一般的です。
  2. 特定の条件(頻繁なキューポーリング)では、GetMessageで同じメッセージを2回取得できます。これは、まれに発生する競合状態の一種です。ワーカーAとBは非常に迅速にポーリングし、同時にキューにヒットし、両方とも同じメッセージを受け取ります。これは以前はポーリングのシナリオの下ではより一般的でしたが(SDK 1.0のタイムフレーム)、最近のストレージアップデートではまれになっています(最近このことを思い出すことはできません)。

と言われています。つまり、ワーカー1人のポップアップメッセージしかなければ、メッセージを2回キューに入れています。 1人と2人は、1人以上の労働者がいる場合にのみ発生します。

関連する問題