メッセージ交換の優先度のトラブルシューティング

このトピックでは、Service Broker のメッセージ交換の優先度に関連して発生する一般的な現象の修正方法について提案を示します。

テクニック : HONOR_BROKER_PRIORITY が ON になっているかどうかを確認する

HONOR_BROKER_PRIORITY データベース オプションの状態を確認するには、sys.databasesis_broker_priority_honored 列を使用します。

SELECT name AS database_name,
       CASE is_broker_priority_honored
            WHEN 0 THEN N'OFF'
            WHEN 1 THEN N'ON'
       END AS is_broker_priority_honored
FROM sys.databases
ORDER BY database_name;

現象 : メッセージが優先度順に送信されない

SQL Server Profiler トレースを開き、Broker Remote Message Ack イベントを確認します。StarvationElevation 列の値が 1 の場合は、スタベーションを回避するためにメッセージの優先度が上げられたことを意味します。HonorBokerPriority 列の値が 0 の場合は、送信側のデータベースで HONOR_BROKER_PRIORITY オプションが有効になっていなかったことを意味します。

また、Broker/DBM Transport システム モニタ カウンタを参照して、優先度の異なるメッセージの転送速度を確認します。

現象 : メッセージが優先度順に受信されない

1 つの RECEIVE ステートメントで取得できるのは、1 つのメッセージ交換グループのメッセージのみです。優先度の高いメッセージ交換のメッセージがあっても、別のメッセージ交換グループに属している場合は取得されません。

WHERE 句がない RECEIVE ステートメントでは、ロックされていないメッセージ交換グループのうち最も優先度の高いグループのメッセージが取得されます。そのメッセージ交換グループに優先度の高いメッセージ交換と優先度の低いメッセージ交換が混在している場合は、RECEIVE ステートメントによって優先度の低いメッセージ交換のメッセージが取得される可能性があります。この現象は、他のグループに属している優先度の高いメッセージ交換のメッセージがキューに入っている場合でも発生することがあります。

RECEIVE ステートメントに WHERE 句があり、メッセージ交換グループが指定されている場合は、指定されたメッセージ交換グループのメッセージのみが取得されます。この場合は、他のメッセージ交換グループのメッセージの優先度に関係なく、グループ内の優先度の低いメッセージ交換のメッセージが取得されます。

現象 : メッセージに想定どおりの優先度が割り当てられない

sys.conversation_endpoint を参照して、メッセージ交換エンドポイントに想定どおりの優先度が割り当てられているかどうかを確認します。割り当てられていない場合は、sys.conversation_priorites を使用して、メッセージ交換エンドポイントに使用するコントラクト、ローカル サービス、およびリモート サービスに対してデータベース内で指定されているメッセージ交換の優先度のプロパティを確認します。