いいえ。次のことが発生する可能性があります。
- GetMessage()
- データベースにいくつかのレコードを追加...
- いくつかのファイルを生成します...
- DeleteMessage() -> 予期しないエラー (クラッシュするプロセス、再起動するインスタンス、ネットワーク接続の問題など)
この場合、ロジックは DeleteMessage を呼び出さずに実行されました。これは、非表示タイムアウトが期限切れになると、メッセージがキューに表示され、もう一度処理されることを意味します。プロセスがべき等であることを確認する必要があります。
冪等性は、数学およびコンピューター サイエンスの特定の操作の特性であり、最初の適用を超えて結果を変更することなく複数回適用できます。
別の解決策は、Service Bus キューをReceiveAndDeleteモードで使用することです (このページの「キューからメッセージを受信する方法」を参照してください)。メッセージを受信すると、消費済みとしてマークされ、二度と表示されなくなります。このようにして、 At-Most-Onceで配信されることを確認できます(ここでストレージ キューとの比較を参照してください)。ただし、メッセージの処理中に何かが発生した場合 (サーバーのクラッシュなど)、貴重な情報が失われる可能性があります。
アップデート:
これにより、ストレージ キューで At-Most-Once がシミュレートされます。メッセージは GetMessage を介して複数回到着する可能性がありますが、ビジネス ロジックによって 1 回だけ処理されます (ビジネス ロジックの一部が実行されないというリスクがあります)。
- GetMessage()
- メッセージの削除()
- AddRecordsToDatabase()
- GenerateFiles()