DEVintersección 2016

Escalado de aplicaciones .NET con almacenamiento en caché distribuido

Por Iqbal Kan
Presidente y evangelista tecnológico

Sus aplicaciones .NET pueden experimentar cuellos de botella en la base de datos o en el almacenamiento debido al aumento de la carga de transacciones. Aprenda a eliminar cuellos de botella y escalar sus aplicaciones .NET mediante el almacenamiento en caché distribuido. Esta charla cubre:

  • Descripción general rápida de los cuellos de botella de escalabilidad en las aplicaciones .NET
  • Descripción del almacenamiento en caché distribuido y cómo resuelve los problemas de rendimiento
  • ¿Dónde puede usar el almacenamiento en caché distribuido en su(s) aplicación(es)?
  • Algunas características importantes en un caché distribuido
  • Ejemplos prácticos usando un caché distribuido

General

Hola todos. Mi nombre es Iqbal khan. Soy un evangelista tecnológico en Alachisoft. Somos una empresa de software con sede en el Área de la Bahía de San Francisco. NCache es nuestro producto estrella, que es un caché distribuido y este es mi tema de hoy. mi tema no es sobre NCache hoy, su almacenamiento en caché en general. NosDB es otro producto que tenemos, es de código abierto NoSQL database para .NET. Voy a usar Azure para hacer una demostración de la memoria caché distribuida para que puedan ver cómo se usa realmente.

Entonces, el tema de hoy es escalar aplicaciones .NET para el almacenamiento en caché distribuido. Prefiero tener una discusión más interactiva. Entonces, mientras hablo, si tienen alguna pregunta, levanten la mano. Entonces, podemos hablar de eso justo en ese punto en lugar de esperar hasta el final. Creo que eso hace que la conversación sea mucho más significativa.

Entonces, déjame empezar. ¡Okey! Entonces, vamos a repasar algunas definiciones. Estoy seguro de que la mayoría de ustedes ya saben esto, pero esto es para completarlo.

Escalabilidad

La primera definición es escalabilidad. La escalabilidad es un alto rendimiento de la aplicación bajo cargas máximas. Entonces, si tiene, digamos, una aplicación ASP.NET o cualquier aplicación .NET que funcione súper rápido, con, digamos, cinco usuarios, no es necesariamente escalable. Por supuesto, si no funciona rápido con cinco usuarios, entonces tiene otros problemas además de este. Pero la mayoría de las aplicaciones funcionan súper rápido con cinco usuarios, pero es cuando llegas a 5,000 o 50,000 500,000 o XNUMX XNUMX usuarios cuando las cosas realmente comienzan a fallar. Por lo tanto, si desea que su aplicación sea escalable, debe funcionar con cargas máximas.

Escalabilidad lineal

La escalabilidad lineal significa que la arquitectura de su aplicación, su estrategia de implementación, si se realiza de tal manera que agregar más servidores le brinda una capacidad incremental de manejar más transacciones de las que es escalable linealmente.

Escalabilidad lineal

Eso significa que si tiene dos servidores y agrega, digamos mil usuarios con un servidor de tres, debería tener 1500 usuarios o algo así.

Escalabilidad no lineal

Pero, si su aplicación, si su arquitectura o implementación no es linealmente escalable, se parecerá más a una curva logarítmica que sube y baja, lo que significa que después de cierto punto, realmente no importa si agrega más servidores.

Escalabilidad no lineal

Ralentizará las cosas. Si tiene más transacciones, simplemente no puede salir. No puedes comprarte a ti mismo para salir de ese problema. Por lo tanto, no solo desea escalabilidad sino también escalabilidad lineal.

¿Qué aplicaciones necesitan escalabilidad?

Las siguientes aplicaciones son las que suelen tener este tipo de problemas. Estas son aplicaciones web ASP.NET, estos son servicios web, estos son back-end de Internet IOT que generalmente también son servicios web, es posible que tenga un procesamiento de big data que generalmente no es tan común en .NET pero, el procesamiento de big data también es algo que necesita escalar o cualquier otra aplicación de servidor. Puede ser una institución financiera que tenga un requisito de cumplimiento para procesar cierta cantidad de transacciones.

Por lo tanto, es posible que tenga una aplicación de servidor que tenga un requisito de cumplimiento para, digamos, si es una aplicación de transferencia bancaria, debe transferir los fondos para el siguiente día hábil o en un momento determinado. Por lo tanto, debe poder procesar más y más transacciones. Entonces, si tiene una de estas aplicaciones, entonces ha venido a la conversación correcta.

El problema de la escalabilidad

Entonces, definamos el problema de escalabilidad. La mayoría de ustedes sabe que las arquitecturas de sus aplicaciones hoy en día, si tiene una aplicación ASP.NET o de servicios web, la arquitectura de las escalas de nivel de la aplicación varía linealmente. Por lo tanto, puede agregar más servidores, por lo general no hay problema. El problema realmente es con el almacenamiento de datos y, cuando uso la palabra almacenamiento de datos, me refiero a bases de datos relacionales y mainframe. Hay datos heredados. Cualquier almacén de datos que usó tradicionalmente y que se convierte en un cuello de botella y cuando se convierte en un cuello de botella, entonces tiene este problema. Él NoSQL databases, se suponía que debía decir que no siempre son la respuesta. Pero NoSQL el movimiento comenzó en parte debido a esto. Debido a que las bases de datos relacionales no eran escalables, NoSQL databases son escalables, pero no son buenos en todas las situaciones porque, ya sabes, requieren que muevas todos tus datos de tu base de datos existente a una NoSQL database lo que puede hacer para una gran cantidad de datos nuevos, pero los datos comerciales tradicionales, sus clientes, sus cuentas, todos esos datos deben permanecer en relación tanto por razones comerciales como por razones técnicas. Por supuesto, las razones técnicas son que una base de datos relacional tiene un ecosistema que no se corresponde con ninguna NoSQL database y las razones comerciales son, por supuesto, de la misma naturaleza.

Por lo tanto, la NoSQL database no siempre es la respuesta y aunque tenemos NoSQL database producto que vendemos se llama NosDB, que se usa solo como un aumento de las bases de datos relacionales. Por lo tanto, no puede salir de las bases de datos relacionales. Las bases de datos relacionales llegaron para quedarse. Entonces, necesitas vivir con esa realidad. Por lo tanto, debe resolver la escalabilidad con las bases de datos relacionales aún en la imagen.

La solución de escalabilidad

La solución, por supuesto, es que debe usar un caché distribuido en memoria. NCache es una de esas soluciones. Es un caché distribuido de código abierto. Somos la caché distribuida .NET más antigua del mercado. Hemos existido durante los últimos 10 años, en realidad 11 ahora. Y somos el único caché .NET realmente nativo.

La mayoría de ustedes ha oído hablar de Redis, ¿derecho? Entonces, hace más de 2 años, nunca habíamos oído hablar de Redis porque realmente no estaban enfocados en eso. No fue hasta que Microsoft se asoció con ellos para Azure.

Implementación de caché distribuida

El beneficio de un caché distribuido en memoria es que puede usarlo con sus bases de datos existentes. Entonces, puede resolver ese problema que le brindan sus bases de datos relacionales a través de un caché distribuido en memoria. Entonces, ¿cómo resuelves ese problema? Resuelve ese problema, veamos esta imagen aquí.

