12

Azureキューを使用していて、キューから読み取るいくつかの異なるプロセスがあります。
私のシステムは、各メッセージが1回だけ読み取られることを前提とした方法で構築されています。
このMicrosoftの記事では、Azureキューには少なくとも1回の配信保証があると主張しています。これは、2つのプロセスがキューから同じメッセージを読み取ることができることを意味する可能性があります。
このStackOverflowスレッドは、 GetMessageを使用すると、非表示タイムアウトのためにメッセージが他のすべてのプロセスから非表示になると 主張しています。

GetMessage()を使用し、 DeleteMessageの前にメッセージの非表示時間を超えないことを前提とすると、各メッセージを1回だけ取得すると想定できますか?

4

2 に答える 2

10

という名前のキュー メッセージにプロパティがあると思いますDequeueCount。これは、このメッセージがキューから取り出された回数です。そして、それはキュー サービスによって維持されます。このプロパティを使用して、メッセージが以前に読まれたかどうかを識別できると思います。

https://docs.microsoft.com/en-us/dotnet/api/azure.storage.queues.models.queuemessage.dequeuecount?view=azure-dotnet

于 2012-11-29T02:02:48.327 に答える
8

いいえ。次のことが発生する可能性があります。

  • GetMessage()
  • データベースにいくつかのレコードを追加...
  • いくつかのファイルを生成します...
  • DeleteMessage() -> 予期しないエラー (クラッシュするプロセス、再起動するインスタンス、ネットワーク接続の問題など)

この場合、ロジックは DeleteMessage を呼び出さずに実行されました。これは、非表示タイムアウトが期限切れになると、メッセージがキューに表示され、もう一度処理されることを意味します。プロセスがべき等であることを確認する必要があります。

冪等性は、数学およびコンピューター サイエンスの特定の操作の特性であり、最初の適用を超えて結果を変更することなく複数回適用できます。

別の解決策は、Service Bus キューをReceiveAndDeleteモードで使用することです (このページの「キューからメッセージを受信する方法」を参照してください)。メッセージを受信すると、消費済みとしてマークされ、二度と表示されなくなります。このようにして、 At-Most-Onceで配信されることを確認できます(ここでストレージ キューとの比較を参照してください)。ただし、メッセージの処理中に何かが発生した場合 (サーバーのクラッシュなど)、貴重な情報が失われる可能性があります。

アップデート:

これにより、ストレージ キューで At-Most-Once がシミュレートされます。メッセージは GetMessage を介して複数回到着する可能性がありますが、ビジネス ロジックによって 1 回だけ処理されます (ビジネス ロジックの一部が実行されないというリスクがあります)。

  • GetMessage()
  • メッセージの削除()
  • AddRecordsToDatabase()
  • GenerateFiles()
于 2012-11-28T09:28:55.253 に答える