2012-10-15 50 views
35

在高層次上不被髮送Service Broker消息,這裏是正在發生的事情:如果目標重新啓動

  1. 我們有兩個SQL Server 2008 R2 SP1系統(標準版在Windows NT 6.1(生成7601:服務包1)) 他們嗡嗡聲很好,雙向溝通,沒有任何錯誤或問題。
  2. 我們重新啓動系統#2,期望任何發送給它的Service Broker消息不可用時都會在系統#1上排隊,直到系統#2恢復運行。
  3. 系統#2恢復正常,所有內容都正常啓動,沒有錯誤。
  4. 系統#2在系統#1上排隊的消息保持排隊;他們從未被髮送。此外,該對話中的新消息也排隊等候,並且永遠不會發送。
  5. 在新對話中發送的消息傳輸得很好。

    A.雖然系統#2下來,transmission_status在表明它不能與系統#2通信的隊列表演各種錯誤的消息,如:對那些從來不發送的消息

詳細預期。

B.系統#2恢復後不久,這些消息的傳輸狀態變爲空白。在這之後,空白狀態不會改變。

C.消息堆疊的對話處於CONVERSING/CO狀態。系統視圖中沒有列表示任何與正常工作的其他隊列不同。 (如果我可以找到任何不同的標誌,我會知道終止不良對話,但系統不提供線索 - 除了不斷增長的隊列深度。)

D.系統從未接收到消息#2,因爲我的激活存儲過程永遠不會被調用這些消息。

E.在探查器(與所有經紀跟蹤類型開啓),一個良好的對話顯示出被記錄的這些東西:

Broker:Conversation CONVERSING 1 - SEND Message  Initiator          
Broker:Message Classify 2 - Remote Initiator 
[SQL Batch complete; SQL that caused the SEND to occur] 
Broker:Remote Message Acknowledgement 1 - Message with Acknowledgement Sent Initiator 
Broker:Message Classify  1 - Local Initiator 
Broker:Conversation CONVERSING 6 - Received Sequenced Message Target 
Broker:Remote Message Acknowledgement 3 - Message with Acknowledgement Received  Initiator 
Broker:Activation  Microsoft SQL Server Service Broker Activation 1 - Start 

被送到這也註定卡住顯示只有前兩個的消息這些事件:

Broker:Conversation CONVERSING 1 - SEND Message Initiator 
Broker:Message Classify 2 - Remote Initiator 

據我所知,這些消息得到更遠。沒有跡象表明SQL Server試圖再次傳輸它們。系統#1認爲對話仍然很好,但系統#2已經完全忘記了它。系統#1似乎從未想到這一點。如果我們隨後重啓系統#1,那麼一切都恢復正常,所有消息都按預期流動。

我認爲這些消息實際上已經發送,但確認沒有回到系統#1。但我沒有看到任何支持確認隊列的證據。

我們已經檢查了衆多的典型問題兩側:

經紀人是雙方啓用。 2.所有隊列都打開,啓用所有適當的事情(入隊,接收)。隊列不會中毒。 3.我們知道沒有權限問題存在。 4.我們沒有使用防火和忘記。 5.我們正在重複使用對話,正如各種人推薦的那樣。 (事實上​​,談話再利用的問題在這裏!) 6.我們捕獲SQL異常,使用事務處理的指示等 7 ssbdiagnose返回沒有錯誤。

當SQL Server主機重新啓動,我們預計,任何排隊的消息最終將被髮送,但事實並非如此。這裏發生了什麼??

+1

您可以將目標機器上的Profiler來看看什麼是重新啓動後發生了什麼?應該提出錯誤。 – Dalex

+0

您還應該聽取「安全審計 - >審計經紀人對話」和「安全審計 - >審計經紀人登錄」事件。請確保您在雙方都這樣做。另外,有趣的是SSBDiagnose.exe沒有檢測到任何SSB配置問題。 – Nabheet

+1

我發現代理在重新啓動或不工作時遇到了多個問題。最後,我決定使用一個普通隊列,在隊列中插入一條記錄,並使用消息代理髮送隊列項目標識。然後我還寫了一個定期的隊列處理程序。因此,在99%的情況下,所有消息代理都可以正常工作,在1%的錯誤消息中,基於時間的隊列處理程序會將其選中。 – Paul

回答

3

我理解,這是一個很老的線程,但我以前也打擊完全相同的情況下,在我的情況下,網絡配置是罪魁禍首。

出於某種原因,在發起人派出消息從一個IP地址,但是另一個IP已經開通接受傳入回覆(這第二個IP已經在目標的路線被指定)。

我曾偶然發現這個,真的。當我試圖結束對目標方的對話,它不是封閉的,而是中,EndDialog消息sys.transmission_queue出現了與狀態:

Connection attempt failed with error: '10060(A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.)'.

我不知道爲什麼目標重啓觸發了故障,但是當網絡工程師已經解決了這個問題,並且我改變了目標的路線,一切都從一開始就飛往目的地。

+0

僅供參考這個錯誤消息將被記錄到配置文件中[Broker:Connection Event Class](http://technet.microsoft.com/en-us/library/ms190760(v = sql.110)的.aspx)。 ['ssbdiagnose.exe'](http://msdn.microsoft.com/en-us/library/bb934450.aspx)'RUNTIME'還應該捕獲此事件並將其報告以及可能的更多診斷信息。 –

+0

@RemusRusanu - 對我來說很遺憾,當時我不知道這個工具。而且我們也嘗試實現可重用的對話框,因此在目標端關閉它們看起來不是一件明顯的事情。 –