Implementación de caché distribuida
Arquitectura de caché distribuida

Entonces, tiene un nivel de aplicación que son sus aplicaciones web, su servicio web, cualquier otra aplicación de servidor y puede agregar más servidores aquí. Para aplicaciones web y servicios web, generalmente hay un balanceador de carga que no dibujé en esto. Por lo tanto, puede agregar más servidores en esta capa. No puede agregar más servidores en la capa de la base de datos. ¡Sí! Puede agregar más servidores en el NoSQL capa, pero, como dije, no siempre es la respuesta. Entonces, tienes que resolver estas dos casillas. Entonces, coloca un caché distribuido en memoria entre el nivel de la aplicación y la base de datos.

La memoria caché distribuida suele formar un clúster. Por lo tanto, no todos los cachés distribuidos forman un clúster. Memcached nunca formó un agrupamiento a pesar de que era un caché distribuido. Redis forma un racimo, NCache definitivamente forma un grupo. Una caché distribuida forma un grupo de dos o más servidores aquí. La razón por la que digo dos es por motivos de redundancia y para la replicación y para muchos otros y también por motivos de escalabilidad. Si solo necesita un servidor de caché, probablemente no necesite un caché distribuido. Por lo tanto, debe tener un mínimo de dos servidores de caché aquí y este clúster de caché realmente agrupa la memoria y los recursos de la CPU de todos los servidores de caché en una capacidad lógica. Lo que eso significa es que a medida que agrega más servidores, obtiene más memoria, más procesamiento de CPU y más capacidad de tarjeta de red. Esos son los tres cuellos de botella para la escalabilidad; memoria, CPU y tarjeta de red. Las tarjetas de red en estos días son... un gigabit o diez gigabits es bastante estándar. Es bastante difícil sacar el máximo de una tarjeta de un gigabit o diez gigabits, a menos que los tamaños de los objetos sean grandes. Pero, si los tamaños de sus objetos son grandes, grande significa cientos de kilobytes por objeto, entonces es bastante fácil maximizar una tarjeta de red si tiene mucho tráfico. Pero, si tiene más servidores y, por supuesto, eso es más tarjetas de red y entonces la memoria es de la misma manera.

La razón por la que es un caché distribuido en memoria es porque la memoria es mucho más rápida que el disco y eso es lo que realmente agrega valor. Es más rápido, es más escalable. Entonces, el objetivo aquí es capturar alrededor del 80% del acceso a la aplicación que va a la caché distribuida. Entonces, solo quedará un 20% para ir a la base de datos.

Mucha gente vio inicialmente el almacenamiento en caché como un aumento del rendimiento. ¡Sí! Es un impulso de rendimiento porque en memoria es más rápido que esto. Pero lo que es más importante, es una necesidad de escalabilidad porque no puede escalar sin algo como esto en su infraestructura. De hecho, cada vez más empresas casi están convirtiendo en un estándar que, al igual que tendrán una base de datos en su entorno de aplicación, también tendrán un caché distribuido. Algunas personas lo llaman cuadrícula de datos en memoria que está en el lado de Java, ese es un término. Algunas personas lo llaman un poco de tejido de datos, pero el caché distribuido es el nombre más común para el ecosistema .NET. Entonces, esto es una infraestructura. Una vez que lo tenga en su lugar, puede usarlo como una herramienta realmente poderosa. La relación entre los servidores de aplicaciones y el nivel de almacenamiento en caché suele ser de aproximadamente 4:1, 5:1, suponiendo que se trate de servidores bastante cargados en términos de transacciones. Puede ir más de 5:1 también dependiendo de la naturaleza de estos. Y, un servidor de caché típico tiene entre 16 gigas y 32 gigas de memoria y un tipo de configuración de cuatro núcleos de CPU dual. Entonces, no es una caja de muy alta gama. De hecho, no desea una caja de muy alta gama en esta capa. Quiere más cajas que unas pocas cajas de gama alta. Si agrega más memoria, puede subir a 128 o 256 gigas de memoria, pero más memoria significa que necesita tener una CPU más potente. ¿Porqué es eso? Porque, si tiene más memoria, su montón es más grande, su recolección de basura será una tarea mucho más grande y la recolección de basura no es lo más rápido en .NET y consumirá su CPU. Entonces, te pareces cada vez más a una base de datos. Por lo tanto, es mejor tener de 16 a 32 gigabits, es un punto óptimo bastante bueno por servidor de caché. ¿Alguna pregunta hasta ahora?

NCache Números de escalabilidad

Aquí están los números de escalabilidad de NCache. Cachés diferentes tendrían números diferentes, pero el objetivo es que esto sea escalable. Entonces, las lecturas escalan de esta manera, las escrituras escalan esto. Las lecturas son más lentas que las escrituras porque la replicación ocurre con las lecturas. Hablaré de esas capacidades.

NCache Números de escalabilidad

La razón por la que necesita la replicación es porque la memoria es volátil. Por lo tanto, si algún servidor se cae, perderá esos datos. Por lo tanto, no desea perder esos datos en muchos casos.

Usos comunes de la caché distribuida

El objetivo de la charla hasta ahora era mostrarle por qué necesita el almacenamiento en caché distribuido. Y, ahora que hemos establecido ese caso, hablemos sobre para qué usará un caché distribuido.

Almacenamiento en caché de datos de aplicaciones

El caso de uso más común es de lo que estaba hablando, que es un almacenamiento en caché de datos de la aplicación. Usted almacena en caché los datos que existen en su base de datos, aquí mismo. Por lo tanto, almacena en caché todo lo que puede y luego mejora su rendimiento y escalabilidad.

Lo principal a notar en el caso de uso de almacenamiento en caché de datos de la aplicación es que los datos existen en dos lugares. Uno en la base de datos, uno en el caché. Cada vez que eso sucede, ¿cuál es la primera preocupación que le viene a la mente que podría salir mal si existiera en dos lugares? ¡Sí, consistencia!

Entonces, es muy importante que un buen caché distribuido maneje eso. Porque, si un caché no puede manejar el hecho de que los datos deben ser consistentes en ambos lugares, se verá obligado a almacenar en caché más datos de solo lectura. Los datos de solo lectura representan aproximadamente del 10 % al 15 % o el 20 % de los datos. La mayoría de los datos son lo que yo llamo datos transaccionales. Estos son sus clientes sus cuentas. Esos son datos que están cambiando. Puede cambiar cada pocos segundos, aunque la mayoría de las veces puede cambiar cada dos minutos. Entonces, incluso si pudiera almacenarlo en caché durante un minuto o 30 segundos, aún se beneficiaría de que lo leerá varias veces y si lo multiplica por el número total de transacciones que están ocurriendo en un día determinado, tiene millones de transacciones. que ya no van a la base de datos. Entonces, es muy importante que para el almacenamiento en caché de datos de la aplicación, un buen caché distribuido debe manejar esta consistencia y repasaré esas características que son realmente importantes para tener esa consistencia. Por lo tanto, el almacenamiento en caché de datos de aplicaciones almacena en caché datos permanentes. Datos permanentes significa que esto existe en su base de datos de forma permanente.

Almacenamiento en caché específico de ASP.NET

