我們有四個生產envionment的Biztalk服務器。 sendport被配置爲將傳入消息寫入一個文本文件中。該端口在一天內收到數千條消息。因此,多個主機實例嘗試一次寫入文件,在一個實例完成寫入完整記錄之前,另一個實例開始寫入新記錄,從而導致分散在整個文件中的數據。多個Biztalk主機實例寫入單個文件
我們能做些什麼來解決這個問題?
我們有四個生產envionment的Biztalk服務器。 sendport被配置爲將傳入消息寫入一個文本文件中。該端口在一天內收到數千條消息。因此,多個主機實例嘗試一次寫入文件,在一個實例完成寫入完整記錄之前,另一個實例開始寫入新記錄,從而導致分散在整個文件中的數據。多個Biztalk主機實例寫入單個文件
我們能做些什麼來解決這個問題?
您可以移動到數據庫系統而不是文件。這將是非常簡單的解決方案,也非常有效。 如果你不想這樣,你必須在應用程序內部實現文件鎖定或semaphore,這樣新線程將等待其他線程完成寫入。
感謝您的回覆。但是sendport使用FileAdapter來寫入該文件。我們不能使用數據庫。在EOD時,該文件被備份並且ftp到另一個位置。使用Sempaphore你的意思是編寫自定義適配器? – user1410074
這將最有可能被要求,以實現你想要做的事情。 –
謝謝Puciek ..我只是想確認這一點...是否有意說寫入自定義適配器是實現這一目標的唯一選擇?文件適配器默認不鎖定文本文件。 – user1410074
...在一個實例完成寫入完整記錄之前,另一個實例開始寫入新記錄,導致數據分散到整個文件中。
我們能做些什麼來解決這個問題?
簡單的方法是隻使用一個主機實例將數據寫入文件,但是您可能會開始遇到限制問題。或者,您可以探索使用文件適配器上的「允許寫入緩存」選項,該選項可能會提供一些改進。
但是,我認爲你的方法是錯誤的。您不能指望四個單獨的完全斷開的進程(跨4臺服務器)不能夠可靠地追加到單個文件 - IN命令。
因此,我想你應該重新架構此解決方案:
您可能想要考慮一件單件編排,以確保只有一次輪詢寫入更新過程在同一時間發生。
如果FIFO很重要,BizTalk已經訂購了交付機制(支持FILE適配器),但它的性能價格很高。
更好的解決方案是讓實例寫入單個文件,然後讓另一個計劃進程(或編排)將它們合併到一個文件中。您可以使用時間戳執行FIFO。這將提供更好的性能和資源利用率與前面提到的單身編排。其他選項可能正在使用任何合適的隊列實現。
兩個簡短的問題 - 1.爲什麼你需要寫一個單一的文件?你的業務流程是什麼? 2.如果消息A寫入磁盤,然後消息B立即寫入磁盤(覆蓋消息A的內容),這是可以接受的嗎? –
這些是個人記錄。我們將單天內收到的所有記錄放入單個文件中。信息A被信息B覆蓋是不可接受的,因爲這可能會導致數據丟失。現在,在A的記錄結束之前,消息B開始寫入。我看到許多網站提到使用Biztalk主機羣集來防止在FTP適配器的情況下數據重複。但我正在使用文件適配器。 – user1410074