2009-08-21 95 views
6

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

目前,我正在使用服务代理将消息从一台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] 
) 

如果谈话的用处组不会碰到来自发送方的消息,并且使用同一个对话组标识发送的消息在接收方没有相同的对话组标识,那么上面的代码有什么意义?

回答

18

对话组是用于锁定的本地原始对象。对话组内的消息没有订单保证,而对话组不会流过线路。

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

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

+1

谢谢。这就是我可以在网上找到的最佳解释。也许这只是我,但关于此功能的Microsoft MSDN文档似乎非常模糊。有关如何序列化接收队列上的消息处理的任何建议?我发送的消息可能会更新接收端的单个记录。这些消息来自不同的来源,因此不能成为同一对话的一部分。我需要确保在接收端相互关联的消息按顺序和顺序处理。 – 2009-08-21 23:08:38

+2

目标可以使用MOVE CONVERSATION将会话分组。然后,它可以将任何“新”对话转移到适当的组中。另一种方法是反转对话启动:'后端'启动对话(并因此控制他们的分组),并且'前端'在对话的*目标*端点上发送。如果后端无法知道最终名称/位置,则可以通过前端发送一条意思为'请在此地址订阅我'的消息来触发'启动'。适当的解决方案取决于您的方案的具体情况。传一个电子邮件给我。 – 2009-08-21 23:50:18

+0

是的,移动对话方法就是我们目前正在研究的方法。担心的是,由于移动会话锁定了目标会话组,并通过对话组获取消息来锁定关联的会话组,所以我们可能会陷入死锁状态。我们正在尝试解决这个问题。感谢您的洞察力。 – 2009-08-24 16:06:46

相关问题