对话句柄应该在Service Broker的每一端都相同吗?

Sim*_*wsi 2 sql-server service-broker

我是Service Broker的新手.我们已经建立了一个似乎运作良好的开发系统.

我注意到的一件奇怪的事情是,Service Broker每端的审计表中的会话句柄对于同一消息是不同的.我假设发起者和目标结束时会使用相同的会话句柄,所以我想知道我们是否配置错误.

单个消息在会话的每一端都有不同的会话句柄是否正常?

Rem*_*anu 6

有一个conversation_id,两个端点都是一样的.

并且存在conversation_handle,每个端点必须不同.在启动器和目标位于同一数据库中的非常简单的情况下进行思考.如果conversation_handle是相同的话,那么当你发出一个端点时,你的意思是不明确的SEND.您是从发起人发送到目标,还是从目标发送到发起人?如果手柄是一样的,无法分辨!因此手柄必须不同.

您始终在应用程序中进行交互conversation_handle.这是传递给你的T-SQL语句(该值SEND,END,MOVE),这就是BEGIN DIALOG回报.句柄值永远不会离开框(不是消息线格式的一部分).

conversation_id主要在调试中使用.它可用于标识远程计算机上的对等转换终结点,它可用于标识SQL事件探查器(代理事件类别)中与消息相关的事件中的对话.

在你经历了这个A-ha时刻之后,很快就会被一个conversation_group总是在本地的事实所迷惑,并且不会在电线上行进.之前有人问过,请阅读13140506434464.

还有一个id:the message_id.这将在此期间分配给消息SEND.它通过电线传输,仅用于调试和故障排除.例如.它在Broker中的功能:转发的消息丢弃事件类.


Sim*_*wsi 5

我一直在网上寻找有关这方面的确切信息。这是我发现的:

在对话的每一端,对话句柄肯定是不同的。它们唯一地标识了对话的终点,而不是整个对话。session_id 是会话两端共享的会话标识。

这是sys.conversation_endpoints的联机丛书条目。它说:

对话句柄此对话端点的标识符。(强调我的)

session_id对话的标识符。此标识符由对话中的两个参与者共享。(强调我的)

此外,Microsoft 有一个 PDF 在线文档,其中包含由Service Broker的程序经理 Roger Wolter 编写的The Rational Guide To SQL Server 2005 Service Broker一书示例章节。对于可以阅读本书的读者,这是第 2 章,对话Conversation Persistence部分有关于session_ids 的解释以及为什么会话句柄在会话的每一端必须不同:

session_id — 这是对话的“在线”标识符。该标识符包含在通过网络发送的每条消息中。此会话的每条消息在其标头中都有此唯一标识符,以便端点知道消息属于哪个会话。此时,您可能想知道何时使用对话句柄而不是另一个唯一标识符。当对话的两个端点都在同一个数据库中时(就像它们在第 1 章的 ISBN 查找示例中一样),表中将有两行用于同一个对话。因此,我们需要两个句柄作为键。