El almacenamiento en caché distribuido puede ayudar a mejorar el rendimiento de una aplicación ASP.NET Core. Esto es especialmente cierto para una aplicación ASP.NET que se despliega en una granja de servidores o en un entorno de nube escalable. El uso de Couchbase Server para el almacenamiento en caché es una de las muchas características que lo convierten en una opción ideal para tu necesidades de la base de datos de compromisos.

En esta entrada del blog, te mostraré cómo utilizar la función Plugin de middleware Couchbase.Extensions.Caching para añadir fácilmente capacidades de caché distribuida a su aplicación.

Tenga en cuenta que Couchbase.Extensions.Caching se encuentra actualmente en una versión beta2 (mientras escribo esta entrada del blog), por lo que algunas cosas pueden cambiar.

Configuración básica de Couchbase

En primer lugar, necesitarás un clúster de Couchbase Server en funcionamiento (puedes instalarlo en las instalacioneso con Dockero incluso en Azure si lo desea).

A continuación, deberá crear un cubo en Couchbase donde se almacenarán los datos en caché. Yo llamé al mío "cachebucket". Puede que quieras aprovechar la nueva función de cubo efímero en Couchbase Server 5.0 para el almacenamiento en caché, pero no es necesario.

Si estás usando Couchbase Server 5.0, también necesitarás crear un usuario con permisos (Data Writer y Data Reader) en ese bucket. Para simplificar las cosas, crea un usuario que tenga el mismo nombre que el bucket (por ejemplo, "cachebucket").

Caché distribuido con Couchbase.Extensions

En Couchbase.Extensions (GitHub) tiene como objetivo simplificar el trabajo con Couchbase Server y .NET Core. El almacenamiento en caché es solo una de estas extensiones.

Puede añadirlo a su proyecto ASP.NET Core con NuGet, a través de Package Manager: Install-Package Couchbase.Extensions.Caching -Versión 1.0.0-beta2o con la interfaz de usuario de NuGet, o puede utilizar la línea de comandos de .NET: dotnet add package Couchbase.Extensions.Caching --version 1.0.0-beta2.

Couchbase extension for distributed caching available on NuGet

Una vez que haya añadido esto a su proyecto, tendrá que hacer un par de cambios menores a su Puesta en marcha clase en Inicio.cs.

En primer lugar, en ConfigureServicesañade un par de espacios de nombres:

Esto hará que el espacio de nombres Caching esté disponible, y específicamente el espacio de nombres AddDistributedCouchbaseCache método de extensión para IServiceCollection. A continuación, llame a ese método de extensión desde ConfigureServices método.

El otro espacio de nombres allí, DependencyInjectiones necesario para inyectar la funcionalidad de Couchbase. En este caso, va a ser utilizado sólo por la extensión Caching. Pero puedes usarlo para otros propósitos también, que cubriré en una futura entrada del blog.

Pero por ahora, sólo se necesita para la AddCouchbase método de extensión en IServiceCollection.

Por último, junte ambos y su ConfigureServices debería tener este aspecto:

Uso de la caché distribuida

Ahora que ha configurado la caché distribuida con Couchbase en su proyecto ASP.NET Core, puede utilizar IDistributedCache en otra parte de su proyecto.

Inyección de IDistributedCache

Un ejemplo sencillo sería utilizarlo directamente en un controlador. Se puede inyectar en los constructores a medida que lo necesite:

Almacenamiento de cadenas

Puede utilizar la función GetString y SetString para recuperar/establecer un valor de cadena en la caché.

Esto aparecería en el bucket "cachebucket" como un valor binario codificado (no JSON).

String cached in Couchbase

En el código de ejemplo, simplemente imprimo el archivo ViewData["Mensaje"] en la vista Razor. Debería ser algo parecido a esto:

Cached string output to Razor

Almacenamiento en caché de objetos

También puede utilizar Conjunto y Obtener para guardar y recuperar objetos en la caché. He creado un POCO (Plain Old CLR Object) muy simple para demostrarlo:

A continuación, en la muestra, genero una cadena aleatoria para utilizarla como clave de caché, y una instancia generada aleatoriamente de MyPoco. En primer lugar, los almaceno en la caché utilizando la función Conjunto método:

A continuación, imprimo la clave de la vista Razor:

Cached POCO output to Razor

A continuación, puedo utilizar esta clave para buscar el valor en Couchbase:

Cached POCO in Couchbase

Además, fíjate en que se ha serializado a JSON. Esto no solo significa que puedes leerlo, sino que también puedes consultarlo con N1QL (si lo necesitas).

Caché distribuida con caducidad

Si desea que los valores de la caché caduquen después de un determinado período de tiempo, puede especificarlo con DistributedCacheEntryOptions (sólo DeslizamientoExpiración por el momento).

En el proyecto de ejemplo, también lo he configurado para que se imprima en Razor.

Cached POCO with expiration

Si visualizas ese documento (antes de que se agoten los 10 segundos) en la consola de Couchbase, verás que tiene un icono caducidad en sus metadatos. He aquí un ejemplo:

Después de 10 segundos, ese documento desaparecerá del cubo, y verás un error "no encontrado (El documento no existe)".

Desmontando la caché distribuida

Por último, no olvides limpiar los recursos utilizados por el SDK .NET de Couchbase para el almacenamiento en caché distribuido. Una forma fácil de hacerlo es con el comando AplicaciónParada evento. Puede conectarlo en Puesta en marcha:

