Uso de Azure Cosmos DB como un proveedor de almacenamiento en caché y estado de sesión de ASP.NET

SE APLICA A: NoSQL

El proveedor de caché y sesión de Azure Cosmos DB le permite usar Azure Cosmos DB y aprovechar sus funcionalidades de escala global y baja latencia para almacenar datos de estado de sesión y como caché distribuida dentro de la aplicación.

¿Qué es el estado de sesión?

El estado de sesión son los datos de usuario que hacen seguimiento a la exploración de un usuario a través de una aplicación web durante un período de tiempo en el mismo explorador. El estado de sesión expira y se limita a las interacciones que tiene un explorador determinado que no se extienden a otros exploradores. Se considera datos efímeros y, si no está presente, no interrumpirá la aplicación. Sin embargo, cuando sí está presente, hace que la experiencia sea más rápida para el usuario porque la aplicación web no necesita capturarlo en todas las solicitudes del explorador correspondientes al mismo usuario.

A menudo cuenta con el respaldo de algún mecanismo de almacenamiento, que en algunos casos puede ser externo al servidor web actual, y habilitar las solicitudes de equilibrio de carga del mismo explorador en varios servidores web para lograr una mayor escalabilidad.

El proveedor de estado de sesión más sencillo es el proveedor en memoria que solo almacena datos en la memoria del servidor web local y requiere que la aplicación use el enrutamiento de solicitud de aplicaciones. Esto hace que la sesión del explorador sea permanente para un servidor web determinado (todas las solicitudes de ese explorador deben llegar siempre al mismo servidor web). El proveedor funciona bien en escenarios sencillos, pero el requisito de permanencia puede traer problemas de equilibrio de carga cuando se escalan las aplicaciones web.

Hay muchos proveedores de almacenamiento externos disponibles que pueden almacenar los datos de sesión de manera que varios servidores web puedan leerlos y acceder a ellos sin necesidad de mantener la sesión y habilitar una escala mayor.

Escenarios de estado de sesión

Azure Cosmos DB se puede usar como proveedor de estado de sesión a través del paquete de extensión Microsoft.Extensions.Caching.Cosmos con el SDK de .NET de Azure Cosmos DB. Utiliza un contenedor como almacenamiento de sesión eficaz basado en un enfoque clave-valor donde la clave es el identificador de sesión.

Una vez que se agrega el paquete, es posible usar AddCosmosCache como parte del proceso de inicio (services.AddSession y app.UseSession son pasos de inicialización comunes necesarios para todo proveedor de estado de sesión):

public void ConfigureServices(IServiceCollection services)
{
  /* Other service configurations */
  services.AddCosmosCache((CosmosCacheOptions cacheOptions) =>
  {
      CosmosClientBuilder clientBuilder = new CosmosClientBuilder("myConnectionString")
        .WithApplicationRegion("West US");
      cacheOptions.ContainerName = "myContainer";
      cacheOptions.DatabaseName = "myDatabase";
      cacheOptions.ClientBuilder = clientBuilder;
      /* Creates the container if it does not exist */
      cacheOptions.CreateIfNotExists = true; 
  });

  services.AddSession(options =>
  {
      options.IdleTimeout = TimeSpan.FromSeconds(3600);
      options.Cookie.IsEssential = true;
  });
  /* Other service configurations */
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    /* Other configurations */

    app.UseSession();

    /* app.UseEndpoints and other configurations */
}

Donde especifique la base de datos y el contenedor en los que quiera almacenar el estado de sesión y, de manera opcional, los crea si no existen mediante el atributo CreateIfNotExists.

Importante

Si proporciona un contenedor existente en lugar de usar CreateIfNotExists, asegúrese de que tenga el tiempo de vida habilitado.

Puede personalizar la configuración de cliente del SDK con CosmosClientBuilder o si la aplicación ya utiliza CosmosClient para otras operaciones con Azure Cosmos DB, también puede insertarla en el proveedor:

services.AddCosmosCache((CosmosCacheOptions cacheOptions) =>
{
    cacheOptions.ContainerName = "myContainer";
    cacheOptions.DatabaseName = "myDatabase";
    cacheOptions.CosmosClient = preExistingClient;
    /* Creates the container if it does not exist */
    cacheOptions.CreateIfNotExists = true; 
});

Después de esto, puede utilizar sesiones de ASP.NET Core como cualquier otro proveedor y usar el objeto HttpContext.Session. Recuerde siempre intentar cargar la información de sesión de manera asincrónica en función de las recomendaciones de ASP.NET.

Escenarios de caché distribuida

Dado que el proveedor de Azure Cosmos DB implementa la interfaz IDistributedCache para que actúe como proveedor de caché distribuida, también se puede usar para cualquier aplicación que requiera la caché distribuida, no solo para aplicaciones web que requieran un proveedor de estado de sesión distribuido y eficaz.

Las cachés distribuidas requieren coherencia de datos para proporcionar instancias independientes a fin de poder compartir esos datos almacenados en caché. Cuando use el proveedor de Azure Cosmos DB, puede:

  • Use la cuenta de Azure Cosmos DB en Coherencia de la sesión si puede habilitar Enrutamiento de solicitud de aplicaciones y hacer que las solicitudes permanezcan en una instancia determinada.
  • Utilice la cuenta de Azure Cosmos DB en obsolescencia limitada o coherencia fuerte sin que sea necesario solicitar la permanencia. Esto proporciona la mayor escala en términos de distribución de carga entre las instancias.

A fin de utilizar el proveedor de Azure Cosmos DB como caché distribuida, se debe registrar en los servicios ConfiguredService con la llamada a services.AddCosmosCache. Una vez hecho esto, cualquier construcción de la aplicación puede pedir la caché al hacer referencia a IDistributedCache y recibirá la instancia insertada por la inserción de dependencias que se va a utilizar:

public class MyBusinessClass
{
    private readonly IDistributedCache cache;

    public MyBusinessClass(IDistributedCache cache)
    {
        this.cache = cache;
    }
    
    public async Task SomeOperationAsync()
    {
        string someCachedValue = await this.cache.GetStringAsync("someKey");
        /* Use the cache */
    }
}

Solución de problemas y diagnóstico

SE APLICA A: NoSQL

Como el proveedor de Azure Cosmos DB utiliza el SDK de .NET de manera subyacente, se aplican todas las directrices de rendimiento y las guías para la solución de problemas para comprender cualquier problema potencial. Tenga en cuenta que hay una manera distinta de obtener acceso a los diagnósticos desde las operaciones de Azure Cosmos DB subyacentes, porque no se pueden exponer a través de las API IDistributedCache.

El registro del delegado de diagnóstico opcional le permitirá capturar y registrar condicionalmente los diagnósticos a fin de solucionar cualquier caso, como una latencia alta:

void captureDiagnostics(CosmosDiagnostics diagnostics)
{
    if (diagnostics.GetClientElapsedTime() > SomePredefinedThresholdTime)
    {
        Console.WriteLine(diagnostics.ToString());
    }
}

services.AddCosmosCache((CosmosCacheOptions cacheOptions) =>
{
    cacheOptions.DiagnosticsHandler = captureDiagnostics;
    /* other options */
});

Pasos siguientes

  • Para más detalles sobre el proveedor de caché y sesión de Azure Cosmos DB, consulte el código fuente en GitHub.
  • Pruebe el proveedor de caché y sesión de Azure Cosmos DB mediante la exploración de una aplicación web ASP.NET Core de ejemplo.
  • Lea más sobre las cachés distribuidas en .NET.