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.
Puede seguir el código de ejemplo que escribí para este post en GitHub.
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-beta2
o 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
.
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 ConfigureServices
añade un par de espacios de nombres:
1 2 |
utilizando Couchbase.Extensiones.Almacenamiento en caché; utilizando Couchbase.Extensiones.DependencyInjection; |
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í, DependencyInjection
es 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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
público void ConfigureServices(IServiceCollection servicios) { servicios.AddMvc(); servicios.AddCouchbase(op => { op.Servidores = nuevo Lista<Uri> { nuevo Uri("http://localhost:8091") }; }); servicios.AddDistributedCouchbaseCache("cachebucket", "contraseña", op => { }); } |
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:
1 2 3 4 5 6 7 8 9 10 11 12 |
público clase InicioControlador : Controlador { privado sólo lectura IDistributedCache _cache; público InicioControlador(IDistributedCache caché) { _cache = caché; } // ... snip ... } |
Almacenamiento de cadenas
Puede utilizar la función GetString
y SetString
para recuperar/establecer un valor de cadena en la caché.
1 2 3 4 5 6 7 8 9 |
// caché/recuperación de la caché // una cadena, almacenada bajo la clave "CachedString1" var mensaje = _cache.GetString("CachedString1"); si (mensaje == null) { mensaje = FechaHora.Ahora + " " + Ruta.GetRandomFileName(); _cache.SetString("CachedString1", mensaje); } VerDatos["Mensaje"] = "'CachedString1' es '" + mensaje + "'"; |
Esto aparecería en el bucket "cachebucket" como un valor binario codificado (no JSON).
En el código de ejemplo, simplemente imprimo el archivo ViewData["Mensaje"]
en la vista Razor. Debería ser algo parecido a esto:
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:
1 2 3 4 5 6 |
público clase MyPoco { público cadena Nombre { consiga; configure; } público int Número de zapato { consiga; configure; } público decimal Precio { consiga; configure; } } |
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:
1 2 3 |
var pocoKey = Ruta.GetRandomFileName(); _cache.Establecer(pocoKey, MyPoco.Genere(), null); VerDatos["Mensaje2"] = "Caché de un POCO en '" + pocoKey + "'"; |
A continuación, imprimo la clave de la vista Razor:
A continuación, puedo utilizar esta clave para buscar el valor en 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).
1 2 3 4 5 6 |
var otraPocoKey = Ruta.GetRandomFileName(); _cache.Establecer(otraPocoKey, MyPoco.Genere(), nuevo DistributedCacheEntryOptions { DeslizamientoExpiración = nuevo TimeSpan(0, 0, 10) // 10 segundos }); VerDatos["Mensaje3"] = "Caché de un POCO en '" + otraPocoKey + "'"; |
En el proyecto de ejemplo, también lo he configurado para que se imprima en Razor.
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:
1 2 3 4 5 6 |
{ "id": "xjkmswko.v35", "rev": "1-14e1d9998125000059b0404502000001", "caducidad": 1504723013, "banderas": 33554433 } |
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
:
1 2 3 4 |
appLifetime.AplicaciónParada.Regístrese en(() => { aplicación.Servicios de aplicación.GetRequiredService<ICouchbaseLifetimeService>().Cerrar(); }); |
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.
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)
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).
Gracias Matthew. Estoy totalmente de acuerdo. Una vez más, por favor, siga escribiendo buenos artículos como este, ya que son muy útiles.