Procedimientos recomendados y herramientas de diagnóstico de Durable Functions

En este artículo se detallan algunos procedimientos recomendados al usar Durable Functions. También se describen varias herramientas para ayudar a diagnosticar problemas durante el desarrollo, las pruebas y el uso de producción.

Procedimientos recomendados

Uso de la versión más reciente de la extensión Durable Functions y el SDK

Hay dos componentes que usa una aplicación de funciones para ejecutar Durable Functions. Uno es el SDK de Durable Functions que permite escribir funciones de orquestador, actividad y entidad mediante el lenguaje de programación de destino. El otro es la extensión Durable, que es el componente en tiempo de ejecución que ejecuta realmente el código. Con excepción de las aplicaciones In-Process de .NET, el SDK y la extensión se versionan de forma independiente.

Mantenerse al día con la extensión y el SDK más recientes garantiza que la aplicación se beneficie de las últimas mejoras de rendimiento, características y correcciones de errores. La actualización a las versiones más recientes también garantiza que Microsoft pueda recopilar la telemetría de diagnóstico más reciente para ayudar a acelerar el proceso de investigación al abrir un caso de soporte técnico con Azure.

Cumplir con las restricciones de código de Durable Functions

El comportamiento de reproducción del código de orquestador crea restricciones sobre el tipo de código que puede escribir en una función de orquestador. Un ejemplo de restricción es que la función de orquestador debe usar API deterministas para que cada vez que se reproduzca, genere el mismo resultado.

Nota

El Analizador Roslyn de Durable Functions es un analizador de código activo que guía a los usuarios de C# para que se adhieran a las restricciones de código específicas de Durable Functions. Consulte Analizador Roslyn de Durable Functions para obtener instrucciones sobre cómo habilitarlo en Visual Studio y Visual Studio Code.

Familiarícese con la configuración de rendimiento de Azure Functions del lenguaje de programación

Al usar la configuración predeterminada, el entorno de ejecución del lenguaje que seleccione puede imponer restricciones de simultaneidad estrictas o sus funciones. Por ejemplo: solo permitir que una función se ejecute a la vez en una máquina virtual determinada. Normalmente, estas restricciones se pueden relajar ajustando la configuración de simultaneidad y rendimiento del lenguaje. Si desea optimizar el rendimiento de la aplicación de Durable Functions, deberá familiarizarse con esta configuración.

A continuación se muestra una lista no exhaustiva de algunos de los lenguajes que a menudo se benefician de ajustar el rendimiento y la configuración de simultaneidad, y sus directrices para hacerlo.

Garantizar nombres únicos de la Central de tareas por aplicación

Varias aplicaciones de Durable Function pueden compartir la misma cuenta de almacenamiento. De forma predeterminada, el nombre de la aplicación se usa como nombre de la central de tareas, lo que garantiza que no se producirá el uso compartido accidental de centrales de tareas. Si necesita configurar explícitamente los nombres de la central de tareas para las aplicaciones en host.json, debe asegurarse de que los nombres son únicos. De lo contrario, las diversas aplicaciones competirán por los mensajes, lo que podría dar lugar a un comportamiento indefinido, incluidas orquestaciones que se "atascan" inesperadamente en el estado Pendiente o En ejecución.

La única excepción es si implementa copias de la misma aplicación en varias regiones; en este caso, puede usar la misma central de tareas para las copias.

Siga las instrucciones al implementar cambios de código en orquestadores en ejecución

Resulta inevitable agregar, eliminar y cambiar funciones durante el ciclo de vida de una aplicación. Algunos ejemplos de cambios importantes comunes son cambiar las firmas de función de entidad o actividad y cambiar la lógica del orquestador. Estos cambios son un problema cuando afectan a las orquestaciones que todavía se están ejecutando. Si se implementa incorrectamente, los cambios de código podrían provocar errores de orquestaciones con un error no determinista, quedarse bloqueado indefinidamente, degradación del rendimiento, etc. Consulte estrategias de mitigación recomendadas al realizar cambios de código que puedan afectar a la ejecución de orquestaciones.

Mantener las entradas y salidas de función lo más pequeñas posible

Puede encontrarse con problemas de memoria si proporciona entradas y salidas grandes hacia y desde las API de Durable Functions.

Las entradas y salidas de las API de Durable Functions se serializan en el historial de orquestaciones. Esto significa que, con el tiempo, las entradas y salidas de gran tamaño pueden contribuir considerablemente a un historial de orquestadores que crece sin enlazar, lo que supone riesgos para provocar excepciones de memoria durante la reproducción.

Para mitigar el impacto de las entradas y salidas grandes en las API, puede optar por delegar algún trabajo en los sub orquestadores. Esto ayuda a equilibrar la carga de memoria del historial de un único orquestador a varios, por lo que mantiene pequeña la superficie de memoria de los historiales individuales.

Dicho esto, el procedimiento recomendado para tratar datos de gran tamaño es mantenerlos en el almacenamiento externo y materializar solo esos datos dentro de actividades, cuando sea necesario. Al adoptar este enfoque, en lugar de comunicar los datos en sí como entradas o salidas de API de Durable Functions, puede pasar algún identificador ligero que le permita recuperar esos datos del almacenamiento externo cuando sea necesario en las actividades.

Reducción de datos de entidad

Al igual que para las entradas y salidas en las API de Durable Functions, si el estado explícito de una entidad es demasiado grande, puede encontrarse con problemas de memoria. En concreto, es necesario serializar y deserializar un estado de entidad desde el almacenamiento en cualquier solicitud, por lo que los estados grandes agregan latencia de serialización a cada invocación. Por lo tanto, si una entidad necesita realizar un seguimiento de los datos grandes, se recomienda descargar los datos en el almacenamiento externo y realizar un seguimiento de algún identificador ligero en la entidad que le permita materializar los datos del almacenamiento cuando sea necesario.

