9

有人可以解释服务代理中的对话组吗?

目前,我正在使用服务代理将消息从一个 SQL 服务器发送到另一个。在发送服务器上,我正在尝试关联消息,以便在接收端对它们进行串行处理。根据文档,对话组似乎非常适合这一点,但在接收服务器上,消息被分配到与我在发送消息时指定的不同的对话组。

我在网上搜索,发现这种行为似乎是有意的(http://social.msdn.microsoft.com/forums/en-US/sqlservicebroker/thread/baf48074-6804-43ab-844a-cb28a6dce02b/) ,但后来我对来自(http://msdn.microsoft.com/en-us/library/ms178624.aspx)的语法的有用性感到困惑

WAITFOR( 
  GET CONVERSATION GROUP @conversation_group_id FROM [dbo].[ReceiveQueue]
)

如果会话组没有收到来自发件人的消息,并且使用相同会话组 id 发送的消息在接收端没有相同的会话组 id,那么上面的代码有什么意义?

4

1 回答 1

25

对话组是用于锁定的本地原语。会话组中的消息没有顺序保证,并且会话组不会通过网络传输。

消息顺序由 Service Broker 在对话中保证。因此,为了保持处理中相关消息的顺序,请在同一对话中发送它们。

需要对话组来对彼此相关的一组对话进行分组。GET CONVERSATION GROUP和动词都RECEIVE保证它们将锁定整个会话组,从而阻止任何其他线程处理相关消息。例如考虑一个旅游网站。它收到一条请求预订假期套餐的消息。结果,它发起与酒店预订服务的对话并发送预订房间的请求,它发起与航空公司预订服务的对话并请求旅行预订,它发起与汽车租赁代理服务的对话并请求预订汽车预订。它创建的这三个新对话都与收到请求的初始对话在同一个组中(应用程序使用了WITH RELATED_CONVERSATION所有 3 个上的BEGIN DIALOG子句)。然后它提交并继续处理队列中的消息。这 3 个相关请求的后续响应开始进入,几乎是随机的时间。假设酒店响应首先出现。该消息被应用程序接收,并继续使用酒店的响应更新请求的状态。与此同时,航空公司的响应进来了。如果允许另一个线程来接它,它会尝试更新相同的状态请求,从而导致处理酒店响应的线程阻塞甚至死锁。处理酒店响应时,线程提交并因此解锁整个对话组,允许任何线程(包括其自身)获取航空公司响应并处理它。

于 2009-08-21T20:43:13.143 回答