2013-08-05 42 views
1

我們有四個生產envionment的Biztalk服務器。 sendport被配置爲將傳入消息寫入一個文本文件中。該端口在一天內收到數千條消息。因此,多個主機實例嘗試一次寫入文件,在一個實例完成寫入完整記錄之前,另一個實例開始寫入新記錄,從而導致分散在整個文件中的數據。多個Biztalk主機實例寫入單個文件

我們能做些什麼來解決這個問題?

+0

兩個簡短的問題 - 1.爲什麼你需要寫一個單一的文件?你的業務流程是什麼? 2.如果消息A寫入磁盤,然後消息B立即寫入磁盤(覆蓋消息A的內容),這是可以接受的嗎? –

+0

這些是個人記錄。我們將單天內收到的所有記錄放入單個文件中。信息A被信息B覆蓋是不可接受的,因爲這可能會導致數據丟失。現在,在A的記錄結束之前,消息B開始寫入。我看到許多網站提到使用Biztalk主機羣集來防止在FTP適配器的情況下數據重複。但我正在使用文件適配器。 – user1410074

回答

0

您可以移動到數據庫系統而不是文件。這將是非常簡單的解決方案,也非常有效。 如果你不想這樣,你必須在應用程序內部實現文件鎖定或semaphore,這樣新線程將等待其他線程完成寫入。

+0

感謝您的回覆。但是sendport使用FileAdapter來寫入該文件。我們不能使用數據庫。在EOD時,該文件被備份並且ftp到另一個位置。使用Sempaphore你的意思是編寫自定義適配器? – user1410074

+0

這將最有可能被要求,以實現你想要做的事情。 –

+0

謝謝Puciek ..我只是想確認這一點...是否有意說寫入自定義適配器是實現這一目標的唯一選擇?文件適配器默認不鎖定文本文件。 – user1410074

3

...在一個實例完成寫入完整記錄之前,另一個實例開始寫入新記錄,導致數據分散到整個文件中。

我們能做些什麼來解決這個問題?

簡單的方法是隻使用一個主機實例將數據寫入文件,但是您可能會開始遇到限制問題。或者,您可以探索使用文件適配器上的「允許寫入緩存」選項,該選項可能會提供一些改進。

但是,我認爲你的方法是錯誤的。您不能指望四個單獨的完全斷開的進程(跨4臺服務器)不能夠可靠地追加到單個文件 - IN命令。

因此,我想你應該重新架構此解決方案:

  1. 每收到一個消息,與「未處理」標誌寫郵件到數據庫表中的內容(一個簡單的INSERT)。您可以可靠地將四個主機實例綁定到SQL中,而不用擔心它們彼此跳動。
  2. 在預定的時間,讓BizTalk提取在該SQL表中標記爲未處理的所有記錄(WCF-SQL適配器可以在此處爲您提供幫助)。一旦你調查了記錄,將它們標記爲「正在處理」。
  3. 您現在應該有一條包含所有當前未處理記錄(從SQL中檢索)的消息。使用單個(或多個)Host Instance/s,將消息寫入磁盤,並將每個記錄附加到文件中進行一次寫入。這裏的關鍵是,你只寫一個單個消息到一個文件,不是很多很多很多:-)
  4. 如果寫入成功,更新SQL表中的每個記錄與'處理'標誌,以便在下次調查中不會再次出現。

您可能想要考慮一件單件編排,以確保只有一次輪詢寫入更新過程在同一時間發生。

1

如果FIFO很重要,BizTalk已經訂購了交付機制(支持FILE適配器),但它的性能價格很高。

更好的解決方案是讓實例寫入單個文件,然後讓另一個計劃進程(或編排)將它們合併到一個文件中。您可以使用時間戳執行FIFO。這將提供更好的性能和資源利用率與前面提到的單身編排。其他選項可能正在使用任何合適的隊列實現。