有人可以解释服务经纪人中的对话组吗?
目前,我正在使用服务代理将消息从一个SQL服务器发送到另一个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,那么上面的代码有什么意义?< / p>
答案 0 :(得分:21)
会话组是用于锁定的本地原语。会话组中的消息没有订单保证,并且会话组不会通过网络传输。
消息顺序由对话中的Service Broker保证。因此,为了在处理过程中保留corrleated消息的顺序,请在同一个对话中发送它们。
需要对话组来填充彼此相关的一组对话。 GET CONVERSATION GROUP
和RECEIVE
动词都保证它们将锁定整个转换组,从而阻止任何其他线程处理相关消息。例如,考虑旅行网站。它会收到一条消息,其中包含预订假期套餐的请求。因此,它启动与酒店预订服务的对话并发送预订房间的请求,它启动与航空公司预订服务的对话并要求旅行预订,它启动与汽车租赁代理服务的对话并要求汽车预订。它创建的这三个新会话都与收到请求的初始会话位于同一个组中(应用程序在所有3个会话中使用了BEGIN DIALOG的WITH RELATED_CONVERSATION
子句)。然后它提交并继续处理队列中的消息。来自这3个相关请求的后续响应开始在几乎随机的时间进入。说酒店的resposnse先进来。该消息被应用程序接收,并继续使用酒店的响应更新请求的状态。同时,航空公司的响应进来。如果允许另一个线程接收它,它将尝试更新相同的请求的状态,从而导致阻塞甚至死锁正在处理酒店回复的主题。当处理酒店响应时,线程提交并因此解锁整个会话组,允许任何线程(包括其自身)接收航空公司响应并处理它。