Tengo un proyecto con un par de funciones de Azure basadas en .NET Core que se ejecutan según una programación. Uno de ellos se ejecuta una vez cada 10 minutos y sirve para actualizar el recuento de vistas de forma similar a cómo SO realiza un seguimiento de las vistas de preguntas y el otro envía correos electrónicos una vez por semana. Estas funciones estuvieron funcionando bien durante un año más o menos. Recientemente los actualicé para usar Azure Functions SDK v3 y Azure Functions runtime v3, así como .NET Core 3.1 (básicamente me mudé de .NET Core 2.1 a .NET Core 3.1, por lo que necesitaba actualizar las funciones en tiempo de ejecución).

En un momento recibí una factura mucho más alta de lo habitual. Resulta que las funciones que comparten la misma cuenta de almacenamiento subyacente comenzaron a realizar MUCHAS transacciones de API en el almacenamiento. Como muchos miles cada 5 minutos. Normalmente, cada ejecución genera como 100 transacciones de almacenamiento (¿probablemente recuperando los archivos de función?), Pero en algún momento las transacciones saltaron bruscamente. Al reiniciar las funciones, la transacción cae a la normalidad y todo es normal durante unos días, luego saltan nuevamente y permanecen altos hasta que se reinicia.

El código de funciones no se ha cambiado con la actualización solo el SDK y el tiempo de ejecución. El código de función tiene un número constante de escrituras de registro (como 7) a través del registrador proporcionado por SDK y no interactúa con el almacenamiento de ninguna otra manera.

Tengo dos entornos idénticos, uno para prueba y otro para producción, y ambos tienen el mismo problema. El intervalo que tarda la función en volverse deshonesto es un par de días, pero parece ser diferente cada vez. Sin embargo, si reinicio tanto la prueba como la producción al mismo tiempo, el siguiente pico ocurre simultáneamente en ambos entornos, por lo que hay algo determinista allí.

De acuerdo con mi investigación a través de la herramienta Métrica, los tipos de transacciones ofensivas son Crear, Cerrar y CambiarNotificar con algunos Cancelar (pero menos que los otros). El almacenamiento no se usa para nada más (de hecho, solo existe porque Azure Functions requiere un almacenamiento de respaldo para almacenar sus archivos o algo así)

Aquí está el código de activación en caso de que sea relevante

[FunctionName("ViewCountUpdater")]
public static async Task RunAsync([TimerTrigger("0 */10 * * * *"/*, RunOnStartup = true*/)]TimerInfo timer, ILogger log, ExecutionContext context)

Creo que he encontrado un error con el tiempo de ejecución de Azure Functions o el SDK de .NET Core de Azure Functions. ¿Alguien ha experimentado esto o sabe cómo solucionarlo?

6
Stilgar 7 feb. 2020 a las 16:07

2 respuestas

¿Tiene AzureWebJobsDashboard habilitado? En caso afirmativo, debe deshabilitarlo (eliminar la cadena de conexión de la configuración de la aplicación) y cambiar a información de la aplicación. Se sabe que esta configuración causa escrituras inesperadas en el almacenamiento que no se pueden explicar adecuadamente.

https://github.com/Azure/Azure-Functions/issues/832

2
Alex AIT 7 feb. 2020 a las 14:32

¿Se ha creado un problema de GitHub (idealmente https://github.com/azure/azure-functions -host) o ticket de soporte? Esto suena como uno que nuestro equipo debería investigar, pero una de esas dos cosas ayudaría (la última proporcionaría el tiempo de respuesta más corto). Avíseme: los detalles sobre cosas como el nombre de la aplicación también ayudan. @jeffhollan o jehollan en microsoft.

0
jeffhollan 7 feb. 2020 a las 17:16
60114152