BizTalk Server 如何處理大型訊息
何謂大型訊息?
不幸的是,此問題的答案不會直接系結至特定訊息大小,而是取決於 Microsoft BizTalk Server 系統中的特定瓶頸。 與大型訊息相關的問題可分為下列類別:
記憶體不足錯誤 某些類型的訊息處理 - 例如對應、驗證和屬性升級 - 將整個訊息載入記憶體中。 若記憶體中的訊息大小超過可用資源,則會發生記憶體不足錯誤。 屬於此類型的訊息之大小閾值遠低於未載入記憶體的訊息之大小閾值。 例如,一個 10 MB 的一般檔案剖析為 XML 並對應後,可能會成長 10 倍或更多,而耗用超過 100 MB 的記憶體,但是一個未剖析或對應的 100 MB 的 XML 文件事實上可能僅耗用 1 MB 的記憶體,因為它會串流至 MessageBox 資料庫。
未載入記憶體之訊息的效能問題 不需要載入記憶體的訊息會使用 .NET XmlReader 介面串流至 MessageBox 資料庫。 雖然它們未受到必須載入記憶體的訊息之大小限制,但是有一些重要因素會影響 BizTalk Server 處理串流至 MessageBox 資料庫之資料的方式。
影響大型訊息處理的因素
原始訊息大小、訊息格式以及訊息處理類型都會影響 BizTalk Server 處理大型訊息的方式。
原始訊息大小BizTalk Server所接收的訊息大小,是訊息處理BizTalk Server時訊息大小的最可見指示。 在整個訊息均載入記憶體時,訊息的原始大小對效能的影響遠大於在訊息串流至 MessageBox 資料庫時其對效能的影響。
訊息格式訊息會以兩種主要格式的其中一種接收BizTalk Server:XML 檔案或一般檔案。
XML 檔案為了讓BizTalk Server對傳遞路由以外的訊息執行任何處理,訊息必須是 XML 檔案格式。 若要處理的檔案以 XML 格式接收,則大部分會保留原始大小。
一般檔案一般檔案必須先剖析成 XML 格式,BizTalk Server才能執行傳遞路由以外的任何處理。 將一般檔案剖析為 XML 檔案會大幅增加檔案大小。 一般檔案不包含 XML 標記及其資料的描述性資訊。 另一方面,XML 檔案會將其所有資料包裝在描述性 XML 標籤中。 在部分實例中,剖析會使一般檔案的大小增加 10 倍或更多,視該檔案的 XML 標記中包含的描述性資料多寡而定。
XML 檔中單一 CDATA 區段節點中包裝的一般檔案檔這種類型的檔是 XML 和一般檔案的組合,而且可能會造成問題,因為BizTalk Server必須先將整個包裝的一般檔案檔載入記憶體中,才能進行處理。
訊息處理的類型在BizTalk Server中,有兩種類型的訊息處理:僅限路由和對應。 繫結至執行的訊息處理類型之效能變數是訊息大小以及訊息是否載入記憶體。
僅限路由如果BizTalk Server僅用於根據升級的訊息屬性來路由傳送訊息,則訊息會使用 .NET XmlReader 介面串流至 Messagebox 資料庫,而且訊息部分不會個別載入記憶體中。 在此案例中,記憶體不足錯誤將不是問題,而主要的考量是將非常大型的訊息 (超過 100 MB) 寫入 MessageBox 資料庫所需的時間量。 BizTalk Server 開發團隊已成功測試,在僅執行路由時處理高達 1 GB 大小的訊息。
決定此案例效能的主要因素是用來將資料分割到資料庫中的大型 訊息片段大小 。 [大型訊息片段大小] 是BizTalk 群組屬性設定頁面上的可設定選項,預設值為 102400 個位元組, (100 KB) 。 增加此值會降低將訊息串流至 MessageBox 資料庫所需的往返次數。
映射 使用地圖轉換檔可能是需要大量記憶體的作業。 當檔由地圖轉換時,BizTalk Server將訊息傳遞至 .Net XSLCompileTransform 類別,以載入 XSL 樣式表單。 Load 方法成功完成之後,可以從多個執行緒同時呼叫 Transform 方法。 XslCompiledTransform 類別 提供有關 XSLCompiledTransform 類別的詳細資訊。
BizTalk Server藉由實作可在轉換期間將檔載入記憶體的可設定訊息大小閾值,大幅改善大型檔的記憶體管理。 大小低於此閾值的任何訊息都會在記憶體中處理,而大小大於此閾值的任何訊息則會緩衝至檔案系統,以降低記憶體需求。 預設訊息大小閾值是 1 MB。
處理大型訊息的指導方針
請遵循這些指導方針,以改善在 BizTalk Server 中處理大型訊息的效能:
調整訊息大小閾值,若在對應期間超過此閾值,則將文件緩衝至檔案系統。 若要修改大小閾值,請在BizTalk Server登錄的下列位置建立名為TransformThreshold的 DWORD 值:
HKLM\Software\Microsoft\BizTalk Server\3.0\Administration\TransformThreshold
建立此值之後,輸入十進位值的位元組數目,以設定新的閾值。 例如,輸入十進位值 2097152,以增加訊息大小閾值至 2 MB (從預設的 1 MB)。 以大量可用的記憶體增加系統上的此值來改善輸送量。 將文件緩衝至磁碟機,以耗用整體輸送量成本的方式來節省記憶體。
注意
根據預設,對應期間緩衝至檔案系統的檔會寫入BizTalk Server電腦的%temp%目錄。 將 %temp% 環境變數的設定變更為非系統磁片,以改善在對應期間將大型訊息緩衝處理至檔案系統時的效能。
讓協調流程中使用的對應最小化:
若您在協調流程中使用對應擷取或設定與商務邏輯搭配使用的屬性,請改以辨別欄位或升級屬性取代。 使用對應擷取或設定值時,文件會載入記憶體。 使用辨別欄位或升級屬性時,協調流程引擎會存取訊息內文而不會將文件載入記憶體。
若您使用對應將數個欄位彙總成一個欄位,請使用辨別欄位或升級屬性搭配協調流程變數,以累計結果集。
請勿將協調流程設定為含有多個轉換圖形輸入。 含有多個轉換圖形輸入的協調流程在對應時不會串流至檔案系統。 如果文件大小超過指定的 TransformThreshold 登錄值,這項限制將導致要對應的整份文件均載入記憶體。 這個問題可行的解決方法之一就是在接收埠層級套用轉換,如此一來,協調流程將永不接受一個以上的轉換圖形輸入。
調整BizTalk 群組屬性組態頁面上公開的大型訊息片段大小屬性:
如果所接收訊息的記憶體內部大小超過針對 大型訊息片段 大小指定的位元組數目,訊息就會分割成指定大小的片段,而片段會寫入到 MsDTC (MSDTC) 交易內容下的 MessageBox,如下所示:
若內送訊息正在現有 MSDTC 交易的環境下發佈,則會在將訊息分割寫入 MessageBox 時,使用此交易。 例如,若內送訊息由設定為必要交易的交易配接器發佈,則在將訊息分割寫入 MessageBox 時,會使用現有的交易。
若內送訊息不在現有 MSDTC 交易的環境下發佈,則會建立新的 MSDTC 交易以寫入訊息分割。
增加 大型訊息片段大小 的值,以減少大型訊息分散的頻率,並減少建立相關聯 MSDTC 交易的發生頻率。 您應該執行此動作,因為從效能觀點來看,過度使用 MSDTC 交易的代價很高。 請注意,增加此值也可能增加使用的可用記憶體量。
若將訊息寫入 MessageBox 所花費的時間超過 MSDTC 交易逾時允許的上限 (60 分鐘),則交易會逾時、導致錯誤,且寫入訊息的嘗試會失敗並回復。 大型訊息片段大小值應該增加到足以避免在處理非常大的訊息時發生此問題。 視可用的記憶體而定,此值最多可增加到 1000000 個位元組的值。
訊息中的每個訊息分割都會對 MessageBox 資料庫建立一或多個 SQL Server 資料庫鎖定。 當鎖定數目超過數十萬時,SQL Server 可能會開始產生「鎖定不足」錯誤。 如果發生此問題,請增加大型訊息片段大小,以減少針對 MessageBox 資料庫進行的SQL Server資料庫鎖定數目。
若發生「鎖定不足」錯誤,請考慮將您的 MessageBox 資料庫儲存在 64 位元版本的 SQL Server 上。 在 64 位元版本的 SQL Server 上,可用的鎖定數目大幅提高。
調整BizTalk 群組屬性組態頁面上公開的大型訊息閾值屬性:
當處理訊息批次時,如果訊息批次的記憶體內部大小達到為 大型訊息閾值 指定的位元組數,則會在處理訊息批次的其餘部分之前寫入 MessageBox。 此動作是在 MSDTC 交易環境下執行,如下所示:
若訊息批次正在現有 MSDTC 交易的環境下發佈,則會在將處理的訊息批次部分寫入 MessageBox 時,使用此交易。 例如,若內送訊息批次由設定為必要交易的交易配接器發佈,則在將處理的訊息批次部分寫入 MessageBox 時,會使用現有的交易。
若訊息批次不在現有 MSDTC 交易的環境下發佈,則必須建立新的 MSDTC 交易,以將訊息批次部分寫入 MessageBox。 使用 MSDTC 交易可確保指定的訊息批次之所有部分均成功寫入 MessageBox 資料庫。
大型訊息閾值設定直接適用于訊息批次,但因為訊息批次可以設定為一個值,所以大型訊息閾值設定也可以間接套用至個別訊息。 例如,當一個訊息的訊息批次超過指定的 大型訊息閾值 參數時, 大型訊息閾值 實際上只會套用至批次中的單一訊息。
應該調整 大型訊息閾值 參數,以減輕 MSDTC 交易的建立,以將訊息批次分派至 MessageBox。 您應該執行此動作,因為從效能觀點來看,過度使用 MSDTC 交易的代價很高。 使用下列計算來判斷 [大型訊息閾值 ] 設定的最小值,以避免不必要的建立 MSDTC 交易:
Batch Size * Average size (in bytes) of each message in the batch after being processed by the receive pipeline < Large message threshold
只要訊息批次的位元組大小總計未超過 大型訊息閾值 的指定值,則不需要 BizTalk 起始 MSDTC 交易,以將訊息批次分派至 MessageBox 資料庫。