noviembre 13, 2022

Optimización de cargas masivas en Dataverse (descubriendo la cookie de afinidad)

Hoy nos metemos de lleno en el mundo de las cargas masivas, posiblemente uno de los quebraderos de cabeza mas grandes cuando hablamos de integrar grandes cantidades de datos contra Dataverse.

Optimización de cargas masivas en Dataverse (descubriendo la cookie de afinidad)

Rebuscando en la documentación de Microsoft veo algunas actualizaciones de su documentación con respecto a los límites de la API de protección del servicio. Algunas de estas actualizaciones hablan  sobre cómo manejar el procesamiento por lotes, tema bastante interesante en cargas masivas de datos. Otro tema que tambien me ha parecido muy interesante es entender como funciona la infraestructura de red de Dataverse. Entendiendo como funciona, se puede optimizar (y mucho) el rendimiento en operaciones CRUD masivas contra la base de datos de la Power Platform.

Antes de nada me gustaría resumir rápidamente los límites que tiene la API de Dataverse. En resumen, dentro de una ventana de 5 minutos, no se puede exceder lo siguiente (para un usuario específico):

MedidaDescripciónLímite por servidor web
Número de solicitudesEl número acumulado de solicitudes realizadas por el usuario.6000 dentro de una ventana de 5 minutos
Tiempo de ejecuciónEl tiempo de ejecución combinado de todas las solicitudes realizadas por el usuario.20 minutos (1200 segundos) dentro de una ventana de 5 minutos
Número de solicitudes simultáneasEl número de solicitudes simultáneas realizadas por el usuario.52

No quiero centrarme en las técnicas que habitualmente se utilizan para integrar datos de manra masiva en Dataverse (eso daría para varios post). Quiero aportar un detalle que de manera muy sencilla puede mejorar de manera notable vuestros procesos de carga masivos.

Cooke de afinidad (AffinityCookie)

Este gran descubrimiento se llama cookie de afinidad y antes de explicar como nos puede ayudar, explicaré como funciona la infraestrucura de red de Dataverse:

Cuando utilizamos Dataverse como usuario (a través de una aplicación Model Driven por ejemplo), queremos que cada una de nuestras solicitudes vayan al mismo servidor. ¿Por que? Básicamente poque esto permite que el servidor aproveche al máximo el almacenamiento en caché y así mejorar el rendimiento de la solicitud siguiente.

Sin embargo, en escenarios de carga masiva de datos, esto nos genera un cuello de botella. habiendo todos estos servidores disponibles, estamos enviando todas nuestras solicitudes a  uno solo. Cada uno de los servidores esta sujeto a los límites que exponía al principio del post, por lo que no parece muy buena idea canalizar todas las solicitudes contra el mismo servidor habiendo varios inactivos.

El balanceador de carga garantiza que cada solicitud vaya al mismo servidor mediante el uso de una cookie. Esta cookie es llamada  "cookie de afinidad" y se establece en la primera solicitud para identificar el servidor que se utilizará. En peticiones posteriores el cliente las enviará automáticamente para garantizar que se enruten al mismo servidor.

Viendo el funcionamiento de esta cookie, en escenarios de carga masiva de datos, el cuerpo nos pide desactivarla para que el balanceador no enrute las solcitudes siempre al mismo servidor ¿Es esto posible?

La respuesta es sí y además de una manera muy sencilla. Desde el cliente de dataverse (Microsoft.PowerPlatform.Dataverse.Client) podemos cambiar la propiedad

service.EnableAffinityCookie = false;

Activando esta propiedad la carga quedaría distribuida entre los diferentes servidores, por lo que la infraestructura de red pasaría a trabajar de la siguiente manera:

Conclusión

¿Tiene sentido deshabilitar siempre la cookie de afinidad?

No. Tiene sentido para carga masiva de datos, pero para un óptimo rendimiento de las diferentes aplicaciones que funcionan sobre dataverse, quitar esta cookie significa cargarse la cache con la que trabajan estos servidores y por lo tanto se traduce en una peor experiencia de usuario.  

Me he dado cuenta de que es algo muy desconocido por muchos y espero que os sirva de ayuda para vuestras integraciones con dataverse. Con este pequeño cambio he conseguido mejoras de hasta 4 veces mas velocidad en la ingesta.

¡Espero sirva de ayuda!