DEV Community

loading...

Blazor Server - Uso de recursos

pablinme profile image Pablo Miranda Updated on ・3 min read

Las aplicaciones web creadas con Blazor Server tienen un modelo de procesamiento de datos manteniendo el estado entre cliente y servidor a través de un "circuito" que mantiene el estado del usuario en memoria en el servidor.

Este circuito en memoria indica al navegador qué contenido renderizar y cómo responder a los eventos a nivel de interfaz de usuario, esto es posible gracias a la interoperabilidad con JavaScript que permite invocar a funciones en el navegador del usuario y a su vez ejecutar métodos -c#- en el servidor.

Aplicaciones en memoria

Las aplicaciones de blazor server residen en la memoria del servidor y por cada sesión de la aplicación se crea un nuevo circuito con su propio identificador y alcances a nivel de contenedor, por lo que el alcanse de los servicios debería mantenerse a nivel de sesión.

Un escenario en el cúal se pasaría información del estado en una aplicación de blazor server podría ser el siguiente:

  • Mantener una clase con los datos a transmitir.
  • Obtener los datos de la página en un momento determinado a través de HttpContext.
  • Transmitir los datos a la aplicación cómo un parámetro a ser definido en la raíz de componentes de la aplicación.

Se podría transmitir información específica a los usuarios a través de un servicio al inicializar la aplicación, teniendo en cuenta que no es recomendable utilizar Singleton ya que podría introducir vulnerabilidades en cuanto al manejo del estado entre los circuitos.

Uso excesivo de recursos

Cuando el cliente interactua con la aplicación, genera un proceso en el servidor qué a su vez consume recursos.

Esto que detallo a continuación tiene mayor trascendencia en aplicaciones "publicas" en internet por ejemplo, en un ambiente controlado intranet o una red corporativa el enfoque cambia ya que la afectación es considerablemente menor.

CPU

A nivel de cliente se puede sobrecargar de trabajo al procesador si no se mantiene un límite en el uso del tiempo del mismo, cabe recalcar que en una aplicación web tradicional hay timeout para solicitudes y conexiones para prevenir en algo el uso exaustivo.

Las aplicaciones de blazor server deben tener un chequeo apropiado y limitantes para realizar trabajo que pueda impactar de sobremanera al procesador.

Memoria

Un ejemplo simple de mal uso de memoria se podría ver en dos escenarios

1) Al crear un componente que utilice una lista de objetos a ser renderizados al cliente, en donde dicha lista puede crecer desmesuradamente

2) Si se renderiza elementos que no se están presentando en el navegador en un momento determinado.

Tenemos una colección
List<MyClass>

Ya sea una propiedad o campo estos objetos residirán en memoria y si la aplicación permite que esta lista cresca sin límites en algún punto se habrá consumido demasiada memoria y la sesión se cerrará no sin antes emitir una excepción "out-of-memory" a todas las instancias de la aplicación en el servidor.

Al momento de renderizar hay que considerar el uso de paginación, mostrar 20 elementos de los 100 existentes.

Hay que tener en cuenta que en Blazor Server la memoria que se consuma excesivamente afectará a todas las aplicaciones del mismo, en Blazor WebAssembly la aplicación se ejecuta en su totalidad en el cliente y por lo mismo solo utiliza -eficientemente o no- los recursos del mismo.

De igual manera después de procesar una solicitud del cliente, la aplicación de Blazor Server no descarta de manera inmediata la memoria utilizada.

Circuitos - conexiones cliente/servidor

A nivel de clientes, Blazor establece una conexion por cada sesión que permanece abierta mientras la ventana del navegador este abierta también.

Para mitigar el uso excesivo de conexiones, se puede:

  • Limitar el uso de la aplicación a usuarios no autenticados.
  • Limitar el acceso geograficamente de ser el caso.
  • Mantener un límite de conexiones concurrentes por usuario.
  • Monitorear el tráfico hacia la aplicación a nivel de servidor.

Dentro de los componentes en el servidor la API de .NET provee limitantes que se puede configurar en las aplicaciones Blazor Server las mismas que parten de ASP.NET Core y SignalR en CircuitOptions.

Discussion (0)

pic
Editor guide