BizTalk Server がサイズの大きなメッセージを処理する方法

サイズの大きなメッセージとは何ですか?

残念ながら、この質問に対する答えは、特定のメッセージ サイズに直接関連付けられているのではなく、Microsoft BizTalk Server システムの特定のボトルネックによって異なります。 サイズの大きなメッセージに関係する問題は、次のカテゴリに分類できます。

  • メモリ不足エラー マッピング、検証、プロパティの昇格など、特定の種類のメッセージ処理では、メッセージ全体をメモリに読み込みます。 メモリのメッセージのサイズが使用できるリソースを超えると、メモリ不足のエラーが発生します。 このカテゴリに分類されるメッセージのサイズのしきい値は、メモリに読み込まれないメッセージのサイズのしきい値よりも大幅に小さくなります。 たとえば、XML に解析されてマップされる 10 MB のフラット ファイルは、10 倍以上大きくなって 100 MB 以上のメモリを使用する場合があります。一方、解析されないでマップされる 100 MB の XML ドキュメントは、メッセージ ボックス データベースにストリーム送信される際に 1 MB のメモリのみ使用します。

  • メモリに読み込まれていないメッセージのパフォーマンスの問題 メモリに読み込む必要のないメッセージは、.NET XmlReader インターフェイスを使用して MessageBox データベースにストリーミングされます。 メモリに読み込む必要のあるメッセージのようなサイズ制限はありません。その一方で、メッセージ ボックス データベースにストリーム送信されるメッセージを BizTalk Server が処理する方法に影響する重要な要因がいくつかあります。

サイズの大きなメッセージの処理に影響を及ぼす要因

元のメッセージのサイズ、メッセージ形式、およびメッセージ処理の種類は、すべて BizTalk Server がサイズの大きなメッセージを処理する方法に影響を与えます。

  • 元のメッセージ サイズBizTalk Serverが受信したメッセージのサイズは、メッセージがBizTalk Serverによって処理されるときにメッセージの大きさを示す最も目に見える指標です。 メッセージの元のサイズは、メッセージがメッセージ ボックス データベースにストリーム送信される場合よりもメッセージ全体がメモリに読み込まれる場合に、パフォーマンスに大きな影響を及ぼします。

  • メッセージ形式メッセージは、XML ファイルまたはフラット ファイルの 2 つの主な形式のいずれかでBizTalk Serverに受信されます。

    • XML ファイルBizTalk Serverがパススルー ルーティング以外のメッセージに対して処理を実行するには、メッセージが XML ファイル形式である必要があります。 処理対象のファイルを XML 形式で受信すると、ほとんどの場合、元のサイズが保存されます。

    • フラット ファイルフラット ファイルは、パススルー ルーティング以外の処理を実行BizTalk Server前に XML 形式に解析する必要があります。 XML ファイルでフラット ファイルを解析すると、ファイルのサイズが非常に大きくなる可能性があります。 フラット ファイルには、データに関する説明情報を持つ XML タグが含まれません。 一方、XML ファイルは、説明的な XML タグにすべてのデータを格納します。 一部のシナリオでは、解析を行うと、ファイルの XML タグに含まれる説明的なデータの量に応じて、フラット ファイルのサイズが 10 倍以上大きくなる場合があります。

    • XML ドキュメント内の単一の CDATA セクション ノードにラップされたフラット ファイル ドキュメントこの種類のドキュメントは XML ファイルとフラット ファイルの両方の組み合わせであり、処理する前にラップされたフラット ファイル ドキュメント全体BizTalk Serverメモリに読み込む必要があるため、問題が発生する可能性があります。

  • メッセージ処理の種類BizTalk Serverでは、メッセージ処理にはルーティングのみとマッピングの 2 種類があります。 実行されるメッセージ処理の種類に関連付けられるパフォーマンス変数は、メッセージのサイズとメッセージをメモリに読み込むかどうかです。

    • ルーティングのみBizTalk Serverが昇格されたメッセージ プロパティに基づくメッセージのルーティングにのみ使用される場合、メッセージは .NET XmlReader インターフェイスを使用してメッセージ ボックス データベースにストリーミングされ、メッセージパーツは個別にメモリに読み込まれません。 このシナリオでは、メモリ不足エラーは問題ではなく、メッセージ ボックス データベースに非常に大きなメッセージ (100 MB を超える) を書き込むのに必要な時間が主な考慮事項です。 BizTalk Server 開発チームでは、ルーティングのみを行う場合に、最大 1 GB までメッセージを処理できることを確認しています。

      このシナリオのパフォーマンスを決定する主な要因は、データをデータベースにフラグメント化するために使用される 大きなメッセージ フラグメント サイズ です。 [大きいメッセージ フラグメント サイズ] は、BizTalk グループのプロパティ構成ページで構成可能なオプションであり、既定値は 102400 バイト (100 KB) です。 この値を大きくすると、メッセージをメッセージ ボックス データベースにストリーム送信するために必要なラウンド トリップの回数が少なくなります。

    • マッピング マップを使用してドキュメントを変換すると、メモリを大量に消費する操作になる可能性があります。 マップでドキュメントを変換すると、BizTalk Server は、メッセージを .Net XSLCompileTransform クラスに渡します。このクラスは XSL スタイル シートを読み込みます。 Load メソッドが正常に完了すると、複数のスレッドから同時に Transform を呼び出すことができます。 XslCompiledTransform クラス は、XSLCompiledTransform クラスの詳細を提供します。

      BizTalk Server は、変換中にメモリに読み込まれるドキュメントに関する構成可能なメッセージ サイズしきい値を実装することにより、大きなドキュメントのメモリ管理を大幅に改善します。 このしきい値よりも小さいサイズのメッセージは、メモリで処理されます。このしきい値よりも大きいサイズのメッセージは、メモリの要件を減らすためにファイル システムにバッファリングされます。 既定のメッセージ サイズのしきい値は 1 MB です。