El segundo caso de uso es, si tiene una aplicación ASP.NET, esto, por supuesto, también se aplica a otras aplicaciones web, pero me estoy enfocando en .NET. Puede almacenar en caché su estado de sesión, su estado de vista, si no está utilizando el marco MVC y puede almacenar en caché su salida, la salida de la página. Todos esos datos son de naturaleza temporal. No es permanente. Cualquier dato que no sea permanente no debería existir realmente en la base de datos. Es un dato transitorio.

Cuando los datos son transitorios, cuando son temporales y no existen en la base de datos, solo existen en el caché, ¿cuál es la mayor preocupación que me viene a la mente que podría salir mal? Persistencia… O falta de ella. Entonces, si no persistes, pierdes datos. ¿Qué pasa si este servidor de caché deja de funcionar y usted tiene esta canasta de compras o lo que sea y digamos que es una aerolínea y este cliente suyo acaba de hacer esta búsqueda de vuelos y va a comprar 10 boletos o cuatro boletos por un valor de al menos $ 5,000 y la última página que dicen enviar o lo que sea la última página y de repente la sesión desaparece porque el servidor de caché se cayó y tienen que empezar todo de nuevo. Toda la actividad se pierde. Puede perder ese cliente. No es una muy buena experiencia.

Entonces, cualquier cosa que almacene en caché que sea transitoria, la caché debe replicar. Cualquier caché que no haga replicación, no es un caché viable. Y la replicación tiene un costo, por lo que la memoria caché debe realizar una replicación eficaz y eficiente. El estado de la sesión es un caso de uso muy común para una caché distribuida porque las sesiones son muy comunes en ASP.NET.

Intercambio de datos en tiempo de ejecución a través de eventos

El tercer caso común o el tercer caso de uso que en realidad no es muy conocido se denomina uso compartido de datos en tiempo de ejecución. Esto es, si tiene varias aplicaciones que necesitan compartir. Una aplicación produce algo o actualiza algo que otra aplicación o la otra instancia de esa aplicación necesita usar. Por lo general, usaría colas de mensajes para esto tradicionalmente o simplemente colocaría esos datos en la base de datos y la otra aplicación los extraerá. Pero, un caché distribuido es muy bueno para ese caso de uso. No está ahí para reemplazar las colas de mensajes. Las colas de mensajes tienen otro uso, pero si su aplicación se ejecuta en el mismo centro de datos, todas las instancias y necesitan compartir datos, entonces esta es una plataforma de intercambio de datos o datos mucho más escalable porque todas las aplicaciones están conectadas a la misma plataforma y esto plataforma puede iniciar eventos, en un modelo Pub/Sub. Pub significa que una aplicación es el editor, publican algo y desencadenan un evento. Todos los suscriptores de eso serán notificados y consumirán esos datos.

También hay otros tipos de notificaciones. Cuando se modifican ciertos artículos, su aplicación puede mostrar interés en ciertos artículos y si este artículo cambia, notifíqueme. o hay un consulta continua característica que NCache tiene que es como un dependencia SQL función en el servidor SQL, donde NCache le permite decir un tipo de consulta SQL que dice SELECCIONA Clientes DONDE Clientes.Ciudad = "Nueva York". Entonces, si algún cliente con este criterio alguna vez ha agregado, actualizado o eliminado del caché notificado.

Por lo tanto, es una forma mucho más inteligente de monitorear los cambios en el caché. Entonces, todas esas cosas le permiten compartir datos entre aplicaciones de una manera muy rápida y escalable en tiempo de ejecución. Y estos también son datos transitorios, aunque muchos de esos datos existen en la base de datos, pero la forma en que los comparte probablemente no. Entonces, es transitorio. Entonces, esto también debe ser replicado. ¿Alguna pregunta hasta ahora? O ustedes ya conocen estas cosas por completo o soy súper bueno.

Descripción general del almacenamiento en caché de datos de la aplicación

Entonces, repasemos y veamos algo del código fuente en términos de cómo… cuáles son las funciones que debe usar y cómo usarlas. voy a usar NCache como el ejemplo, pero como dije, mi atención se centra más en las características reales.

Aquí hay una forma típica en que usaría cualquier caché.

Customer Load(string customerId)
{
    // Key format: Customer:PK:1000
    string key = "Customers:CustomerID:" + customerId;
    
    Customer cust = (Customer) _cache[key];
    
    if (cust == null)
    {
        // Item not in cache so load from db
        LoadCustomerFromDb(cust);
        // Add item to cache for future reference
        _cache. Insert(key, cust);
    }
    return cust;
}

Cargarías un cliente desde una base de datos. Antes de ir a la base de datos, verificará el caché y usará la clave, una clave basada en cadenas. digamos Clientes: ID de cliente y la identificación real del cliente puede ser 1000 o algo así y usted dice que verifique el caché. Si lo tienes en el caché no necesitas ir a la base de datos, lo tienes. Si no lo tiene en el caché, vaya a la base de datos, cargue ese cliente y lo coloque en el caché. Cuando lo pones en el caché, la próxima vez que vengas, tú o cualquier otra persona, lo encontrarás en el caché. Entonces, ese es un paradigma muy simple. Una vez que haces esto, todos pueden encontrar cosas que valen más que el caché.

Por supuesto, hay muchas otras características que puede rellenar previamente la memoria caché con muchos de los datos que cree que es bueno necesitar de todos modos. Por lo tanto, guardará una gran cantidad de visitas a la base de datos por adelantado y luego seguirá agregando de manera incremental datos al caché que no se encuentran en el caché. Por ejemplo, aquí hay un proyecto de Visual Studio. Si fueras a usar NCache vincularía dos de estos ensamblajes. Uno es NCache.Tiempo de ejecución y uno es NCache.Web. Usará dos de los espacios de nombres aquí de manera similar NCache.Tiempo de ejecución y NCache.Web.caching. Nombramos nuestros espacios de nombres para que se acerquen bastante a la caché de ASP.NET. Entonces, que sepas, cuando NCache salió ASP.NET caché era el único caché disponible. Entonces, tiene esto y al comienzo de su aplicación, esta es una aplicación de consola, por supuesto, la suya será diferente. Se conectará al caché y obtendrá un identificador de caché. Cada caché tiene un nombre y tiene un identificador de caché y luego agrega sus objetos al caché. Entonces, digamos que acabas de agregar, lo haces caché.Agregar aquí. Usted especifica su clave. Aunque, esto probablemente no debería ser David Jones, debería ser una identificación de cliente de algún tipo y luego tiene el objeto real y luego tiene vencimientos especificados. Y especificas los vencimientos absolutos de un minuto. Estás diciendo que después de un minuto caducará este elemento del caché. Todo lo demás lo mantuvo por defecto. Y, más adelante puedes hacer caché.Obtener y obtener ese mismo cliente de otro lugar. Entonces, solo operaciones de caché simples.

using System;
using Alachisoft.NCache.Runtime;
using Alachisoft.NCache.Web.Caching;
using Alachisoft.NCache.sample.data;