Tenga en cuenta que tendrá que añadir IApplicationLifetime appLifetime como parámetro del Configure método en Puesta en marcha si aún no lo ha hecho.

Resumen

El uso de Couchbase Server para el almacenamiento en caché distribuido en tu aplicación ASP.NET Core es una gran manera de mejorar el rendimiento y la escalabilidad en tu aplicación. Este tipo de casos de uso de "compromiso" son en los que Couchbase Server destaca. Para ver los clientes que están utilizando Couchbase Server para el almacenamiento en caché, echa un vistazo a la Clientes de Couchbase página.

Si tiene alguna pregunta o comentario sobre el proyecto Couchbase.Extensions.Caching, asegúrese de consultar la sección Repositorio GitHub o el Foros del SDK .NET de Couchbase.

Como siempre, puede ponerse en contacto conmigo dejando un comentario a continuación o buscándome en Twitter @mgroves.

Autor

Publicado por Matthew Groves

A Matthew D. Groves le encanta programar. No importa si se trata de C#, jQuery o PHP: enviará pull requests para cualquier cosa. Lleva codificando profesionalmente desde que escribió una aplicación de punto de venta en QuickBASIC para la pizzería de sus padres, allá por los años noventa. Actualmente trabaja como Director de Marketing de Producto para Couchbase. Su tiempo libre lo pasa con su familia, viendo a los Reds y participando en la comunidad de desarrolladores. Es autor de AOP in .NET, Pro Microservices in .NET, autor de Pluralsight y MVP de Microsoft.

3 Comentarios

  1. Mathew,

    Este fue un buen artículo sobre cómo empezar con el couchebase. Intenté descargar el servidor couchebase localmente para estudiarlo y pude implementar el almacenamiento en caché en una aplicación dotnet core utilizando el middleware proporcionado. El único problema que tengo ahora es con la versión antigua de couchebase en mi lugar de trabajo. Resulta que tienen un servidor couchebase antiguo que no tiene seguridad protegida por contraseña a nivel de bucket y cuando estoy tratando de
    services.AddCouchbase(opt =>
    {
    opt.Servidores = nueva Lista
    {
    nuevo Uri("http://myworkplacecouchebasehostname:8091")
    };
    });
    //no hay contraseña para el cubo, así que se
    services.AddDistributedCouchbaseCache("bucketname", opt => {});

    Obtengo el siguiente error con stacktrace, puede por favor me apunte en la dirección correcta o lo que me estoy perdiendo aquí:
    Se ha producido una excepción no controlada al procesar la solicitud.
    BootstrapException: No se pudo arrancar - compruebe las excepciones internas para más detalles. (Ha fallado un intento de conexión porque la parte conectada no ha respondido correctamente tras un periodo de tiempo, o la conexión establecida ha fallado porque el host conectado no ha respondido) (No se ha podido arrancar con CCCP. (Ha fallado un intento de conexión porque la parte conectada no ha respondido correctamente después de un periodo de tiempo, o la conexión establecida ha fallado porque el host conectado no ha respondido)) (Después del arranque, la lista de nodos tiene cero elementos, lo que indica que el cliente ha fallado durante el arranque. Compruebe los registros del cliente para obtener más información sobre el motivo del fallo).
    Couchbase.Core.ClusterController.CreateBucketImpl(string bucketName, string password, IAuthenticator authenticator)

    SocketException: Un intento de conexión ha fallado porque la parte conectada no ha respondido correctamente después de un periodo de tiempo, o la conexión establecida ha fallado porque el host conectado no ha respondido
    Couchbase.IO.DefaultConnectionFactory+c__0.b__0_0(IConnectionPool p, IByteConverter c, BufferAllocator b)

    CouchbaseBootstrapException: Después del bootstrapping la lista de nodos tiene cero elementos indicando que el cliente falló durante el bootstrapping. Por favor, compruebe los registros del cliente para obtener más información sobre por qué falló.
    Couchbase.Configuration.CouchbaseConfigContext.UpdateServices(Dictionary servidores)

    SocketException: Un intento de conexión ha fallado porque la parte conectada no ha respondido correctamente después de un periodo de tiempo, o la conexión establecida ha fallado porque el host conectado no ha respondido
    Couchbase.IO.DefaultConnectionFactory+c__0.b__0_0(IConnectionPool p, IByteConverter c, BufferAllocator b)

    1. Hola zysed,

      Te recomiendo que publiques esta pregunta en los foros de .NET: https://forums.couchbase.com/c/net-sdk o posiblemente como una edición de la biblioteca de extensiones: https://github.com/couchbaselabs/Couchbase.Extensions

      Es probable que haya una solución, y publicando en esos lugares conseguirá más ojos en él que sólo la mía.

      Recomendaría encarecidamente poner una contraseña en tu bucket o actualizar a una versión más reciente de Couchbase Server (donde ya no es posible tener un bucket sin contraseña). Incluso si tu servidor está detrás de un firewall, sigue siendo peligroso dejarlo completamente inseguro. Y además, una versión tan antigua de Couchbase es probable que deje de recibir versiones de corrección de errores (si no lo ha hecho ya).

  2. Gracias Matthew. Estoy totalmente de acuerdo. Una vez más, por favor, siga escribiendo buenos artículos como este, ya que son muy útiles.

Dejar una respuesta