Azure Service Bus メッセージのプリフェッチ
プリフェッチ機能は、バックグラウンドのメッセージをプリフェッチ カウントまでローカル プリフェッチ バッファーにフェッチします。 メッセージはバッファーから提供されます。 その場合、バッファー内の領域が解放され、受信側はバックグラウンドでより多くのプリフェッチを行います。
プリフェッチ機能を有効にするには、キューまたはサブスクリプション クライアントのプリフェッチ数を 0 より大きい数値に設定します。 値を 0 に設定すると、プリフェッチが解除されます。 機能がオフになった後にプリフェッチ バッファーにメッセージがある場合、アプリケーションは最初にバッファーからそれらのメッセージを受信し、次にサービスに送信します。
ServiceBusReceiverOptions および ServiceBusProcessorOptions のオブジェクトでプリフェッチ数プロパティを設定します。
注意
JavaScript SDK は、プリフェッチ機能をサポートしていません。
メッセージがプリフェッチ バッファーに格納されると、後続の受信呼び出しは、バッファーから直ちに実行されます。 領域が使用可能になると、バッファーがバックグラウンドで補充されます。 配信するメッセージがない場合は、受信操作によってバッファーが空になり、想定どおり、ブロックを待機します。
プリフェッチが既定のオプションではない理由
プリフェッチを使用すると、アプリケーションが要求する前にメッセージをローカルで取得できるよう用意することで、メッセージ フローを高速化できます。 このスループットの向上は、メリットとデメリットを比較したうえで、アプリケーションの作成者がその使用を明示的に決定した結果として得られるものです。
receive-and-delete モードでは、プリフェッチ バッファーに取得されたすべてのメッセージはキューで使用できなくなります。 メッセージは、アプリケーションに受信されるまで、メモリ内のプリフェッチ バッファーにのみ存在します。 アプリケーションがメッセージを受信する前に終了すると、それらのメッセージは失われ、復元できなくなります。
peek lock 受信モードでは、プリフェッチ バッファーにフェッチされたメッセージが、ロック状態のバッファーに取得されます。 ロック タイマーは、メッセージがバッファーにプリフェッチされた時点から開始されます。 プリフェッチ バッファーのサイズが大きく、処理に時間がかかり、その結果、メッセージがプリフェッチ バッファー内にある間、あるいはアプリケーションがメッセージを処理している間にメッセージのロックの有効期限が切れると、アプリケーションでの処理において混乱を招くイベントが発生する場合があります。 アプリケーションは、期限が切れた、またはロックの有効期限がもうすぐ切れるメッセージを取得する場合があります。 この場合、アプリケーションはメッセージを処理することもありますが、ロックの有効期限のためにメッセージを完了できないことを検出します。 アプリケーションは LockedUntilUtc
プロパティを確認できますが、ブローカーとローカル コンピューターのクロックの間にクロック スキューがあることに注意してください。
プリフェッチ バッファーでロックの有効期限が自動的に切れると、メッセージは破棄済みとして扱われ、もう一度キューから取得できるようになります。 その後、メッセージは再びプリフェッチバッファーに取り込まれ、最後に配置されます。メッセージの有効期限中、プリフェッチ バッファーが通常通り処理されない場合は、メッセージのプリフェッチが繰り返されますが、メッセージは使用可能な (ロックが有効) 状態で効果的に配信されることはなく、最終的には、最大配信回数を超えて配信不能キューに入れられます。
アプリケーションがメッセージを明示的に破棄した場合、メッセージをキューから再度取得できる可能性があります。 プリフェッチが有効になると、メッセージは再びプリフェッチ バッファーにフェッチされ、最後に配置されます。 プリフェッチ バッファーからのメッセージが先入れ先出し (FIFO) の順序でドレインされるため、アプリケーションはメッセージを順不同で受信する場合があります。 たとえば、アプリケーションはバッファーから ID 2 のメッセージを受信してから、(以前に破棄された) ID 1 のメッセージを受信する場合があります。
メッセージの処理に高い信頼性が必要で、処理にかなりの作業量と時間が必要な場合、プリフェッチ機能をまったく使用しないか、慎重に使用することをお勧めします。 高いスループットを必要としており、メッセージ処理が一般に安価である場合は、プリフェッチによって大きなスループットの利点がもたらされます。
最大プリフェッチ数とキューまたはサブスクリプションに構成されているロック期間は、ロックのタイムアウトが、プリフェッチ バッファーの最大サイズに 1 メッセージ分を足した累計予想メッセージ処理時間以上になるようにバランスを調整する必要があります。 同時に、ロック期間はメッセージがロックされている間にそれぞれの最大有効期間を超過するほど長くてはいけません。それによってメッセージはプリフェッチ時に完了しなかった場合に削除されることになるからです。
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 から公式のサポートと更新プログラムは提供されなくなります。 詳細については、サポート廃止のお知らせに関するページを参照してください。