Cómo procesa BizTalk Server los mensajes de gran tamaño
¿Qué es un mensaje de gran tamaño?
Desafortunadamente, la respuesta a esta pregunta no está vinculada directamente a un tamaño de mensaje específico, sino que depende de cuellos de botella específicos en el sistema de Microsoft BizTalk Server. Los problemas vinculados a los mensajes de gran tamaño se pueden dividir en las siguientes categorías:
Errores de memoria insuficiente Ciertos tipos de procesamiento de mensajes, como la asignación, la validación y la promoción de propiedades, cargan todo el mensaje en la memoria. Si el tamaño del mensaje en memoria es superior a los recursos disponibles, se produce un error de memoria insuficiente. El umbral de tamaño para los mensajes que quedan dentro de esta categoría es muy inferior al umbral de tamaño para los mensajes que no se cargan en la memoria. Por ejemplo, un archivo sin formato de 10 MB que se analiza en XML y después se asigna, puede crecer en un factor de 10 o más y consumir más de 100 MB de memoria, mientras que un documento XML de 100 MB que no se analiza o asigna podría consumir solo 1 MB de memoria al transmitirlo a la base de datos de cuadro de mensajes.
Problemas de rendimiento de los mensajes que no se cargan en la memoria Los mensajes que no son necesarios para cargarse en la memoria se transmiten a la base de datos messageBox mediante la interfaz XmlReader de .NET. Aunque no están sujetos a las limitaciones de tamaño de los mensajes que deben cargarse en memoria, existen algunos factores importantes que afectan al modo en que BizTalk Server procesa los mensajes que se transmiten a la base de datos de cuadro de mensajes.
Factores que afectan al procesamiento de mensajes de gran tamaño
Tanto el tamaño del mensaje original, el formato del mensaje como el tipo de procesamiento afectan al modo en que procesa BizTalk Server los mensajes de gran tamaño.
Tamaño del mensaje original El tamaño del mensaje recibido por BizTalk Server es la indicación más visible de lo grande que será el mensaje cuando lo procese BizTalk Server. El tamaño original de un mensaje tiene un impacto mucho mayor sobre el rendimiento si se carga el mensaje completo en la memoria en vez de transmitirlo a la base de datos de cuadro de mensajes.
Formato de mensaje Los mensajes se reciben en BizTalk Server en uno de los dos formatos principales: archivos XML o archivos planos.
Archivos XML Para que BizTalk Server realizar cualquier procesamiento en un mensaje distinto del enrutamiento de paso a través, el mensaje debe estar en el formato de archivo XML. Si los archivos que se van a procesar se reciben en formato XML, en su mayoría retendrán su tamaño original.
Archivos planos Los archivos planos deben analizarse en un formato XML antes de que BizTalk Server pueda realizar cualquier procesamiento que no sea el enrutamiento de paso a través. Al analizar un archivo sin formato en un archivo XML, el tamaño del archivo puede aumentar considerablemente. Los archivos sin formato no contienen etiquetas XML con información descriptiva acerca de sus datos. Por otro lado, los archivos XML ajustan todos sus datos en etiquetas XML descriptivas. En algunos casos, el análisis puede aumentar el tamaño de un archivo sin formato en un factor de 10 o más, en función de cuántos datos descriptivos incluyan las etiquetas XML para el archivo.
Documentos de archivos planos encapsulados en un único nodo de sección de CDATA en un documento XML Este tipo de documento es una combinación de xml y archivo plano y puede ser problemático porque BizTalk Server debe cargar todo el documento de archivo plano encapsulado en memoria antes de procesarlo.
Tipo de procesamiento de mensajes En BizTalk Server, hay dos tipos de procesamiento de mensajes: Solo enrutamiento y asignación. Las variables de rendimiento vinculadas al tipo de procesamiento de mensajes que se realiza son el tamaño del mensaje y si está cargado en memoria.
Solo enrutamiento Si BizTalk Server solo se usa para enrutar mensajes basados en propiedades de mensaje promocionadas, el mensaje se transmite a la base de datos cuadro de mensajes mediante la interfaz XmlReader de .NET y los elementos de mensaje no se cargan individualmente en la memoria. En este caso, los errores de memoria insuficiente no constituyen un problema y la consideración principal es el tiempo necesario para escribir mensajes de gran tamaño (más de 100 MB) en la base de datos de cuadro de mensajes. El equipo de programación de BizTalk Server ha comprobado el procesamiento correcto de mensajes de un tamaño máximo de 1 GB al realizar solo enrutamiento.
El factor principal que determina el rendimiento en este escenario es el tamaño de fragmento de mensaje grande que se usa para fragmentar los datos en la base de datos. El tamaño del fragmento de mensaje grande es una opción configurable en la página de configuración Propiedades del grupo de BizTalk y tiene un valor predeterminado de 102400 bytes (100 KB). Al aumentar este valor se reduce el número de acciones de ida y vuelta necesarias para transmitir un mensaje a la base de datos de cuadro de mensajes.
Asignación Transformar un documento con un mapa puede ser una operación de uso intensivo de memoria. Cuando un documento se transforma mediante una asignación, BizTalk Server pasa el mensaje a la clase .Net XSLCompileTransform, que carga la hoja de estilo XSL. Cuando el método Load se complete correctamente, el método Transform se puede llamar simultáneamente desde varios subprocesos. La clase XslCompiledTransform proporciona más información sobre la clase XSLCompiledTransform.
BizTalk Server mejora considerablemente la administración de la memoria para documentos de gran tamaño, implementando un umbral de tamaño de mensaje configurable para cargar documentos en la memoria durante las transformaciones. Los mensajes con un tamaño inferior a este umbral se administran en memoria. Los mensajes con un tamaño superior a este umbral se almacenan en el búfer del sistema de archivos para reducir las necesidades de memoria. El tamaño de umbral de mensaje predeterminado es 1 MB.
Directrices para procesar mensajes de gran tamaño
Siga estas directrices para mejorar el rendimiento al procesar mensajes de gran tamaño en BizTalk Server.
Ajuste el umbral de tamaño de mensajes por encima del cual se almacenan los documentos en el búfer del sistema de archivos durante la asignación. Para modificar el umbral de tamaño, cree un valor DWORD denominado TransformThreshold en la siguiente ubicación del registro de BizTalk Server:
HKLM\Software\Microsoft\BizTalk Server\3.0\Administration\TransformThreshold
Tras crear este valor, escriba un valor decimal con el número de bytes para establecer el nuevo umbral. Por ejemplo, escriba un valor decimal de 2097152 para aumentar el umbral de tamaño de mensaje a 2 MB (el valor predeterminado es 1 MB). Aumente este valor en los sistemas con una gran cantidad de memoria disponible para mejorar el rendimiento. El almacenamiento de documentos en el búfer del disco conserva memoria con un impacto en el rendimiento global.
Nota
De forma predeterminada, los documentos almacenados en búfer en el sistema de archivos durante la asignación se escriben en el directorio %temp% del equipo de BizTalk Server. Cambie la configuración de la variable de entorno %temp% a un disco que no sea del sistema para mejorar el rendimiento al almacenar en búfer mensajes grandes en el sistema de archivos durante la asignación.
Minimice el uso de asignaciones en orquestaciones:
Si usa una asignación para extraer o establecer las propiedades usadas con lógica empresarial en una orquestación, utilice campos distintivos o propiedades promocionadas en su lugar. Al extraer o establecer valores con una asignación, se carga el documento en memoria. Al usar campos distintivos o propiedades promocionadas, el motor de orquestaciones obtiene acceso al contexto del mensaje y no carga el documento en memoria.
Si utiliza una asignación para agregar varios campos a un campo, use campos distintivos o propiedades promocionadas con una variable de orquestación para acumular el conjunto de resultados.
No configure una orquestación con varias entradas para formas de transformación. Una orquestación que contiene varias entradas para formas de transformación no se transmitirá por secuencias al sistema de archivos durante la asignación. Esta limitación provocará que todo el documento que se asigna se cargue en memoria si el tamaño del documento supera el valor de Registro de TransformThreshold especificado. Una posible solución para este problema sería aplicar las transformaciones en el nivel de puerto de recepción, de manera que la orquestación nunca acepte más de una única entrada para las formas de transformación.
Ajuste la propiedad Tamaño de fragmento de mensaje grande expuesta en la página de configuración Propiedades del grupo de BizTalk :
Si el tamaño en memoria de un mensaje recibido supera el número de bytes especificados para el tamaño del fragmento de mensaje grande , el mensaje se divide en fragmentos del tamaño especificado y los fragmentos se escriben en el Cuadro de mensajes en el contexto de una transacción de Coordinador de transacciones distribuidas de Microsoft (MSDTC) como se indica a continuación:
Si se publica el mensaje entrante bajo el contexto de una transacción MSDTC existente, se usará esta transacción al escribir los fragmentos del mensaje en el Cuadro de mensajes. Por ejemplo, si un adaptador transaccional configurado para solicitar transacciones publica el mensaje entrante, se utilizará la transacción existente al escribir los fragmentos del mensaje en el Cuadro de mensajes.
Si no se publica el mensaje entrante bajo el contexto de una transacción MSDTC existente, se crea una transacción MSDTC nueva para escribir los fragmentos del mensaje.
Aumente el valor del tamaño del fragmento de mensaje grande para reducir la frecuencia con la que se fragmentan los mensajes grandes y reducir la incidencia de crear las transacciones MSDTC asociadas. Esto es necesario porque un uso excesivo de transacciones MSDTC tiene un gran impacto sobre el rendimiento. Tenga en cuenta que, al aumentar este valor, se aumenta también la cantidad de memoria disponible que se utiliza.
Si la escritura de un mensaje en el cuadro de mensajes tarda más del tiempo de espera de transacción MSDTC máximo permitido de 60 minutos, la transacción excede el tiempo de espera, se produce un error, la escritura del mensaje no se lleva a cabo correctamente y se deshace. El valor de tamaño de fragmento de mensaje grande debe aumentarse lo suficiente para evitar este problema al procesar mensajes muy grandes. En función de la memoria disponible, este valor debe aumentarse hasta un máximo de 1.000.000 bytes.
Cada fragmento de mensaje en un mensaje crea uno o más bloqueos de base de datos SQL Server en la base de datos de cuadro de mensajes. Si el número de bloqueos es superior a varios cientos de miles, el servidor SQL Server podría empezar a generar errores de bloqueos insuficientes. Si se produce este problema, aumente el tamaño del fragmento de mensaje grande para reducir el número de bloqueos de base de datos de SQL Server realizados en la base de datos messageBox.
Si experimenta errores de bloqueos insuficientes, considere la posibilidad de alojar la base de datos de cuadro de mensajes en una versión de 64 bits de SQL Server. El número de bloqueos disponible es significativamente superior en la versión de 64 bits de SQL Server.
Ajuste la propiedad Umbral de mensaje grande expuesta en la página de configuración Propiedades del grupo de BizTalk :
Cuando se procesa un lote de mensajes, si el tamaño en memoria de un lote de mensaje alcanza el número de bytes especificados para el umbral de mensaje grande , la parte del lote de mensajes que se ha procesado se escribe en el cuadro de mensajes antes de procesar el resto del lote de mensajes. Esto se hace bajo el contexto de una transacción MSDTC de la siguiente forma:
Si se publica el lote de mensajes bajo el contexto de una transacción MSDTC existente, se usará esta transacción al escribir la parte procesada del lote de mensajes en el Cuadro de mensajes. Por ejemplo, si un adaptador transaccional configurado para solicitar transacciones publica el lote de mensajes entrantes, se utilizará la transacción existente al escribir la parte procesada del lote de mensajes en el Cuadro de mensajes.
Si no se publica el lote de mensajes bajo el contexto de una transacción MSDTC existente, debe crearse una transacción MSDTC nueva al escribir las partes del lote de mensajes en el Cuadro de mensajes. La transacción MSDTC se usa para garantizar que todas las partes de un lote de mensajes específico se escriben correctamente en la base de datos de cuadro de mensajes.
La configuración umbral de mensajes grandes se aplica directamente a los lotes de mensajes, pero dado que un lote de mensajes se puede establecer en un valor de uno, la configuración de umbral de mensaje grande también puede aplicarse indirectamente a mensajes individuales. Por ejemplo, cuando un lote de mensajes de un mensaje supera el parámetro de umbral de mensaje grande especificado, el umbral de mensaje grande en vigor solo se aplica al único mensaje del lote.
El parámetro De umbral de mensaje grande debe ajustarse para mitigar la creación de transacciones MSDTC usadas para procesar lotes de mensajes en el cuadro de mensajes. Esto es necesario porque el uso excesivo de transacciones MSDTC tiene un gran impacto sobre el rendimiento. Use el siguiente cálculo para determinar cuál debe ser el valor mínimo para la configuración de umbral de mensajes grandes para evitar la creación innecesaria de transacciones MSDTC:
Batch Size * Average size (in bytes) of each message in the batch after being processed by the receive pipeline < Large message threshold
Siempre que el tamaño total en bytes de un lote de mensajes no supere el valor especificado para el umbral de mensaje grande , no es necesario que BizTalk inicie una transacción MSDTC para apporizar el lote de mensajes a la base de datos messageBox.