重複検出
メッセージの送信直後に致命的なエラーが原因でアプリケーションが終了し、再起動したアプリケーション インスタンスでメッセージが送信されていなかったと誤って認識された場合、メッセージが再送信され、同じメッセージがシステム内で 2 回表示されます。
また、直前にクライアントまたはネットワーク レベルでエラーが発生し、送信されたメッセージがキューにコミットされ、クライアントに受信確認が正常に返されない場合もあります。 このシナリオでは、送信操作の結果についてクライアントは確認が取れないままになります。
重複メッセージの検出機能は、送信側が同じメッセージを再送信する一方でキューまたはトピックで重複メッセージを削除できるようにすることで、このような状況から不確実性を排除します。
注意
Service Bus の Basic レベルでは、重複検出はサポートされません。 Standard と Premium レベルでは、重複検出はサポートされます。 これらのレベルの違いについては、「Service Bus の価格」を参照してください。
しくみ
重複メッセージ検出を有効にすることにより、アプリケーションによって制御され、指定した時間枠内のキューまたはトピックに送信されたすべてのメッセージの MessageId
を追跡できます。 その時間枠内にログに記録された MessageId
が付いた新しいメッセージが送信されると、メッセージは受信済み (送信操作成功) としてレポートされ、新しく送信されたメッセージは瞬時に無視され破棄されます。 メッセージの MessageId
以外の部分は考慮されません。
ID のアプリケーションによる制御は、アプリケーションが MessageId
をエラー発生時に予想可能な方法で再構築できるビジネス プロセス コンテキストに紐付けることができる唯一の方法であるため、不可欠です。
アプリケーション コンテキストの処理過程で複数のメッセージが送信されるビジネス プロセスの場合、MessageId
は、注文書番号などのアプリケーション レベルのコンテキスト識別子と、メッセージの内容を組み合わせたもの、たとえば、12345.2017/支払いのようになります。
MessageId
は、常に何らかの GUID にすることができますが、ID をビジネス プロセスに固定すると、重複検出機能を効果的に使用するために必要とされる予測可能な再現性が生み出されます。
重要
- パーティション分割が有効になっている場合は、
MessageId+PartitionKey
を使用して一意性が判断されます。 セッションが有効になっている場合、パーティション キーとセッション ID は同じである必要があります。 - パーティション分割が無効 (既定) になっている場合は、
MessageId
のみを使用して一意性が判断されます。 SessionId
、PartitionKey
、およびMessageId
の詳細については、「パーティション キーの使用」を参照してください。- パーティション分割を使用してメッセージのバッチを送信する際には、それらにパーティション識別プロパティが含まれていないことを確認する必要があります。 重複除去は、一意性の判断にメッセージ ID の明示的な設定を利用しているため、パーティション分割で重複除去とバッチ処理を合わせて使用することは推奨されません。
Note
スケジュールされたメッセージは重複検出に含まれます。 したがって、スケジュールされたメッセージの送信後に、スケジュールされていない重複メッセージを送信すると、スケジュールされていないメッセージは削除されます。 同様に、スケジュールされていないメッセージの送信後に、スケジュールされた重複メッセージを送信すると、スケジュールされたメッセージは削除されます。
重複検出の時間枠の長さ
重複検出を有効にするだけでなく、メッセージ ID が保持される期間である、重複検出の履歴時間枠の長さを構成することもできます。 この値は、既定では、キューとトピックで 10 分に設定され、最小値は 20 秒、最大値は 7 日間です。
すべての記録されたメッセージ ID を新しく送信されたメッセージ ID と照合する必要があるため、重複の検出機能を有効化し、時間枠を設定すると、キュー (およびトピック) のスループットに直接影響します。
時間枠を小さく設定すると、保持し照合する必要があるメッセージ ID 数が減り、スループットへの影響は小さくなります。 スループットの高いエンティティで重複検出が必要な場合は、時間枠を小さく設定してください。
次のステップ
Azure portal、PowerShell、CLI、Resource Manager テンプレート、.NET、Java、Python、JavaScript を使用して、メッセージの重複検出を有効にすることができます。 詳細については、メッセージの重複検出の有効化に関する記事を参照してください。
クライアント コードで、以前と同じ MessageId を使用してメッセージを再送信できない場合は、安全に再処理できるメッセージを設計することが重要です。 このためのさまざまな手法について詳しくは、冪等性に関するブログ投稿をご覧ください。
Azure Service Bus の機能については、使用する言語のサンプルを試してみてください。
- .NET 用の Azure Service Bus クライアント ライブラリのサンプル (最新)
- Java 用の Azure Service Bus クライアント ライブラリのサンプル (最新)
- Python 用の Azure Service Bus クライアント ライブラリのサンプル
- JavaScript 用の Azure Service Bus クライアント ライブラリのサンプル
- TypeScript 用の 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 から公式のサポートと更新プログラムは提供されなくなります。 詳細については、サポート廃止のお知らせに関するページを参照してください。