BizTalk Server 如何处理大消息

什么是大消息?

遗憾的是,此问题的答案并不直接绑定到特定消息大小,而是取决于 Microsoft BizTalk Server 系统中的特定瓶颈。 与大消息关联的问题可分为以下几类:

  • 内存不足错误 某些类型的消息处理(如映射、验证和属性提升)将整个消息加载到内存中。 如果内存中的消息大小超出了可用资源,则会发生内存不足错误。 与未加载到内存中的消息的大小阈值相比,属于此类别的消息的大小阈值要小得多。 例如,已解析为 XML 并已进行映射的 10 MB 平面文件可能按 10 或更大的因子增大,从而占用多于 100 MB 的内存,然而未进行解析或映射的 100 MB 的 XML 文档实际只需占用 1 MB 的内存,因为它是保存到 MessageBox 数据库中的。

  • 未加载到内存中的消息的性能问题 不需要加载到内存中的消息将使用 .NET XmlReader 接口流式传输到 MessageBox 数据库。 尽管保存到 MessageBox 数据库的消息不会受限于必须加载到内存中的消息所受到的大小限制,但仍然存在某些重要的因素将影响 BizTalk Server 处理此类消息方式。

影响处理大消息的因素

原始消息大小、消息格式以及消息的处理类型都会影响 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 中处理大消息时可提高性能:

  1. 调整消息大小阈值,在映射期间,高于此阈值的文档将缓冲到文件系统中。 若要修改大小阈值,请在BizTalk Server注册表中的以下位置创建名为 TransformThreshold 的 DWORD 值:

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

    创建此值后,请输入一个要设置为新阈值的字节数的十进制值。 例如,输入十进制值 2097152 可将消息大小阈值从默认的 1 MB 增大至 2 MB。 在具有大量可用内存的系统上增大此值可提高吞吐量。 将文档缓存到磁盘可以节省内存,但是会对总体吞吐量造成影响。

    注意

    默认情况下,在映射过程中缓冲到文件系统的文档将写入BizTalk Server计算机的 %temp% 目录。 将 %temp% 环境变量的设置更改为非系统磁盘,以提高在映射过程中将大型消息缓冲到文件系统时的性能。

  2. 在业务流程中尽量减少使用映射:

    • 如果你在业务流程中正使用映射来提取或设置用于业务逻辑的属性,请使用可分辨字段和升级属性进行替代。 在使用映射提取或设置值时,需要将文档加载到内存中。 但如果使用可分辨字段和升级属性,则业务流程引擎将访问消息上下文,而无需将文档加载到内存中。

    • 如果正在使用映射将多个字段聚合为一个字段,请将可分辨字段或升级属性与业务流程变量结合使用,以累计结果集。

    • 请不要在业务流程中配置具有多个输入的转换形状。 映射时,如果业务流程中包含的转换形状具有多个输入,则该业务流程将不会流入到文件系统中。 如果文档大小超过了指定的 TransformThreshold 注册表值,这种限制会导致将被映射的文档整个加载到内存中。 此问题的一种可能的解决方法是在接收端口级别应用转换,这样业务流程就不会接受多个转换形状输入。

  3. 调整 BizTalk 组属性配置页上公开的“大型消息片段大小”属性:

    如果收到的消息的内存中大小超过为 “大消息片段大小 ”指定的字节数,则将消息拆分为指定大小的片段,并将片段写入到 Microsoft 分布式事务协调器 (MSDTC) 事务的上下文中的 MessageBox 中,如下所示:

    1. 如果正在现有的 MSDTC 事务上下文中发布传入消息,则在消息片段写入 MessageBox 时使用此事务。 例如,如果配置为需要事务的事务性适配器正在发布传入消息,则在消息片段写入 MessageBox 时使用现有事务。

    2. 如果没有在现有的 MSDTC 事务上下文中发布传入消息,则将创建一个新的 MSDTC 事务以写入消息片段。

    • 增大 “大型消息片段大小 ”的值,以减少大型消息分段的频率,并减少创建关联 MSDTC 事务的发生。 因此应该增大此值,因为过多使用 MSDTC 事务将极大地影响系统性能。 请注意,增大此值还可能增加要使用的可用内存量。

    • 如果将消息写入 MessageBox 所用时间大于最大允许的 MSDTC 事务超时时间(60 分钟),则该事务将超时并显示错误,尝试写入消息的操作失败,并进行回滚。 处理非常大的消息时,应将 “大型消息片段大小” 值增大到足以避免此问题。 根据可用内存的大小,可将此值提高到 1000000 字节的最大值。

    • 消息中的每个消息片段都可针对 MessageBox 数据库创建一个或多个 SQL Server 数据库锁定。 如果锁定数目超过数十万,则 SQL Server 可能会发生“内存不足”错误。 如果出现此问题,请增大大型消息片段大小以减少针对 MessageBox 数据库SQL Server数据库锁的数目。

  4. 如果出现“内存不足”错误,请考虑在 64 位版本的 SQL Server 上保存 MessageBox 数据库。 在 64 位版本的 SQL Server 上,可用锁定的数目将大大增加。

  5. 调整 BizTalk 组属性配置页上公开的“大型消息阈值”属性:

    处理消息批时,如果消息批的内存中大小达到为 “大消息阈值 ”指定的字节数,则在处理消息批的其余部分之前,已处理的消息批部分将写入 MessageBox。 此操作是在 MSDTC 事务的上下文中完成的,如下所示:

    1. 如果正在现有的 MSDTC 事务上下文中发布消息批,则在消息批的已处理部分写入 MessageBox 时使用此事务。 例如,如果配置为需要事务的事务性适配器正在发布传入消息批,则在消息批的已处理部分写入 MessageBox 时使用现有事务。

    2. 如果没有在现有的 MSDTC 事务上下文中发布消息批,则必须创建一个新的 MSDTC 事务以将消息批的各部分写入 MessageBox。 使用 MSDTC 事务可确保给定消息批的所有部分均可成功写入 MessageBox 数据库。

      “大消息阈值”设置直接适用于消息批,但由于消息批可以设置为值 1,因此“大消息阈值”设置也可以间接适用于单个消息。 例如,当包含一条消息的消息批超过指定的 “大消息阈值 ”参数时,“ 大消息阈值 ”实际上仅适用于该批中的单个消息。

    • 应调整 “大型消息阈值 ”参数,以缓解创建 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 数据库。