Azure Service Busでの重複検出

メッセージを送信した直後に致命的なエラーが原因でアプリケーションが失敗し、再起動されたアプリケーション インスタンスが、以前のメッセージ配信が発生しなかったと誤って考えた場合、後続の送信によって同じメッセージがシステムに 2 回表示されます。

また、直前にクライアントまたはネットワーク レベルでエラーが発生し、送信されたメッセージがキューにコミットされ、クライアントに受信確認が正常に返されない場合もあります。 このシナリオでは、送信操作の結果についてクライアントは確認が取れないままになります。

重複検出では、送信者が同じメッセージを再送信できるようにすることで、このような状況から疑いを取り除き、キューまたはトピックは重複コピーを破棄します。

しくみ

Service Bus の Basic レベルでは、重複検出はサポートされません。 Standard と Premium レベルでは、重複検出はサポートされます。 これらのレベルの違いについては、「Service Bus の価格」を参照してください。

重複メッセージ検出を有効にすることにより、アプリケーションによって制御され、指定した時間枠内のキューまたはトピックに送信されたすべてのメッセージの MessageId を追跡できます。 時間枠内にログに記録された MessageId で新しいメッセージが送信された場合、Service Busはメッセージを受け入れたものとして報告します (送信操作は成功します)、新しく送信されたメッセージはすぐに無視され、削除されます。 メッセージの MessageId 以外の部分は考慮されません。

識別子のアプリケーション制御は不可欠です。これは、障害が発生したときに予測可能に再構築できるビジネス プロセス コンテキストに MessageId を関連付けることができるためです。

アプリケーション コンテキストの処理過程で複数のメッセージが送信されるビジネス プロセスの場合、MessageId は、注文書番号などのアプリケーション レベルのコンテキスト識別子と、メッセージの内容を組み合わせたもの、たとえば、12345.2017/支払いのようになります。

MessageIdは常に GUID にすることができますが、識別子をビジネス プロセスに固定すると、予測可能な再現性が得られます。これは、重複検出機能を効果的に使用するために重要です。

重要

  • パーティション分割有効になっている場合は、MessageId+PartitionKey を使用して一意性が判断されます。 セッションが有効になっている場合、パーティション キーとセッション ID は同じである必要があります。
  • パーティション分割無効 (既定) になっている場合は、MessageId のみを使用して一意性が判断されます。
  • SessionIdPartitionKey、および MessageId の詳細については、「パーティション キーの使用」を参照してください。
  • パーティション分割を使用してメッセージのバッチを送信する場合は、それらにパーティション識別プロパティが含まれていないことを確認してください。 重複除去は、メッセージ ID を明示的に設定して一意性を判断することに依存するため、重複除去とバッチ処理をパーティション分割と共に使用することはお勧めしません。

スケジュールされたメッセージは重複検出に含まれます。 したがって、スケジュールされたメッセージの送信後に、スケジュールされていない重複メッセージを送信すると、スケジュールされていないメッセージは削除されます。 同様に、スケジュールされていないメッセージの送信後に、スケジュールされた重複メッセージを送信すると、スケジュールされたメッセージは削除されます。

重複検出ウィンドウサイズ

重複検出を有効にするだけでなく、メッセージ ID が保持される重複検出履歴の時間枠のサイズを構成することもできます。 キューとトピックの既定値は 10 分で、最小値は 20 秒、最大値は 7 日です。

重複の検出機能を有効化し、ウィンドウサイズを設定すると、すべての記録されたメッセージ ID を新しく送信されたメッセージ ID と照合する必要があるため、キュー (およびトピック) のスループットに直接影響を与えます。

時間枠を小さく設定すると、保持し照合する必要があるメッセージ ID 数が減り、スループットへの影響は小さくなります。 重複検出を必要とする高スループットエンティティの場合は、ウィンドウをできるだけ小さくします。

次のステップ

Azure ポータル、PowerShell、CLI、Resource Manager テンプレート、.NET、Java、Python、JavaScript を使用して、重複メッセージ検出を有効にすることができます。 詳細については、メッセージの重複検出の有効化に関する記事を参照してください。

クライアント コードが以前と同じ MessageId を持つメッセージを再送信できないシナリオでは、安全に再処理できるメッセージを設計します。 このためのさまざまな手法について詳しくは、冪等性に関するブログ投稿をご覧ください。

Azure Service Bus の機能については、使用する言語のサンプルを試してみてください。

以前の .NET および Java クライアント ライブラリのサンプルについては、こちらを参照してください。

2026 年 9 月 30 日に、Azure SDK ガイドラインに準拠していない Azure Service Bus SDK ライブラリ WindowsAzure.ServiceBus、Microsoft.Azure.ServiceBus、および com.microsoft.azure.servicebus は廃止されます。 SBMP プロトコルのサポートも終了するため、2026 年 9 月 30 日以降はこのプロトコルを使用できなくなります。 この日付より前に、重要なセキュリティ更新プログラムと強化された機能が提供される、最新の Azure SDK ライブラリに移行してください。

古いライブラリは 2026 年 9 月 30 日以降も引き続き使用できますが、Microsoft から公式のサポートと更新プログラムは提供されなくなります。 詳細については、サポート廃止のお知らせに関するページを参照してください。