2012-07-18 26 views
0

技術機器使用SQL Server Express來收集溫度等數據......數據庫每隔幾秒鐘更新一次(即低流量)。該機器及其SQL Server必須獨立工作。技術計算機(即SQL Server)有時會被機器關閉。Service Broker - 如何發送帶有收集數據的表格? XML消息還是不是?

中央SQL Server標準版應該從上述許多機器收集數據。

你會推薦什麼樣的場景?

  • 機器在創建時發送每個新行(即每隔幾秒鐘一行)。
  • 機器激活每小時發送數據的過程,並將所有行與新收集的數據一起發送。
  • 還有其他的方法嗎?

如果我很好地理解Service Broker的想法,將會有一個單一的請求消息類型名稱,一個單一的回覆消息類型名稱,一個合同名稱。 SQL機器上的相關數據庫將分別具有一個消息隊列和相關服務。

我對Service Broker很新。教程示例顯示如何以XML片段發送消息。發送表格的行是真實世界的方式嗎?如何可靠地將SELECT命令的結果轉換爲XML片段並返回?

感謝,切赫

注意:的相關問題Service Broker — how to extract the rows from the XML message?已創建。

回答

3

我還建議發送數據庫更新時,插入每條消息一條消息(每條語句中的一條消息,如JAnis所建議的,來自觸發器的消息也可以正常使用,如果INSERT語句不在一行中插入大量行聲明)。

爲什麼發送很多小消息而不是一個大消息更好呢是因爲在RECEIVE上處理一個XML負載比處理許多小型XML負載的效率要低。

我已經看到類似的部署到你想要做的事情,請參閱High Volume Contigous Real Time Audit And ETL。我也建議你閱讀Reusing Conversations

Service Broker將很好地處理Express實例的開啓和關閉或長時間斷開連接。它將簡單地保留髮送的消息並在連接恢復後交付它們。您必須確保Express的the 10GB max database size limit足以在需要時保留消息,直到連接恢復。

如果Express在每次連接時顯示爲不同的DNS名稱(認爲是連接家中,辦公室和星巴克的筆記本電腦),Service Broker將處理得不好。 Service Broker使用數據庫路由將中央服務器的ack發送到Express實例,並且路由需要靜態DNS。從中央服務器可以訪問Express實例也是非常重要的(即不在網絡地址轉換之後)。對於移動實例(前面提到的筆記本電腦),動態名稱和大多數時間從NAT後面連接的事實都會導致問題。使用VPN可以解決這些問題,但是很麻煩。

+0

謝謝!好。保持發送站點儘可能簡單似乎是合理的 - 即通過Service Broker導致發送每個新行的觸發器。如果Express機器等待任何答覆,這有意義嗎?問題是單向發送數據。備註:Express和Standard服務器將在一種物理上固定的環境中工作。 10 GB也綽綽有餘。這裏沒問題。 – pepr 2012-07-19 08:32:05

+0

Express應處理回覆,例如。它應該有一個激活的過程附加到其發件人隊列。即使在這種單向流量的情況下,也會有一個回覆:EndDialog應該由您的centrasl標準服務器發送。閱讀http://rusanu.com/2006/04/06/fire-and-forget-good-for-the-military-but-not-for-service-broker-conversations/瞭解爲什麼Express會結束對話首先是危險的。 – 2012-07-19 09:07:33

+0

順便說一句,即使在處理雙向流量時,也不應該等待SSB的回覆。永遠不要'發送'然後'等待(接收)'等待迴應。答覆可能會在幾分鐘,幾小時甚至幾天後發生(認爲中央服務器剛剛發生故障並花了24小時將其恢復在線狀態)。 SSB應用程序應該由異步事件驅動。 – 2012-07-19 09:09:51

2

那麼,如果你在觸發器中實現行發送,那麼發送實際上發生然後(不是偶爾)。通過激活在一段時間過程(接收)一旦你可以隨時過程中收集的接收器端的消息..

要發送行(S)爲XML,你可以在觸發器使用的語句:

Declare @msg XML; 
Set @msg = 
    (
     Select * from Inserted FOR XML RAW, Type 
    ) 

然後就是發送一個消息。

+0

謝謝!如果我理解得很好,那麼'FOR XML RAW,TYPE'就是Microsoft特定的擴展。什麼是獲取生成的XML行(作爲收到的消息)的反向操作,並將適當的值插入另一側的表中?如果我理解得很好,那麼結果就是XML類型的一個值,可能有許多行用XML元素表示。我如何分割該XML值? – pepr 2012-07-19 08:24:32

+0

在我的例子中row是元素,columns是屬性。但您可以通過添加「ELEMENS」來重寫示例,然後列也將是元素。您可以使用XML數據類型的「value」方法獲取數據 - @ msg.value('(Row/@ ID)[1]','int')。 – 2012-07-19 08:49:02

+0

@Janis:請在更新後的問題末尾註意對相關問題的引用(http://stackoverflow.com/q/11563452/1346705)。 – pepr 2012-07-19 14:55:58

相關問題