キューにメッセージを何度も挿入しないようにしたいと思います。一意性を強制するために使用できるID/名前はありますか?
2 に答える
vtortolaはそれをほぼカバーしていましたが、少なくとも1回の配信である理由についてもう少し詳しく説明したいと思います。
キューアイテムを読み取るとき、それはキューから削除されません。代わりに、非表示になりますが、キューに残ります。その不可視期間のデフォルトは30秒(最大:2時間)です。その間、アイテムをキューから外したコードには、キューメッセージに含まれていたコマンドを処理し、キューアイテムを削除するための時間があります。
タイムアウト期間に達する前にキュー項目が削除されたと仮定すると、すべてが順調です。ただし、タイムアウト期間に達すると、キューアイテムが再び表示され、キューアイテムを保持しているコードがそれを削除できなくなります。この場合、他の誰かが同じキューメッセージを読み取って、そのメッセージを再処理できます。
キューメッセージがタイムアウトし、再表示される可能性があるため、次のようになります。
- キュー処理はべき等である必要があります。キューメッセージに対する操作は、同じ結果(写真のサムネイルのレンダリングなど)をもたらす必要があります。
- タイムアウトの調整について考える必要があります。コマンドは有効ですが、処理に時間がかかりすぎる場合があります(45秒のサムネイルレンダリングコードは、誰かが25MPの画像をアップロードするまでは問題なく機能した可能性があります)
- あなたは毒メッセージについて考える必要があります-それは決して正しく処理されません。おそらく、例外がスローされたり、メッセージプロセッサが処理を中止したりする無効な条件が発生したりして、メッセージが最終的にキューに再表示されるようになります。DequeueCountと呼ばれるプロパティがあります-キューアイテムを読み取るときにそのプロパティを表示することを検討し、たとえば3に等しい場合は、メッセージをテーブルまたはBLOBにプッシュし、通知を送信して、そのメッセージをオフラインでデバッグする時間を費やします。
get-queue低レベルRESTAPIの詳細については、こちらをご覧ください。これにより、WindowsAzureキューメッセージの処理についてより深く理解できるようになります。
Azure キューは、メッセージの順序とメッセージの一意性を保証しません。メッセージは「少なくとも 1 回」処理されますが、2 回処理されないことを保証するものは何もないため、「最大 1 回」は保証されません。
同じメッセージを 2 回受信する準備をする必要があります。ID をデータの一部としてメッセージの本文に入れることができます。