サイズの大きなメッセージを処理するためのガイドライン

BizTalk Server でサイズの大きなメッセージを処理する場合は、これらのガイドラインに従って、パフォーマンスを高めます。

  1. マッピング中にファイル システムにバッファリングされるドキュメントのメッセージ サイズのしきい値を大きくします。 サイズのしきい値を変更するには、BizTalk Server レジストリ内の次の場所に TransformThreshold という名前の DWORD 値を作成します。

    HKLM\Software\Microsoft\BizTalk Server\3.0\Administration\TransformThreshold
    

    この値を作成した後、バイト数を 10 進数で入力して、新しいしきい値を設定します。 たとえば、10 進数値 2097152 を入力して、メッセージ サイズのしきい値を既定値の 1 MB から 2 MB に増やします。 スループットを向上させるため、使用できるメモリ容量が大きいシステムではこの値を大きくしてください。 ドキュメントをディスクにバッファリングすると、全体のスループットに対してメモリが節約されます。

    Note

    既定では、マッピング中にファイル システムにバッファーされたドキュメントは、BizTalk Server コンピューターの %temp% ディレクトリに書き込まれます。 マッピング中に大きなメッセージをファイル システムにバッファリングするときのパフォーマンスを向上させるために、 %temp% 環境変数の設定をシステム以外のディスクに変更します。

  2. オーケストレーションでのマップの使用を最小限に抑えます。

    • マップを使用して、オーケストレーションのビジネス ロジックで使用するプロパティの抽出または設定を行っている場合、識別フィールドまたは昇格させたプロパティを代わりに使用してください。 マップで値を抽出または設定する場合、ドキュメントがメモリに読み込まれます。 識別フィールドまたは昇格させたプロパティを使用すると、オーケストレーション エンジンは、メッセージ コンテキストにアクセスするので、ドキュメントはメモリに読み込まれません。

    • マップを使用して、複数のフィールドを 1 つのフィールドで集計している場合、識別フィールドまたはオーケストレーションの変数が設定されている昇格したプロパティを使用して、結果セットを累積してください。

    • オーケストレーションの変換図形は、複数の入力を含めた構成にしないでください。 複数の入力が含まれているオーケストレーションの変換図形では、マッピング中にファイル システムへのストリーム送信が行われません。 この制限により、ドキュメント サイズが指定した TransformThreshold レジストリ値を超えた場合に、ドキュメント全体がメモリに読み込むためにマップされている状態になります。 この問題を回避する手段の 1 つとしては、オーケストレーションの変換図形で複数の入力を受け入れないよう、変換を受信ポート レベル内で適用するという方法があります。

  3. BizTalk グループの [プロパティ] 構成ページで公開されている [大きなメッセージ フラグメント サイズ] プロパティを調整します。

    受信したメッセージのメモリ内サイズが [大きいメッセージ フラグメント サイズ ]に指定されたバイト数を超える場合、メッセージは指定したサイズのフラグメントに分割され、次のように Microsoft 分散トランザクション コーディネーター (MSDTC) トランザクションのコンテキストで MessageBox にフラグメントが書き込まれます。

    1. 受信メッセージが既存の MSDTC トランザクションのコンテキストで公開されている場合、メッセージのフラグメントをメッセージ ボックス データベースに書き込む際、このトランザクションが使用されます。 たとえば、トランザクション処理のために構成されたトランザクション アダプターによって受信メッセージが公開されている場合、メッセージのフラグメントをメッセージ ボックス データベースに書き込む際、既存のトランザクションが使用されます。

    2. 受信メッセージが既存の MSDTC トランザクションのコンテキストで公開されていない場合、メッセージのフラグメントを書き込むため、新しい MSDTC トランザクションが作成されます。

    • [大きなメッセージ フラグメント サイズ] の値を増やして、大きなメッセージがフラグメント化される頻度を減らし、関連する MSDTC トランザクションを作成する頻度を減らします。 MSDTC トランザクションを使いすぎるとパフォーマンスの観点で無駄が多いため、この操作を実行する必要があります。 この値を大きくすると使用できるメモリの量も増える可能性があるので注意してください。

    • メッセージをメッセージ ボックス データベースに書き込む時間が MSDTC トランザクション タイムアウトの最大許容値の 60 分を超えると、トランザクションがタイムアウトになり、エラーが発生します。また、メッセージの書き込みが失敗し、ロールバックされます。 非常に大きなメッセージを処理するときにこの問題を回避するには、大きなメッセージ フラグメント サイズの値を十分に大きくする必要があります。 使用できるメモリの量に応じて、この値を最大値 1000000 バイトに設定する必要があります。

    • メッセージの各フラグメントは、メッセージ ボックス データベースに対して 1 つ以上の SQL Server データベース ロックを作成します。 ロックの数が数十万を超えると、SQL Server が "ロックの範囲外" エラーを生成する可能性があります。 この問題が発生した場合は、大きなメッセージ フラグメント サイズを増やして、MessageBox データベースに対して行われるSQL Serverデータベース ロックの数を減らします。

  4. "ロックの範囲外" エラーが発生した場合、64 ビット バージョンの SQL Server でメッセージ ボックス データベースを使用することを検討してください。 64 ビット バージョンの SQL Server では、使用できるロックの数が大幅に増えます。

  5. BizTalk グループのプロパティの構成ページで公開される大きなメッセージしきい値プロパティを調整します。

    メッセージ バッチが処理されると、メッセージ バッチのメモリ内サイズが [大きいメッセージしきい値 ] に指定されたバイト数に達した場合、メッセージ バッチの残りの部分が処理される前に、処理されたメッセージ バッチの部分が MessageBox に書き込まれます。 次のように、MSDTC トランザクションのコンテキストでこの処理が実行されます。

    1. メッセージ バッチが既存の MSDTC トランザクションのコンテキストで公開されている場合、メッセージ バッチの処理部分をメッセージ ボックス データベースに書き込む際、このトランザクションが使用されます。 たとえば、トランザクション処理のために構成されたトランザクション アダプターによって受信メッセージ バッチが公開されている場合、メッセージ バッチの処理部分をメッセージ ボックス データベースに書き込む際、既存のトランザクションが使用されます。

    2. メッセージ バッチが既存の MSDTC トランザクションのコンテキストで公開されていない場合、メッセージ バッチの部分をメッセージ ボックス データベースに書き込むため、新しい MSDTC トランザクションを作成する必要があります。 MSDTC トランザクションを使用すると、特定のメッセージ バッチのすべての部分がメッセージ ボックス データベースに正常に書き込まれます。

      [大きいメッセージしきい値] 設定はメッセージ バッチに直接適用できますが、メッセージ バッチを 1 の値に設定できるため、[大きいメッセージしきい値] 設定は個々のメッセージに間接的に適用することもできます。 たとえば、1 つのメッセージのメッセージ バッチが指定された 大きなメッセージしきい値 パラメーターを超えた場合、 有効な大きなメッセージしきい値 は、バッチ内の 1 つのメッセージにのみ適用されます。

    • メッセージ バッチを MessageBox に割り当てるには、 大きなメッセージしきい値 パラメーターを調整して、MSDTC トランザクションの作成を軽減する必要があります。 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 がメッセージ バッチを MessageBox データベースに割り当てるために MSDTC トランザクションを開始する必要はありません。