排除会话优先级的故障
本主题提供了与 Service Broker 会话优先级相关的常见故障解除建议。
方法:确定 HONOR_BROKER_PRIORITY 是否为 ON
使用 sys.databasesis_broker_priority_honored 列来确定 HONOR_BROKER_PRIORITY 数据库选项的状态:
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 System Monitor 计数器,了解具有不同优先级别的消息的传输速率。
症状:未按优先级顺序接收消息
RECEIVE 语句仅检索来自一个会话组的消息。 如果来自高优先级会话的消息属于另一个会话组,将不会接收这些消息。
不含 WHERE 子句的 RECEIVE 语句检索来自具有最高优先级且未锁定的会话组的消息。 如果会话组中既有高优先级会话又有低优先级会话,则 RECEIVE 语句可能会检索来自低优先级会话的消息。 即使队列中含有来自其他组中的高优先级会话的消息,也会发生上述情况。
如果 RECEIVE 语句含有指定某个会话组的 WHERE 子句,则该 RECEIVE 语句仅检索来自该指定会话组的消息。 无论来自其他会话组的消息的优先级如何,RECEIVE 语句都将检索来自该组中的低优先级会话的消息。
症状:未对消息分配预定的优先级别
查看 sys.conversation_endpoint 以了解是否对会话端点分配了预定的优先级别。 如果尚未分配,请使用 sys.conversation_priorites,并对照用于会话端点的约定、本地服务以及远程服务,检查为数据库中的会话优先级指定的属性。
另请参阅
- Broker:Remote Message Ack 事件类
- ALTER DATABASE SET 选项 (Transact-SQL)
- ALTER BROKER PRIORITY (Transact-SQL)
- CREATE BROKER PRIORITY (Transact-SQL)
- DROP BROKER PRIORITY (Transact-SQL)
- RECEIVE (Transact-SQL)
- SQL Server - Broker - DBM Transport 对象
- sys.conversation_priorities (Transact-SQL)
- sys.databases (Transact-SQL)
- sys.transmission_queue (Transact-SQL)
- 会话优先级
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