2009-08-21 93 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

相關問題