在高層次上不被髮送Service Broker消息,這裏是正在發生的事情:如果目標重新啓動
- 我們有兩個SQL Server 2008 R2 SP1系統(標準版在Windows NT 6.1(生成7601:服務包1)) 他們嗡嗡聲很好,雙向溝通,沒有任何錯誤或問題。
- 我們重新啓動系統#2,期望任何發送給它的Service Broker消息不可用時都會在系統#1上排隊,直到系統#2恢復運行。
- 系統#2恢復正常,所有內容都正常啓動,沒有錯誤。
- 系統#2在系統#1上排隊的消息保持排隊;他們從未被髮送。此外,該對話中的新消息也排隊等候,並且永遠不會發送。
- 在新對話中發送的消息傳輸得很好。
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主機重新啓動,我們預計,任何排隊的消息最終將被髮送,但事實並非如此。這裏發生了什麼??
您可以將目標機器上的Profiler來看看什麼是重新啓動後發生了什麼?應該提出錯誤。 – Dalex
您還應該聽取「安全審計 - >審計經紀人對話」和「安全審計 - >審計經紀人登錄」事件。請確保您在雙方都這樣做。另外,有趣的是SSBDiagnose.exe沒有檢測到任何SSB配置問題。 – Nabheet
我發現代理在重新啓動或不工作時遇到了多個問題。最後,我決定使用一個普通隊列,在隊列中插入一條記錄,並使用消息代理髮送隊列項目標識。然後我還寫了一個定期的隊列處理程序。因此,在99%的情況下,所有消息代理都可以正常工作,在1%的錯誤消息中,基於時間的隊列處理程序會將其選中。 – Paul