3

我是 Service Broker 的新手。我们已经建立了一个看起来运行良好的开发系统。

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

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

4

3 回答 3

8

有一个conversation_id,在两个端点都相同。

还有conversation_handle, 每个端点都必须不同。考虑一个非常简单的场景,即发起者和目标在同一个数据库中。如果conversation_handle相同,那么当您发出SEND. 您是从发起者发送到目标,还是从目标发送到发起者?如果手柄相同,则无法区分!因此,手柄必须不同。

您总是在您的应用程序中与conversation_handle. 这是您传递给 T-SQL 语句 ( SEND, END, MOVE) 的值,这就是BEGIN DIALOG返回的值。句柄值永远不会离开框(不是消息线格式的一部分)。

conversation_id主要在调试中使用。它可用于识别远程计算机上的对等会话端点,可用于识别 SQL Profiler(代理事件类别)中消息相关事件中的会话。

在您度过这个令人惊叹的时刻后,很快您就会对conversation_group始终是本地的并且不会在电线上行驶的事实感到困惑。之前在这里问过,请阅读13140506434464

还有一个 id message_id:. 这在 期间分配给消息SEND。它在电线上传输,仅用于调试和故障排除。例如。它在Broker:Forwarded Message Dropped Event Class中具有特色。

于 2013-10-18T07:14:07.017 回答
5

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

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

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

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

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

此外,Microsoft 有一个 PDF 在线文档,其中包含由 Service Broker的项目经理 Roger Wolter 编写的The Rational Guide To SQL Server 2005 Service Broker一书的示例章节。对于那些可以访问这本书的人,这是第 2 章,对话Conversation Persistence部分解释了 conversation_ids 以及为什么对话句柄在对话的每一端都必须不同:

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

于 2013-10-18T04:21:20.673 回答
1

当我第一次开始使用服务代理时,这让我感到困惑,但你没有看到任何东西 - id 在每一端都是不同的。

我对此进行了很多思考(找不到任何明确的文档)并提出以下推理。对话 ID 实际上是一个相关标识符,它在服务边界内对消息进行逻辑分组,即在发送方或接收端,因此没有令人信服的理由说明双方的 ID必须相同(即使这将是方便调试)。

如果没有充分的理由说明它们应该相同,那么它们不同是有道理的。如果您在没有创建 GUID 的机器上使用 GUID 冲突,那么发生 GUID 冲突的可能性很小,所以我猜他们认为最好生成一个新的。

[很高兴被任何对此了解更多的人纠正......]

于 2013-10-16T23:43:29.770 回答