我是 Service Broker 的新手。我们已经建立了一个看起来运行良好的开发系统。
我注意到的一件奇怪的事情是,Service Broker 每一端的审计表中的对话句柄对于同一条消息是不同的。我假设发起者和目标端将使用相同的对话句柄,所以我想知道我们是否配置错误。
单个消息在对话的每一端都有不同的对话句柄是否正常?
我是 Service Broker 的新手。我们已经建立了一个看起来运行良好的开发系统。
我注意到的一件奇怪的事情是,Service Broker 每一端的审计表中的对话句柄对于同一条消息是不同的。我假设发起者和目标端将使用相同的对话句柄,所以我想知道我们是否配置错误。
单个消息在对话的每一端都有不同的对话句柄是否正常?
有一个conversation_id
,在两个端点都相同。
还有conversation_handle
, 每个端点都必须不同。考虑一个非常简单的场景,即发起者和目标在同一个数据库中。如果conversation_handle
相同,那么当您发出SEND
. 您是从发起者发送到目标,还是从目标发送到发起者?如果手柄相同,则无法区分!因此,手柄必须不同。
您总是在您的应用程序中与conversation_handle
. 这是您传递给 T-SQL 语句 ( SEND
, END
, MOVE
) 的值,这就是BEGIN DIALOG
返回的值。句柄值永远不会离开框(不是消息线格式的一部分)。
您conversation_id
主要在调试中使用。它可用于识别远程计算机上的对等会话端点,可用于识别 SQL Profiler(代理事件类别)中消息相关事件中的会话。
在您度过这个令人惊叹的时刻后,很快您就会对conversation_group
始终是本地的并且不会在电线上行驶的事实感到困惑。之前在这里问过,请阅读1314050或6434464。
还有一个 id message_id
:. 这在 期间分配给消息SEND
。它在电线上传输,仅用于调试和故障排除。例如。它在Broker:Forwarded Message Dropped Event Class中具有特色。
我一直在网上寻找有关此的确切信息。这是我发现的:
在对话的每一端,对话句柄肯定是不同的。它们唯一地标识对话的端点,而不是整个对话。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 查找示例中一样),表中将有两行用于同一个会话。因此,我们需要两个句柄作为键。
当我第一次开始使用服务代理时,这让我感到困惑,但你没有看到任何东西 - id 在每一端都是不同的。
我对此进行了很多思考(找不到任何明确的文档)并提出以下推理。对话 ID 实际上是一个相关标识符,它在服务边界内对消息进行逻辑分组,即在发送方或接收端,因此没有令人信服的理由说明双方的 ID必须相同(即使这将是方便调试)。
如果没有充分的理由说明它们应该相同,那么它们不同是有道理的。如果您在没有创建 GUID 的机器上使用 GUID 冲突,那么发生 GUID 冲突的可能性很小,所以我猜他们认为最好生成一个新的。
[很高兴被任何对此了解更多的人纠正......]