Ajuste de la configuración de simultaneidad de Durable Functions

Una sola instancia de trabajo puede ejecutar varios elementos de trabajo simultáneamente para aumentar la eficacia. Sin embargo, procesar demasiados elementos de trabajo simultáneamente corre el riesgo de agotar recursos, como la capacidad de CPU, las conexiones de red, etc. En muchos casos, esto no debería ser una preocupación porque el escalado y la limitación de elementos de trabajo se controlan automáticamente. Dicho esto, si experimenta problemas de rendimiento (por ejemplo, los orquestadores tardan demasiado tiempo en finalizar, están bloqueados en pendientes, etc.) o están realizando pruebas de rendimiento, puede configurar límites de simultaneidad en el archivo host.json.

Nota

Este no es un reemplazo para ajustar la configuración de rendimiento y simultaneidad del entorno de ejecución del lenguaje en Azure Functions. La configuración de simultaneidad de Durable Functions solo determina la cantidad de trabajo que se puede asignar a una máquina virtual determinada a la vez, pero no determina el grado de paralelismo en el procesamiento que funciona dentro de la máquina virtual. Este último requiere ajustar la configuración de rendimiento del entorno de ejecución del lenguaje.

Inversión en pruebas de esfuerzo

Al igual que con cualquier cosa relacionada con el rendimiento, la configuración de simultaneidad ideal y la arquitectura de la aplicación depende en última instancia de la carga de trabajo de la aplicación. Por lo tanto, se recomienda a los usuarios invertir en una herramienta de pruebas de rendimiento que simula su carga de trabajo esperada y usarla para ejecutar experimentos de rendimiento y confiabilidad para su aplicación.

Evitar datos confidenciales en entradas, salidas y excepciones

Las entradas a las API de Durable Functions, y las salidas (incluidas las excepciones) de ellas, se conservan de forma duradera en el proveedor de almacenamiento elegido. Si esas entradas, salidas o excepciones contienen datos confidenciales (como secretos, cadenas de conexión, información de identificación personal, etc.), cualquiera con acceso de lectura a los recursos del proveedor de almacenamiento podría obtenerlos. Para tratar de forma segura los datos confidenciales, es aconsejable que los usuarios capturen esos datos dentro de las funciones de actividad desde Azure Key Vault o desde las variables de entorno, y que nunca los comuniquen directamente a orquestadores o entidades. Esto debería ayudar a evitar que los datos confidenciales se filtren en los recursos de almacenamiento.

Nota:

Esta guía también se aplica a la CallHttpAPI de orquestador, que también conserva sus cargas de solicitud y respuesta en el almacenamiento. Si los puntos de conexión HTTP de destino requieren autenticación, que puede ser confidencial, se recomienda que los propios usuarios implementen la llamada HTTP dentro de una actividad, o usar la compatibilidad integrada con identidad administrada que ofrece CallHttp, que no conserva ninguna credencial en el almacenamiento.

Sugerencia

Evite también registrar datos que contengan secretos, ya que cualquier persona con acceso de lectura a los registros (por ejemplo, en Application Insights) podría obtener esos secretos.

Herramientas de diagnóstico

Hay varias herramientas disponibles para ayudarle a diagnosticar problemas.

Registros de Durable Functions y Durable Task Framework

Extensión de Durable Functions

La extensión de Durable Functions emite eventos de seguimiento que le permiten realizar el seguimiento de la ejecución de un extremo de una orquestación al otro. Estos eventos de seguimiento se pueden encontrar y consultar mediante la herramienta Application Insights Analytics de Azure Portal. El nivel de detalle de los datos de seguimiento que se emiten puede configurarse en las secciones logger (Functions 1.x) o logging (Functions 2.0) del archivo host.json. Consulte detalles de configuración.

Durable Task Framework

A partir de la versión 2.3.0 de la extensión de Durable, los registros emitidos por el marco Durable Task Framework (DTFx) subyacente también están disponibles para la recopilación. Consulte detalles sobre cómo habilitar estos registros.

Azure Portal

Diagnosticar y solucionar problemas

Diagnósticos de aplicación de funciones de Azure es un recurso útil en Azure Portal para supervisar y diagnosticar posibles problemas en la aplicación. También proporciona sugerencias para ayudar a resolver problemas en función del diagnóstico. Consulte Diagnósticos de aplicación de funciones de Azure.

Seguimientos de orquestación de Durable Functions

Azure Portal proporciona detalles de seguimiento de orquestación para ayudarle a comprender el estado de cada instancia de orquestación y realizar un seguimiento de la ejecución de un extremo a otro. Al examinar la lista de funciones dentro de la aplicación de Azure Functions, verá una columna Supervisión que contiene vínculos a los seguimientos. Debe tener habilitado Applications Insights para que la aplicación obtenga esta información.

Extensión de Supervisión de Durable Functions

Se trata de una extensión de Visual Studio Code que proporciona una interfaz de usuario para supervisar, administrar y depurar las instancias de orquestación.

Analizador Roslyn

El Analizador Roslyn de Durable Functions es un analizador de código activo que guía a los usuarios de C# para que se adhieran a las restricciones de código específicas de Durable Functions. Consulte Analizador Roslyn de Durable Functions para obtener instrucciones sobre cómo habilitarlo en Visual Studio y Visual Studio Code.

Soporte técnico

Para preguntas y soporte técnico, puede abrir un problema en uno de los repositorios de GitHub siguientes. Al notificar un error en Azure, incluida información como identificadores de instancia afectados, intervalos de tiempo en UTC que muestran el problema, el nombre de la aplicación (si es posible) y la región de implementación acelerarán considerablemente las investigaciones.