namespace BasicOperations
{
    public class BasicOperations
    {
        public static void Main(string[] args)
        {
            try
            {
            //Initialize cache via 'initializeCache' using 'Cache Name'
            //to be initialized. 
            Cache cache = NCache.InitializeCache("demoCache");
            cache.Clear();

            //Another method to add item(s) to cache is via CacheItem  object
            Customer customer = new Customer();
            customer.Name = "David Johnes";
            customer.Age = 23;
            customer.Gender = "Male";
            customer.ContactNo = "12345-6789";
            customer.Address = "Silicon Valley, Santa Clara, California";

            DateTime calendar = new DateTime();
            calendar.AddMinutes(1);

            //Adding item with an absolute expiration of 1 minute
            cache.Add("Customer:DavidJohnes", customer, calendar, Cache.NoSlidingExpiration, CacheItemPriority.Normal);
            Customer cachedCustomer = (Customer) cache.Get("Customer:DavidJohnes");
            ...

Demostración práctica

En caso de NCache, todos los cachés tienen nombre. Voy a mostrarles rápidamente cómo se ve un caché y luego volveremos al código. Configuré un montón de máquinas virtuales en Azure. Entonces, puedes correr NCache en Azure, en Amazon, en las instalaciones. En todos los casos, los propios servidores de caché son solo máquinas virtuales. Esto es solo máquinas virtuales de Windows 2008, 2012. El cliente de caché en Azure puede ser una VM, podría ser un rol web, podría ser un rol de trabajo, podría ser un sitio web.

Caché de demostración Azure

Crear una caché en clúster

He iniciado sesión en el cliente de demostración, justo aquí. Ahora voy a ir rápidamente y crear un caché. Entonces, puedo mostrar cómo se ve el caché. Utilice esta herramienta llamada NCache gerente, herramienta gráfica y le permite... Voy a venir aquí y decir que cree un 'Nuevo caché agrupado'.

Crear una caché en clúster

Todos los cachés en NCache son llamados. Entonces, solo voy a nombrar mi caché. Tomaré todo lo demás como predeterminado en este momento.

Especificar nombre de caché

Elegiré una topología para Réplica con particiones. Repasaré esto rápidamente al final de esta charla. Réplica Particionada es mi topología.

Topología de almacenamiento en caché

Usaré la replicación asíncrona.

Estrategia de replicación

Elegiré mi primer servidor de caché, que es demo2. Entonces, esos son dos de mis nodos de caché.

Adición de nodos de caché

Presionaré Siguiente. Tomaré todos los valores predeterminados. Especificaré cuánta memoria quiero asignar a este caché. Entonces, de esa manera el caché no consumirá más memoria que esta. Acabo de dar un concierto pero, por supuesto, el tuyo va a ser mucho más grande. Ese es el tamaño de una partición.

Tamaño de la memoria

Entonces, una vez que el caché usa tanta memoria, el caché está lleno. Por lo tanto, rechazará cualquier elemento nuevo o eliminará algunos de los elementos existentes. Entonces, voy a decir, desaloje el 5% del caché en esto y diré que el uso menos reciente es el algoritmo a usar y acabo de crear el caché.

Voy a seguir adelante y agregar un cliente a esto.

Agregar nodo de cliente

Entonces, acabo de crear un caché y vamos a iniciar el caché.

Iniciar el caché

Simule estrés y monitoree estadísticas de caché

Elegiré las estadísticas, así que puedo usar algunas estadísticas de PerfMon. También voy a monitorear el clúster. Entonces, acabo de iniciar el caché. Este caché se llama caché de demostración. Voy a probarlo rápidamente. Acabo de ejecutar una herramienta de prueba de estrés que viene con NCache y le permite probar rápidamente el caché en su propio entorno.

Herramienta de prueba de estrés

Entonces, este caché ahora está funcionando. Entonces, lo que está sucediendo es que, en el cuadro del cliente, y el cliente se refiere a su cuadro de servidor de aplicaciones, tengo un archivo de configuración, justo aquí. Entonces, acabo de crear el caché y ahora sabe cuáles son los servidores de caché. Ahora, déjame volver al código. Entonces, cuando realmente elegí este nombre de caché, esto es lo que realmente sucedió: mi aplicación ahora se conectó a todos los servidores de caché en el clúster y me dio un identificador de caché, de modo que cuando hago un caché.Agregar, en realidad lo agregará al lugar apropiado en el caché y también hará la replicación por mí, todo eso está hecho.

Entonces, la API oculta todos esos detalles, pero quería mostrarles cómo se ve ese caché detrás de escena y qué fácil es usar el NCache en esa situación. Entonces, volvamos a nuestro principal. Así es como se vería la API.

  • Conexión de caché
    ICache cache = CacheManager.GetCache(“myDistributedCache”);
    cache.Dispose();
  • Recuperacion de datos
    Employee employee = cache.Get<Employee>("Employee:1000"); 
    bool isPresent = cache.Contains("Employee:1000");
  • Escribir datos
    cache.Add("Employee:1000", employee);
    cache.AddAsync("Employee:1000", employee);
    
    cache.Insert("Employee:1000", employee);
    cache.InsertAsync("Employee:1000", employee);
    
    Employee employee = (Employee) cache.Remove("Employee:1000");
    cache.RemoveAsync("Employee:1000");

Haces un caché.Obtener, caché.Contiene, caché.Agregar, Insertar, Quitar. Insertar significa agregar si no existe, de lo contrario actualizar.

Funciones de almacenamiento en caché de datos de la aplicación

Bien, ahora que tenemos una idea de cómo se ve un caché, qué es una API simple. Vayamos a la característica de la que hablamos. Que son importantes para un caché distribuido.

Mantenga el caché actualizado

Entonces, lo primero que dijimos es que un caché distribuido debe mantener los datos actualizados, el caché actualizado. Entonces, hay cuatro formas en que puede hacer eso. el número uno es caducidad, que muchos cachés tienen, casi todos los cachés le permiten caducar cosas.

Entonces, hay un Caducidad absoluta y hay una Caducidad móvil. Absolute Expiration es lo que les acabo de mostrar, que dice que este elemento expirará, dentro de cinco minutos, independientemente de lo que suceda. Y, la razón por la que digo esto es porque, como digo, estos datos existen en la base de datos y solo puedo confiar durante cinco minutos en que no cambiarán en la base de datos. No quiero mantenerlo por más tiempo en el caché porque podría cambiar en la base de datos. Por lo tanto, está adivinando la naturaleza de los datos. Algunos datos se pueden almacenar en caché durante horas y días. Sabes, esta puede ser tu tabla de consulta. Puede ser que su precio cambie una vez al día o algo así. Por lo tanto, puede almacenar esto en caché durante 24 horas.

Otros datos son sus datos transaccionales. Puede almacenarlo en caché solo durante unos 30 segundos o un minuto porque es todo el tiempo que se sienta cómodo. Por lo tanto, el vencimiento absoluto es para datos permanentes y es una forma de estimar o adivinar cuánto tiempo es seguro mantener los datos en el caché. Es muy importante. Distinción que quiero que se haga entre los vencimientos absolutos y los deslizamientos.

La caducidad deslizante básicamente dice eliminar este elemento de la memoria caché cuando ya nadie lo toque, durante este intervalo. Tocar significa buscar o actualizar. Entonces, por ejemplo, un estado de sesión. Cuando cierra sesión, nadie toca el estado de una sesión. Entonces, después de aproximadamente 20 minutos, debe eliminarse del caché.

La caducidad deslizante se utiliza para datos transitorios, por lo general. Es más una operación de limpieza. No tiene nada que ver con mantener los datos actualizados. Tiene que ver con simplemente deshacerse de él porque ya no lo necesita. Pero, la caducidad absoluta es lo que necesita para mantener los datos actualizados. En segundo lugar, ya sabes, los vencimientos son una cosa muy importante. Todo caché debe tenerlo y la mayoría lo tienen, de hecho creo que todos, al menos con caducidad absoluta.

Sincronizar la caché con la base de datos

La segunda característica es algo que la mayoría de ellos no hace. Y aquí es donde desea sincronizar el caché con la base de datos.

Uso de dependencias de bases de datos

Usted dice, ya sabe, realmente no puedo predecir con qué frecuencia o cuándo se actualizará esto en la base de datos. No sé cuándo se actualizarán los datos en la base de datos. Porque tengo varias aplicaciones que lo están actualizando. Puede ser que otras personas estén tocando directamente los datos. Entonces, solo quiero que el caché monitoree la base de datos. Por lo tanto, el caché debe estar al tanto de este cambio en la base de datos. Esta es una característica que NCache posee. Se llama dependencia de SQL. En realidad, utiliza una característica del servidor SQL llamada dependencia SQL, donde NCache se convierte en un cliente de la base de datos.

Déjame mostrarte rápidamente cómo se ve. Entonces, si tengo un caché aquí. Entonces, nuevamente, de la misma manera que hicimos con las bibliotecas y luego te conectas al caché. Ahora, cuando agregue el elemento al caché, aquí mismo. Si vengo aquí y luego digo 'AgregarProductToCacheWithDependency', ir a la definición. Entonces, aquí le estás diciendo a este caché, aquí está mi declaración SQL.

private static void AddProductToCacheWithDependency (Product product)
{
// Any change to the resulset of the query will cause cache to invalidate the dependent data
string queryText = String.Format("SELECT ProductID, ProductName, QuantityPerUnit, UnitPrice FROM dbo.PRODUCTS WHERE PRODUCTID = {0}", product.ProductID);

//Let's create SQL depdenency
CacheDependency sqlserverDependency = new SqlCacheDependency(connectionString, queryText);

CacheItem cacheItem = new CacheItem(product);
cacheItem.Dependency = sqlserverDependency;

//Inserting Loaded product into cache with key: [item:1]
string cacheKey = GenerateCacheKey(product);
cache.Add(cacheKey, cacheItem);
}

private static string GenerateCacheKey (Product product)
{
string cacheKey = "Product#" + product.productID;
return cachekey;
}

Entonces, su declaración SQL generalmente refleja esa fila en la tabla. Entonces, si agrega un producto, debería ser que la declaración SQL con la ID del producto sea igual a esto. Entonces, está creando esta instrucción SQL para SQL Server. Porque esto es lo que pasa como parte de la dependencia de SQL a SQL Server. se lo pasarás NCache. Entonces, usted en el buzón del cliente está pasando esto a NCache. Entonces, está especificando esto como su declaración SQL. Está creando un objeto 'Elemento de caché' y dentro del elemento de caché especifica la 'Dependencia de SQLServer'. Asi que, SQLCacheDependency es una clase de NCache, Realmente. Esto no es lo mismo que la dependencia del servidor SQL. Tiene el tipo del mismo nombre, excepto la dependencia de caché de SQL. Esto mantiene esa declaración SQL, la especificas y agregas el elemento al caché. Entonces, usted ha hecho esto y en este momento está sentado en esta caja, aquí mismo.

Caché distribuida

Entonces, pasa esto a NCache. Va a uno de los servidores de caché. Este servidor de caché se convierte ahora en un cliente de la base de datos. Porque también ha especificado la información de la cadena de conexión. En algún lugar aquí, especifica la cadena de conexión. Asi que, NCache servidor se convierte en un cliente de su base de datos. Ahora esa base de datos podría ser un servidor SQL, podría ser Oracle y NCache establecerá una conexión de dependencia de SQL. El servidor SQL creará una estructura de datos dentro del servidor SQL que monitoreará el conjunto de datos.

Entonces, al igual que NCache tenía esa función de consulta continua de la que hablé para compartir datos en tiempo de ejecución, donde NCache estaba monitoreando a todos los clientes, donde Customer. Ciudad = “Nueva York”. Ahora el servidor SQL está monitoreando este conjunto de datos dentro del servidor SQL y si alguna fila que coincida con ese criterio se agrega, actualiza o elimina de la base de datos SQL, el servidor SQL notifica al servidor de caché. El servidor de caché ahora sabe que estos datos han cambiado en la base de datos. Entonces, tiene dos opciones. Puede eliminar eso del caché, que es el comportamiento predeterminado, o puede recargar una nueva copia.

Uso de lectura simultánea/escritura simultánea

La forma en que recargará una nueva copia es, si usa otro futuro de NCache , que son leer de parte a parte. Voy a saltarme esto y tendré que volver a esto. Entonces, hay una característica llamada lectura completa que es su código. Implementa un controlador de lectura completa y le mostraré el controlador de lectura completa. Entonces, aquí hay un IReadThroughProvisto.

{
    // <summary>
    // Contains methods used to read an object by its key from the master data source.
    // </summary>

    public class SqlReadThruProvider : Alachisoft.Ncache.Runtime.DatasourceProviders. IReadThruProvider
    {
        private SqlDatasource sqlDatasource;
        // <summary>
        // Responsible for loading the object from the external data source.
        // Key is passed as parameter.
        // <param name="key">item identifier; probably a primary key</param>
        // <param name="exh">Current expiration hint; you can modify the value and attach a new hint</param>
        // <param name="evh">Current eviction hint; you can modify the value and attach a new hint</param>
        // <returns></returns

        public void LoadFromSource(string key, out ProviderCacheItem cacheItem)
        {
            cacheItem = new ProviderCacheItem(sqlDatasource.LoadCustomer(key));
            cacheItem.ResyncItemonExpiration = true;
            cacheItem.ResyncProviderName = sqlDatasource.ConnString;
        }
        // <summary>
        // Perform tasks like allocating resources or acquiring connections
        // </summary>
        ...

Tú implementas esto. Tiene un método Init que lo inicializa. Un método Dispose y en realidad me gusta un método Get. Entonces, te pasan la clave y le devuelves el elemento del caché. Entonces, va a su fuente de datos y carga ese elemento, especifica el vencimiento o cualquier otra cosa y lo pasa de nuevo a NCache. Este código tuyo se ejecuta en el servidor de caché. Esto es algo importante a tener en cuenta.

Entonces, la lectura completa en realidad se ejecuta en el propio servidor de caché. En realidad, tengo otro diagrama.

Leer a través del cargador de caché

Entonces, la lectura completa se ejecuta en el propio servidor de caché. Entonces, el servidor de caché debe desarrollarse en .NET para que su código .NET se ejecute en él, ¿verdad? Entonces, si su tienda .NET, si su aplicación está en .NET, la razón por la que dije que toda su pila debería ser .NET para todos estos beneficios.

Entonces, llegando a, por ejemplo Redis, Redis es un caché basado en Linux. Entonces, es un gran caché, no tengo nada en contra de ellos, pero si eres una tienda de .NET, debes hacer todas estas cosas y tu código debe ejecutarse en el servidor de caché para que el caché pueda sincronizarse con la base de datos y recargar automáticamente ese elemento de la base de datos. Por lo tanto, su controlador de lectura completa es lo que se llama cuando se activa una dependencia de SQL, si lo desea de esa manera. Si no quieres eso, simplemente eliminará ese elemento del caché. Y, cuando se elimine del caché, la próxima vez que su aplicación lo busque, no lo encontrará y lo obtendrá de la base de datos. Ahora, en determinados casos, por ejemplo, es un catálogo de productos que has cacheado y acabas de actualizar el precio. ¿Por qué eliminar el producto del caché, acabas de actualizar el precio? Porque ahora la aplicación debe tener la lógica para obtenerla de la base de datos. Es mejor recargar automáticamente.

Por lo tanto, muchos de los datos, si cree que se necesitarán una y otra vez, ya sea que caduquen o cuando ocurra la sincronización de la base de datos, es mejor volver a cargarlos que eliminarlos. Porque entonces la aplicación no tiene que hacer esto. Cuanto más de esto hace el caché, más fácil se vuelve la aplicación. Entonces, otra forma en que el caché puede sincronizarse con la base de datos. Entonces, si no tiene un servidor SQL u Oracle, digamos, tiene MySQL o DB2, entonces estas dos características que existen, entonces puede usar la dependencia de DB, que es otra característica de NCache que donde NCache agrupa una tabla específica y usted modifica los activadores de su base de datos para actualizar el indicador en esa fila. NCache lo recoge y dice que este artículo tiene cambio. Entonces, necesito que lo quites o lo vuelvas a cargar.

Uso de procedimientos almacenados de CLR

Los procedimientos CLR son otra forma de sincronizar la memoria caché con la base de datos. Donde realmente escribes un procedimiento CLR. Lo llamas desde el gatillo de tu mesa. Entonces, digamos, si tiene un activador Agregar o Actualizar o Eliminar. Usted llama a este procedimiento CLR, llama NCache o llama al caché.

En el caso del procedimiento CLR, debe asegurarse de que la memoria caché admita métodos asíncronos que NCache hace. Por lo tanto, puede hacer en un caché como una llamada asincrónica de inserción y el control vuelve inmediatamente a usted. Porque, si no realiza la llamada asíncrona, las transacciones de su base de datos comenzarán a agotarse. Porque está actualizando varios servidores en el caché, está recorriendo la red, que no es para lo que está diseñada una transacción de base de datos. Por lo tanto, debe tener una llamada asíncrona.

Entonces, esas son las tres formas en que puede sincronizar el caché. Por lo tanto, cualquier caché que haya pagado debe asegurarse de que puede mantener los datos actualizados. Estas son las dos formas.

Sincronice el caché con el no relacional

De la misma manera, si tiene una fuente de datos no relacional, digamos, tiene sus datos en la nube o en cualquier otro lugar. Incluso puede querer hacer una llamada de método web. De hecho, puede implementar una dependencia personalizada que es nuevamente su código que se registra y se ejecuta en los servidores de caché y NCache lo llama y dice que vaya y verifique su fuente de datos si ha cambiado o no. Compruebas la fuente de datos, si ha cambiado avisas NCache esos datos y la fuente de datos ha cambiado. Asi que, NCache puede eliminarlo o volver a cargarlo.

Entonces, de nuevo con una base de datos relacional NCache lo hace todo por ti. En caso de no relacional, debe hacer una dependencia personalizada.

Manejar datos relacionales

El aspecto final de mantener su caché actualizada son las funciones de dependencia. Digamos, si tiene una relación de uno a muchos entre un cliente y un pedido y los está almacenando en caché. ¿Qué sucede si el objeto del cliente se elimina del caché? ¿Deben permanecer las órdenes en el caché o no? ¿Qué sucede si realmente eliminó al cliente de la base de datos? Bueno, normalmente no se eliminan los clientes, cuando digo uno a muchos. Digamos, ¿qué sucede si el lado que elimina del caché realmente significa que también podría haberlo eliminado de la base de datos? Eso significa que el lado muchos ya no es válido. Entonces, ¿quién debe hacer un seguimiento de todo esto? Si el caché puede hacerlo por ti, entonces te hace la vida mucho más simple.

Por ejemplo, el objeto de caché ASP.NET tiene esta característica llamada dependencia de caché. NCache lo ha implementado y, hasta donde yo sé, ningún otro caché de .NET tiene esta característica. Pero, básicamente, registra la relación entre los elementos y dice que esto depende de este elemento, si este elemento se actualiza o elimina alguna vez, elimínelo automáticamente. Entonces, el caché hace la limpieza por usted.

Cuanto más de esto haga el caché por usted, mejor será para usted porque puede estar seguro de que sus datos estarán actualizados. Una vez que tenga esta confianza, puede almacenar en caché prácticamente todos los datos. Es solo una cuestión de qué estrategia usará para mantener los datos actualizados.

Cómo encontrar datos

Entonces, ahora que tiene la confianza de que los datos están actualizados, comenzará a almacenar en caché una gran cantidad de datos. Bueno, una vez que comienza a almacenar en caché todos los datos, lo siguiente que viene es que el caché ahora comienza a parecerse cada vez más a una base de datos. No es una base de datos, siempre es una tienda temporal. Pero, especialmente muchos de esos datos de referencia, prácticamente almacena todo el conjunto de datos en el caché. Cuando eso suceda, querrás poder buscarlo. En lugar de encontrarlo siempre en función de las claves, eso es muy inconveniente. Encontrar cualquier artículo basado en la clave no siempre es conveniente. Desea poder buscar eso a través de otros medios.

Una forma es hacer un búsqueda SQL. Otra vez, SELECCIONE Clientes DONDE clientes.Ciudad = "Nueva York". Al igual que harías o dirías dame todos mis productos de esta categoría. Entonces, obtendrá una colección de esos objetos del caché, no de la base de datos. Viniendo del caché significa, por supuesto, que la base de datos ya no tiene que recibir ese golpe y todo está en la memoria. Es mucho más rápido porque proviene de varios servidores al mismo tiempo.

Entonces, todas estas son consultas paralelas. Y, para que pueda hacer esto, la memoria caché debe ser compatible con la indexación, que NCache hace. No estoy seguro de que otros productos lo hagan o no, pero asegúrese de que el caché admita la indexación. De lo contrario, serán consultas realmente lentas.

Agrupación de datos

Una cosa que no puede hacer en un caché es unir varios objetos o varias tablas, que es lo que puede hacer en una base de datos relacional. Entonces, hay formas de evitarlo, que es que puede agrupar cosas, puede etiquetarlas de ciertas maneras para recuperarlas y de esa manera puede obtener datos en función de algunas asociaciones lógicas o agrupaciones que están en el caché. Entonces, digamos que si almacena todo en caché, le daré un ejemplo. Por ejemplo, digamos que tiene una colección de clientes. Entonces, tengo una colección de etiquetas de objetos y quiero almacenar en caché cada objeto por separado en el caché. Pero, más adelante, quiero poder recuperarlo todo en una sola llamada.

//Caching Query Results (Collection)
//Cache Collection Objects Separately
static void CacheSupplierProducts(NorthwindEntities context, int supplierId)
{
    Tag[] productTags = new Tag[1];
    productTags[0] = new Tag("SupplierProducts:" + supplierId);
    
    IQueryable<Product> products = context.Products;
    
    var result = from product in products
                  where product.SupplierID == supplierId
                  select product;
                  
    foreach (Product p in result)
    {
        String key = "Products:ProductId:" + p.ProductID;
        _cache.Insert(key, p, productTags);
    }
}
...
ICollection productList = _cache.GetByAnyTag(productTags).Values;

Entonces, emito la misma consulta, consulta SQL y digo devuélveme todo. Pero obtuve estos objetos de la base de datos, no los obtuve del caché. Y no son un conjunto de datos completo. Digamos, cualquier conjunto que quisiera buscar en ese momento. Entonces, guardé en caché cada objeto individualmente al que podría necesitar acceder individualmente. Pero quiero poder recuperarlo todo como una colección. Entonces, uso el concepto de una etiqueta. Los etiqueté a todos con la misma etiqueta. Y esa etiqueta podría ser cualquier cadena única y digo que me den todos los elementos que tienen esta etiqueta. Entonces, en una llamada puedo recuperar toda esa colección. Entonces, es ese tipo de cosas que puedes hacer con las etiquetas, eso compensa la falta de uniones en el caché.

Entonces, puedes agrupar. Él grupos y subgrupos. Tu puedes hacer etiquetas. Puedes hacer etiquetas con nombre. Etiquetas con nombre son esencialmente tienes una clave y luego un valor. Si está almacenando en caché, por ejemplo, texto, texto de forma libre. No hay forma de indexar ese texto por sí solo porque es texto. Por lo tanto, debe crear las etiquetas usted mismo y solo etiquetarse puede no ser suficiente. Desea poder nombrar cada etiqueta.

Entonces, al igual que un objeto tiene nombres de atributos. Entonces, la etiqueta de nombre es como los atributos de un objeto. Entonces, el nombre podría ser ciudad y el valor en este texto podría ser Nueva York o Las Vegas. Entonces, puedes hacer todo eso y luego buscar esas cosas y en caso de NCache al menos puede usar si especifica todo esto a través de la API o a través de la Consulta SQL. Entonces, cuando buscas algo basado en SQL...

Primera pregunta, genial! ¿Podemos usar taxonomías jerárquicas? Lo que puede hacer en realidad es... los grupos y subgrupos le brindan solo un nivel de jerarquía. Entonces, dentro de un grupo puede tener múltiples subgrupos pero no puede ir más allá.

Puede usar diferentes tipos de etiquetas para representar porque puede asignar varias etiquetas a un elemento. Entonces, por ejemplo, si tenía varias jerarquías, puede asignar para cada nivel que baje, puede asignar todos los niveles superiores como una etiqueta separada.

Una pregunta más. ¿Podemos controlar la representación interna del caché? Los índices se construyen en base a la combinación de tablas hash, en caso de NCache, y árboles negros rojos. Puede elegir los índices, pero no elige la estructura de datos que se utilizará internamente. Pero, los índices se construyen en función de la naturaleza del uso. Entonces, por ejemplo, las tablas hash son buenas para ciertos tipos de acceso y si va a realizar búsquedas de tipo rango, entonces los árboles rojos y negros son mucho mejores. Entonces el NCache lo hace. No sé qué hacen otros productos, pero NCache indexa cosas bastante.

Lectura y escritura

Déjame pasar rápidamente por el lectura directa, escritura directa. Entonces, ¿por qué desea leer y escribir? Lectura completa, hemos visto un ejemplo de ello, que es que puedes recargar cosas automáticamente.

Otro beneficio de la lectura directa es, por supuesto, que está consolidando la mayor parte de su acceso a los datos en el propio caché. Cuanto más acceda... más de eso va a la caché o capa de almacenamiento en caché, menos está en su aplicación y la aplicación se vuelve más simple. La aplicación solo hace un caché.Obtener y, por supuesto, el otro beneficio de eso fue que puedes cargar cosas automáticamente.

La escritura directa es de la misma manera. Un beneficio es que tiene la consolidación de todas las escrituras. El segundo beneficio es que puedes acelerar tus escrituras. Entonces, por ejemplo, la escritura en segundo plano es una función en la que actualiza el caché de forma síncrona y el caché actualiza la base de datos de forma asíncrona. Por lo tanto, si las actualizaciones de la base de datos no son tan rápidas como el caché, lo cual es cierto, entonces el rendimiento de su aplicación mejorará repentinamente porque solo actualizará el caché y la base de datos de actualizaciones de caché.

Por lo tanto, la lectura, la escritura simultánea y la escritura diferida son características realmente muy poderosas que debe aprovechar. Este también es un código del lado del servidor que usted escribe que se ejecuta en el clúster de caché y simplifica su vida. Entonces, su aplicación puede tener más datos en el caché y también actualizarlos a través del caché.

Déjame, repasarlo rápidamente y hablar de algo. No voy a entrar en el detalle de Almacenamiento en caché del estado de la sesión ASP.NET. Solo sepa que puede conectarlo sin ningún cambio de código y solo hacer cambios en web.config y automáticamente se encarga de eso y lo mismo ocurre con ver estado y almacenamiento en caché de salida.

Alta disponibilidad (100 % de tiempo de actividad)

Voy a repasar rápidamente un par de cosas. Primero quería hablar sobre... Cualquier caché que use, porque es como una base de datos, es una base de datos en memoria en producción. Por lo tanto, un caché debe tener alta disponibilidad. Debe tener caché de alta disponibilidad.

Clúster de caché dinámica

NCache está altamente disponible a través de un par de cosas que hace. Primero tiene un clúster de caché dinámico. Puede agregar o eliminar servidores en tiempo de ejecución y reajustar automáticamente el clúster. No tiene que codificar los nombres de los servidores en la configuración, los clientes automáticamente. Una vez que un cliente se comunica con cualquier servidor de caché, obtiene información de pertenencia al clúster. Si la membresía cambia en tiempo de ejecución, digamos que agrega un nuevo nodo o elimina un nodo, la membresía actualizada se propaga al cliente.

Clúster de caché dinámica

Entonces, esa es la primera parte que debe estar ahí. Es muy importante que lo veas de esa manera.

Topologías de almacenamiento en caché

La segunda es la topología de almacenamiento en caché. Entonces, hay diferentes maneras en que NCache, por ejemplo, le dará cuatro topologías de almacenamiento en caché. El primero se llama un Caché reflejada. Es un 2 nodo activo/pasivo.

Caché reflejada

Los segundos se llaman Caché replicado, donde cada servidor en el caché tiene una copia de todo el caché. Entonces, cuantos más servidores tenga, más copias de caché tendrá. Es escalable para lectura, no escalable para actualizaciones. Pero, tiene su propio uso con casos.

Caché replicado

La tercera topología se llama Caché con particiones, donde todo el caché se divide en particiones. Cada servidor es una partición. Y, estas particiones se crean automáticamente.

Caché con particiones

Así, por ejemplo, en el caso de NCache cada partición tiene una serie de cubos en su interior. Por lo tanto, el clúster total tiene 1,000 cubos. Entonces, si tiene tres particiones, tienen un tercio, un tercio de cubos.

Réplica Particionada es lo mismo con la partición, pero se realiza una copia de seguridad de cada partición en un servidor diferente y todo se hace automáticamente por usted. Entonces, cuando crea un clúster de dos nodos, tendrá dos particiones, las dos réplicas. Cuando agrega un tercer servidor, automáticamente, se crea una tercera partición y cuando se crea una tercera partición, algunos de los cubos tienen que moverse de la partición existente.

Réplica Particionada

Entonces, todo eso se hace automáticamente por ti. Se crea automáticamente una nueva réplica. De hecho, si lo ves desde aquí, déjame mostrarte eso aquí. Digamos, si tuviera una partición de dos servidores... pero digamos, si solo tiene un clúster de dos servidores, tiene dos particiones. La partición 1 estaba aquí y la réplica 1. Partición 2, réplica 2. Ahora, agregó un tercer servidor, de repente tiene que tener una tercera partición y esto obtendrá algunos de los cubos de aquí, algunos otros de aquí, eso es una cosa. En segundo lugar, la réplica 2 ya no estará aquí, se moverá aquí porque ahora, la réplica de la partición 3 tiene que estar aquí.

Por lo tanto, todo ese ajuste lo realiza automáticamente NCache. Entonces, eso es una cosa. En segundo lugar, hay una característica llamada Caché de cliente algunas personas lo llaman Near Cache, que es realmente poderoso y debes usarlo. Básicamente es un caché local dentro de su aplicación cliente. Pero hay algo especial en esto: este caché local no está desconectado del clúster de caché. Está conectado al clúster de caché. Se mantiene sincronizado.

Caché de cliente

Entonces, en caso de NCache, por ejemplo, la memoria caché del cliente se conecta automáticamente en segundo plano a una configuración. Lo que obtenga de cada una de estas aplicaciones, los servidores es lo que se guarda automáticamente en la memoria caché del cliente. Entonces, la próxima vez que lo necesite, lo encontrará en el caché del cliente. Y el clúster de caché sabe qué datos se encuentran en qué caché de cliente. Entonces, si esos datos cambian, digamos, otro cliente, el clúster notifica a todos los cachés de clientes que tienen esos datos para que los actualicen. Entonces, el caché del cliente permanece conectado pero es un caché local. Puede ser incluso In-Proc. In-Proc significa dentro de su proceso de solicitud. Entonces, eso realmente acelera su rendimiento, pero al mismo tiempo usted es parte del caché distribuido global conectado.

Replicación WAN

Voy a saltarme muchas cosas, no tenemos tiempo. Entonces, también hay replicación de WAN. Si tiene varios centros de datos, debería poder hacer que la memoria caché se replique en la WAN y no puede crear un clúster en la WAN. Eso simplemente morirá porque estos sockets se rompen, la latencia es muy alta. Por lo tanto, tiene que haber alguna forma de conectar cachés entre dos centros de datos.

En caso de NCache tenemos esta cosa llamada topología de puente que conecta múltiples centros de datos. Puede tener centros de centros de datos activo-activo, activo-pasivo o incluso más de dos ahora. Y, todo esto se hace de forma asíncrona y también se realiza una resolución de conflictos por usted. Entonces, como puede ver, un caché no es solo un simple almacén de valores clave. Entonces, hay muchas cosas que debes tener en cuenta detrás de escena.

NCache vs Redis

Una cosa que rápidamente quise cubrir fue NCache vs Redis, solo un nivel alto, quería hablar sobre esto. NCache es la memoria caché nativa de .NET. Se ejecuta en Windows y puede realizar el almacenamiento en caché tanto del lado del cliente como del lado del servidor, ese es un beneficio. Mientras, Redis es principalmente caché basado en Linux. Antes de que Microsoft se asociara con ellos, la mayoría de las personas en el lado de .NET ni siquiera sabían que existían, a pesar de que han sido un caché muy popular en Unix y PHP y otros entornos.

En segundo lugar, la versión Linux de NCache está disponible en Azure, como caché como servicio. Entonces, la razón por la que el caché es un servicio es porque para las aplicaciones .NET, realmente no se puede ejecutar el código del lado del servidor en un caché basado en Linux. Debe tener un caché basado en .NET para poder ejecutarlo. Entonces, esa es una gran limitación que obtendrá.

En tercer lugar, si va a hacer algo fuera de Azure, Redis solo está disponible como un caché basado en Linux. El soporte de ventana que hizo Microsoft es algo que ellos mismos no usan. Incluso en Azure, no eligen usarlo en las ventanas. No es muy estable. También hay más detalles si quieres ver una más detallada. comparación entre NCache y Redis, puedes venir aquí y luego ver las comparaciones. Entonces, tenemos comparaciones con todo el mundo, porque tenemos mucha confianza en nosotros mismos.

Entonces, como puede ver, esta es una comparación completa. Solo revísalo. Si está pensando en usar un caché distribuido, lo cual debería hacer, tiene todas esas necesidades de escalabilidad. Haga su tarea, asegúrese de que lo que sea que use se ajuste a sus necesidades. Y, en cuanto NCache le preocupa, le facilitaremos la comparación NCache con otros. Puede visitar nuestro sitio web y descargar NCache. Es de código abierto. Por lo tanto, puede descargar la edición Enterprise o la de código abierto aquí o puede ir a GitHub y tendrás NCache haga clic aquí

Ese es el final de mi presentación. ¿Alguna pregunta? Puede pasar una llamada de procedimiento almacenado. Tiene que ser todo SQL, como las cosas de Transact SQL que se ejecutarán dentro del propio servidor SQL.

Sí. Entonces, el caché puede estar en el mismo servidor que la aplicación. No lo recomendamos. No es una buena estrategia de implementación, pero si tiene una configuración pequeña, sí, por supuesto.

Cuando realiza el particionamiento, todo el particionamiento se realiza por usted. Entonces, la idea general es que cada partición debe tener el mismo peso, en términos de tamaño de datos, en términos de transacciones.

No controlas las particiones, solo sabes que existen.

Cuando está actualizando la tabla de elementos, puede optar por actualizar la caché desde la propia base de datos, si tiene un procedimiento CLR que puede realizar una llamada directamente desde la base de datos a la caché. También puede escribir un código separado que puede actualizar el caché y todo eso depende de cuánto de eso sea y guarde en el caché.

Entonces, ya sabes, puedo hablar más fuera de línea si quieres. Pero, quiero decir, hay varias formas en que puede asegurarse de que todos los datos a los que necesita acceder se mantengan actualizados en el caché.

Sí, de hecho, voy a hacer que las diapositivas estén disponibles. Esa es la razón por la que hemos escaneado el correo electrónico de todos. Entonces, podemos hacer eso y también tendremos el video grabado y subido. Entonces, puede verlo y también sus colegas pueden verlo.

En realidad, por aplicación o... En realidad a través de múltiples aplicaciones. Por lo tanto, todo depende de la carga de transacciones. Puede tener un mínimo de 2 servidores de caché solo para tener el clúster y luego la cantidad de servidores depende de cuántos servidores de aplicaciones tiene o cuánta actividad tiene básicamente. ¿Cuántos datos se van a almacenar en caché? ¿Cuántas lecturas y escrituras estás haciendo?

No importa, sí. Sí, todo seguirá funcionando. Gracias chicos.

¿Qué hacer a continuación?

 

Suscríbase al boletín mensual por correo electrónico para obtener las últimas actualizaciones.

© Copyright Alachisoft 2002 - Todos los derechos reservados. NCache es una marca registrada de Diyatech Corp.