Código de Boston Campamento 31

Optimizar ASP.NET Core Rendimiento con caché distribuida

Por Iqbal Kan
Presidente y evangelista tecnológico

ASP.NET Core se está volviendo rápidamente popular para desarrollar aplicaciones web de alto tráfico. Aprenda a optimizar ASP.NET Core rendimiento para manejar cargas de transacciones extremas sin ralentizar mediante el uso de una caché distribuida de .NET de código abierto. Esta charla cubre:

  • Resumen rápido de ASP.NET Core cuellos de botella de rendimiento
  • Descripción general 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 funciones importantes de caché distribuida
  • Ejemplos prácticos usando Open Source NCache como el caché distribuido

Bien, gracias a todos, ¿pueden todos oírme bien? Bien, olvidé incluir la diapositiva, agradeciendo a todos los patrocinadores. Solo voy a ir al sitio web y mostrarles los logos de todos los patrocinadores. por cierto, somos uno de ellos, así que también mostraré esto al final. Eso es lo que nos dijeron los organizadores. Entonces, voy a repasar este tema y me gustaría mantener esta conversación más interactiva si es posible. Entonces, si tiene alguna pregunta, no dude en detenerme. Déjame asegurarme de que todo esté grabando.

Entonces, el tema de hoy es cómo optimizar ASP.NET core rendimiento de la aplicación con almacenamiento en caché distribuido? Voy a utilizar un producto de código abierto llamado NCache. ¿Cuántos aquí, han oído hablar de NCache ¿antes de? Ese es un buen número. Está bien, voy a usar NCache como ejemplo. Esta charla no se trata de NCache, se trata de ASP.NET Core rendimiento y cómo se puede utilizar el almacenamiento en caché? Entonces, estoy seguro de que estabas aquí porque la ASP.NET core se ha vuelto popular, se está volviendo popular, es la nueva arquitectura limpia y liviana, es la tecnología multiplataforma, la rediseño de .NET es de código abierto, hay muchas aplicaciones heredadas de ASP.NET que también se están trasladando a ASP.NET core. ÁSPID.NET core va a ser la tecnología principal con la que estarás desarrollando aplicaciones web en .NET.

Por lo tanto, cada vez más personas están desarrollando aplicaciones que necesitan escalabilidad. Entonces, ASP.NET core por supuesto, también necesita escalabilidad. Permítanme definir rápidamente qué es la escalabilidad. Estoy seguro de que la mayoría de ustedes ya saben esto, pero para completar, voy a definir esto.

¿Qué es la escalabilidad?

La escalabilidad es si tiene una aplicación que tiene un tiempo de respuesta realmente bueno, funciona muy bien con cinco usuarios, si puede mantener el mismo rendimiento con cinco mil, cincuenta mil, quinientos mil usuarios, entonces su aplicación es escalable. Si su aplicación no funciona bien con cinco usuarios, entonces tiene otros problemas en los que no vamos a entrar aquí. Entonces, voy a hablar sobre cómo puede mantener ese buen rendimiento de cinco usuarios a cincuenta mil o quinientos mil usuarios.

escalabilidad lineal

La escalabilidad lineal significa que su aplicación está diseñada de tal manera que puede simplemente agregar más servidores en producción a medida que crece su carga y, a medida que agrega más servidores, su capacidad de transacciones crece y eso es lo que le brinda ese buen rendimiento si puede mantener escalabilidad lineal. Si no puede mantener la escalabilidad lineal, entonces hay algún tipo de cuello de botella, que su aplicación enfrentará muy pronto a medida que agregue más servidores, muy pronto no importará si agrega más servidores o no y va a acaba de llegar a un cuello de botella, hay y voy a hablar sobre el cuello de botella.

Las siguientes aplicaciones necesitan escalabilidad

Entonces, ¿qué aplicaciones necesitan escalabilidad? En general, las aplicaciones de servidor son aplicaciones web, ASP.NET core, servicios web, que son utilizados por otras aplicaciones web. Los servicios web pueden ser aplicaciones independientes que utilizan aplicaciones externas o pueden ser parte de las aplicaciones web que está desarrollando, de cualquier manera, si tienen muchas transacciones, también necesitarán escalabilidad.

Los microservicios se están convirtiendo en una nueva palabra de moda ahora, así es como desea rediseñar su aplicación. Los microservicios también van a ser su tecnología del lado del servidor, se utilizan en aplicaciones de alta transacción y necesitarán escalabilidad. Para cualquier otra aplicación de servidor, muchas organizaciones grandes tienen procesamiento por lotes en el backend y necesitan realizar un flujo de trabajo en el backend. Un montón de aplicaciones de servidor back-end que solo necesitan tratar de manejar muchas transacciones, también necesitarán escalabilidad. Entonces, si tu empresa o si te dedicas a alguno de estos tipos de aplicaciones y quieres tener ese buen desempeño, esta es la charla para ti.

El problema de la escalabilidad

Entonces, ahora que hemos establecido que entendiste que estas aplicaciones necesitan escalabilidad, ¿hay algún problema de escalabilidad? Sí, existe y no está en el nivel de aplicación, el ASP.NET core puede agregar fácilmente más servidores a medida que crece la carga de transacciones y, por lo general, tiene un balanceador de carga frente al nivel de la aplicación, que dirige el tráfico de manera uniforme a todos los servidores y, a medida que tiene más y más usuarios, simplemente agrega más cajas, no hay problema allí. El problema, por supuesto, es el almacenamiento de datos o las bases de datos. Estas son sus bases de datos relacionales, su mainframe y esta es una de las razones por las que NoSQL databases comenzó a ganar terreno, pero resulta que en la mayoría de las situaciones aún debe usar bases de datos relacionales, tanto por razones técnicas como no técnicas. Entonces, si observa la mayoría de las aplicaciones que han hecho o están haciendo, terminan usando bases de datos relacionales, en el caso de .NET, la más popular, por supuesto, es un servidor SQL. Entonces, si no puede usar un NoSQL database, ¿de qué sirve para ayudar con la escalabilidad? Y la razón es que el NoSQL database le pide que abandone la base de datos relacional y mueva los datos a NoSQL, que para algunos datos puede, para muchos datos comerciales no, todos sus clientes, sus cuentas, sus actividades, todo lo que aún debe permanecer en una base de datos relacional. Entonces, tienes que resolver este problema de escalabilidad con bases de datos relacionales en la imagen y por eso digo que NoSQL database no siempre es la respuesta porque no puedes usarlo.

La solución (caché distribuido)

Entonces, la forma de resolver esto, por supuesto, es usar un caché distribuido y así es como se implementa un caché distribuido en su entorno.

caché distribuido

Entonces, este es el nivel de aplicación, en algunos casos, puede tener un balanceador de carga al frente aquí, que dirige el tráfico a todos los servidores de aplicaciones. En algunos casos, es posible que no haya un equilibrador de carga, puede haber alguna otra forma de compartir la carga porque estas son algunas aplicaciones de back-end, pero de todos modos, tiene varios servidores que ejecutan sus aplicaciones. Entonces, esto es muy escalable, pero la base de datos no puede seguir agregando más y más bases de datos. Ahora que las compañías de bases de datos relacionales están tratando de hacer todo lo posible para escalar, por ejemplo, tienen tablas en memoria, que son mucho más rápidas. Creo que el servidor SQL tampoco ha introducido este concepto de réplicas de solo lectura donde están, por lo que si combina tablas en memoria con réplicas de solo lectura, obtiene un aumento de rendimiento, pero como verá, entraré en este. Cuantas más réplicas cree, más dolor de cabeza tendrá, en términos de actualización, cada vez que actualice algo, debe actualizarse en todas las réplicas. Por lo tanto, para lograr el mejor rendimiento con la escalabilidad, asegúrese de no tener más de una réplica. Entonces, una copia maestra y una réplica de cada dato y, al mismo tiempo, debe poder escalar. Entonces, la razón por la que no pueden hacer eso es que una base de datos relacional no se puede particionar de la misma manera que se puede particionar un caché distributivo o un NoSQL database puede deberse a que tanto la caché distribuida como NoSQL son pares clave-valor, que es un diseño muy diferente al de una base de datos relacional, pero al final, debe colocar un caché distribuido como un nivel de almacenamiento en caché entre el nivel de la aplicación y su base de datos.

Entonces, ¿cómo se ve esto en términos de cuál es la configuración? Por lo tanto, normalmente estas cajas no son muy caras. Por lo general, son cajas de 8 núcleos a 16 núcleos, mucha memoria de 16 a 32 gigas de memoria y tarjetas de red de 1 a 10 gigabits. A veces tiene dos tarjetas de red, una para que ocurra la agrupación en clústeres y otra para las herramientas de los clientes, pero eso es todo, eso es muy diferente a obtener un servidor de base de datos de alto nivel y con mucha potencia de procesamiento para hacer su trabajo porque hay sólo uno de ellos o muy pocos de ellos. Entonces, no hay otra manera de evitar esto. Les decimos a nuestros clientes que no obtengan más de 64 gigas de RAM por caja porque cuando tiene más de 64 gigas de RAM en un entorno .NET, esa memoria debe recolectarse a través de la recolección de elementos no utilizados y recolectar a medida que recolecta más y más memoria. de lo que necesita más poder de procesamiento. Entonces, entonces entras en el mismo tema de empezar a conseguir cajas realmente caras. Es mejor obtener 32, 16 a 32 bits, 16 a 32 gigas de memoria, pero más cajas lo mantienen más barato.

¿Cómo funciona una caché distribuida?

Entonces, ¿qué hace un caché distribuido? De hecho, construye un clúster y nuevamente estoy hablando desde un NCache perspectiva, también hay otros como Redis que hacen cosas parecidas pero de diferente manera. Entonces, el caché distribuido creará un clúster, es un clúster basado en TCP y lo más importante en un clúster es que, al igual que no quiere que la base de datos se caiga y entre en producción, no quiere que el caché bajar tampoco. Por lo tanto, este clúster debe tener una alta disponibilidad. Entonces, la mejor manera de hacer que esté altamente disponible para los clientes es asegurarse de que tenga una arquitectura de igual a igual, donde cada nodo sea un ciudadano igual y cualquier nodo puede dejar de funcionar o puede agregar más cajas, no hay maestro- esclavo porque eso crea complicaciones y problemas de alta disponibilidad. Entonces, agrupó los recursos, la memoria, la CPU y la tarjeta de red como recursos. Entonces, a medida que agrega más, digamos que tiene más y más tráfico o más y más transacciones, agrega más servidores de aquí en adelante en una proporción de 4 a 1, 5 a 1, por lo general agregaría más cajas. Mínimo de dos servidores de caché y luego sigues agregando más, así que comenzarás con dos, comenzarás a tener más y más carga y de repente todo comenzará a ralentizarse y agregas una tercera caja, todo mejora cuando agregas más. cargar y agregar más cajas, aquí las cosas comienzan a ralentizarse hasta cierto punto. Agregas un cuarto cuadro y la imagen va.

Entonces, así es como se escala linealmente, en teoría, nada es ilimitado, pero se escala para más situaciones, se escala de manera ilimitada donde no hay cuellos de botella. Entonces, esto le permite que su base de datos no se convierta en un cuello de botella. Por lo tanto, esto se ha convertido prácticamente en una mejor práctica esencial de la arquitectura de su aplicación. Si está haciendo aplicaciones de muchas transacciones, debe incorporar el almacenamiento en caché distribuido y, como esa es la única forma, podrá lograr el rendimiento porque todo está en la memoria, todo lo que toca el disco nunca puede ser tan rápido como en -Memoria y escalabilidad porque está distribuida. ¿Alguna pregunta sobre esto antes de irme? En realidad, en el caso de NCache usted puede. NCache admite .NET y Java, pero si tiene otras aplicaciones como Python u otras, no puede usar NCache, luego debe usar otras soluciones de almacenamiento en caché, pero la aplicación debe estar en un entorno escalable. Básicamente, no importa qué idioma uses, la funcionalidad sigue siendo la misma. Hay algunos beneficios, si es una aplicación .NET, entonces NCache le ofrece muchos beneficios específicos de .NET que es una pila completa de .NET, su pila de cursos de .NET, por lo que encaja muy bien. Hay productos similares en el lado de Java que también se denominan cuadrículas de datos en memoria y, por lo tanto, se ajustan muy bien a la pila de Java. Por ejemplo, solo compartiré alguna información. Asi que, NCache tiene una API de Java, pero las únicas personas que usan la API de Java son las que compran NCache vea la sección NCache desde una perspectiva .NET. Entonces, tienen NCache internamente y dijeron que también podría usarlo para Java y una tienda de Java buscaría una cuadrícula de datos en memoria basada en Java, una tienda de .NET buscaría NCache. Entonces, así es como el mercado está segmentado debido a toda la experiencia, si usted es una tienda de .NET, tiene toda la experiencia de .NET versus Java. Entonces, ¿por qué complicar la imagen? Para las bases de datos, ¿se puede usar cualquier base de datos que no sea SQL? Cualquiera, cualquiera porque la forma de acceder a la base de datos es a través de su propio código personalizado que vive en el nivel de almacenamiento en caché.

Entonces, esa es otra característica, que revisaré es que una de las características esenciales para asegurarse de que el caché permanezca sincronizado con la base de datos es que su código personalizado debe vivir en el servidor de caché. Si convierte el caché en una caja negra, donde no hay nada en el caché, excepto datos, es como tener una base de datos relacional sin disparadores ni procedimientos almacenados u otras cosas. Entonces, eso limita su uso del caché. Entonces, los cachés comenzaron siendo solo la caja negra. Memcached era un caché popular, no hacía nada, era solo una tienda, y con el tiempo, evolucionaron hasta convertirse en una entidad inteligente adecuada donde también pueden ejecutar su código. Ninguna NoSQL, cualquier base de datos relacional se puede utilizar con él. Y nuevamente, todas estas características de las que estoy hablando son de código abierto y empresariales. Entonces, por eso lo menciono porque es de código abierto. ¿Alguna otra pregunta? al tratar con NCache ¿Es principalmente almacenamiento en caché automático o usa API para almacenar en caché? Entonces, entraré en más detalles, pero depende de lo que esté almacenando en caché. Ciertos tipos de uso de caché son automáticos. Por ejemplo, si está poniendo ASP.NET core sesiones, entonces es un módulo conectable, simplemente se conecta y comienza a almacenar las sesiones en el caché, por lo que no tiene que hacer nada, pero si va a almacenar en caché los datos de la aplicación, que es donde está la mayor parte del beneficio. , entonces hay una API a la que debe llamar para determinar qué desea almacenar en caché. ¿Cuánto tiempo quieres almacenarlo en caché? ¿Cómo quieres sincronizarlo con la base de datos? Hay muchas otras cosas que debes tener en cuenta. Entonces, repasaré todas esas características de cómo debe usar el caché distribuido como NCache para asegurarse de que puede almacenar en caché todo tipo de datos, pero hay una API. Sí.

Uso de caché distribuida

Bueno. Entonces, ahora que hemos establecido que un caché distribuido es importante. Le brinda rendimiento y escalabilidad, veamos cómo usa un caché distribuido y hay tres formas posibles de usarlo. Los tres grandes casos de uso técnico.

Almacenamiento en caché de datos de aplicaciones

Y el número uno es el almacenamiento en caché de datos de la aplicación, de eso he estado hablando hasta ahora y entraré en más detalles al respecto pronto. En el almacenamiento en caché de datos de la aplicación, hay una cosa que debe tener en cuenta que los datos existen en la base de datos y en el caché. Entonces, hay dos lugares donde existen los datos, cuando los datos existen en dos lugares, ¿qué es lo más común que podría salir mal? Podrían desincronizarse, por lo que un cliente podría retirar esos millones de dólares dos veces del banco, una vez del caché, otras de la base de datos y no querrá tener esa situación nunca. Esa situación era tan mala en el pasado que la gente usaba cuando mencionas la palabra caché, el pensamiento que se le ocurrió a la mayoría de la gente es que solo voy a almacenar en caché datos de solo lectura. Los datos nunca cambian, porque si guardo en caché algo que cambie, no podría tener problemas. Entonces, explicaré cómo puede asegurarse de que eso no suceda, pero eso es lo más importante a tener en cuenta en el almacenamiento en caché de datos de la aplicación.

ASP.NET Core Almacenamiento en caché específico

El segundo caso de uso es ASP.NET core-almacenamiento en caché específico y hay dos cosas que puede almacenar en caché desde el ASP.NET core. Una son las sesiones, que son prácticamente todos los ASP.NET core La aplicación usa sesiones y en el entorno ASP.NET anterior, Microsoft le dio tres opciones de almacenamiento: InProc, servidor de estado y SQL, y la cuarta era la personalizada. Los tres primeros practicamente no funcionaban pero el cuarto te permitia enchufar un cache pero en ASP.NET core en realidad han hecho lo correcto, que es lo que han hecho del código git, en realidad lo han diseñado de modo que se basa en una interfaz IDistributedCache. Entonces, le permite conectar una tienda de terceros y puede conectar algo como NCache y automáticamente comienza a almacenar sus sesiones y le mostraré cómo se hace.

La segunda cosa en ASP.NET Core es el almacenamiento en caché de respuestas, que es el resultado de la página que puede almacenar en caché. Entonces, la próxima vez que se llame a esa página, la página ni siquiera debería ejecutarse, solo debería devolver la salida si no ha cambiado. Si va a reproducir el mismo resultado nuevamente, ¿por qué vuelven a ejecutar o ejecutan la página? ¿Por qué no solo servir la salida? Así es como se llamaba el almacenamiento en caché de salida en ASP.NET, ahora se llama almacenamiento en caché de respuesta. Ahora se basa en más estándares HTTP. Por lo tanto, puede conectar el almacenamiento en caché de contenido de terceros en el borde, lo que no fue posible, pero también lo abordaré. La diferencia a tener en cuenta entre el almacenamiento en caché de datos de la aplicación y ASP.NET core el almacenamiento en caché es que, a diferencia del almacenamiento en caché de datos de la aplicación, donde había dos lugares donde existían los datos, ahora los datos existen solo en el caché y debido a que el caché está en la memoria, estos datos se perderán si algún servidor de caché deja de funcionar, a menos que haya una replicación . Por lo tanto, ese es un punto muy importante a tener en cuenta: cualquier caché que no proporcione una buena replicación no es adecuada para almacenar sesiones en caché u otras tendencias en los datos.

Hay un tercer ASP.NET core-algo específico que se llama SignalR, en el que no voy a entrar, si tiene aplicaciones web en vivo, que pueden dar retroalimentación en vivo, digamos que los precios de las acciones deben actualizarse todo el tiempo. Entonces, eso también puede usar un caché distribuido como backplane, pero no lo mencioné.

Seguridad

Cualquier pregunta en los dos primeros y voy a entrar en más detalles si es necesario en estos. Entonces, antes que nada, el caché vive detrás de su aplicación. Vive entre la aplicación y la base de datos. Generalmente, en un entorno bastante seguro. Tenemos clientes que mantienen el caché más cerca, si su aplicación está en la DMZ, es posible que no mantengan el caché en la DMZ sino detrás del firewall. A veces lo mantienen en la DMZ, pero la mayoría de las veces está en una situación segura, pero muchos de nuestros clientes de servicios financieros, como los grandes bancos y otros, no están satisfechos con eso, así que quieren más seguridad. Entonces, ahí es donde la Enterprise Edition de NCache tiene características, donde puede hacer encriptación. Entonces, todos los datos que coloque en el caché se cifrarán automáticamente con cifrado 3DES o AES256 y luego también está la seguridad, todas las conexiones al caché se autenticarán a través de Active Directory y habrá cosas de autorización. Por lo tanto, las funciones de seguridad completas están integradas en la edición empresarial.

Un cliente promedio no usa el cifrado a menos que sus datos sean confidenciales. Entonces, si están guardando datos financieros, hay algunos problemas de cumplimiento o HIPAA, por lo que si tan pronto como entra en problemas de cumplimiento, incluso si su entorno es seguro, debe ir un paso más allá y ahí es donde haría el cifrado. . Asi que, NCache Enterprise, por ejemplo, realizará la conexión TLS entre el cliente y el nivel de almacenamiento en caché. Por lo tanto, esa conexión en sí está completamente protegida, además de que tiene el cifrado incorporado, por lo que todos los datos que se guardan en la memoria también se guardan de forma cifrada. Y eso satisface bastante, es decir, tenemos muchos clientes de servicios financieros y están totalmente satisfechos con eso.

NCache se puede implementar y la mayoría de nuestros clientes todavía lo usan en una situación local. Por lo tanto, tienen su propio centro de datos donde se implementa su aplicación, por lo que implementan NCache como parte de su aplicación. Si estás en la nube, NCache está disponible tanto en Azure como en AWS y está disponible como VM o estamos a punto de lanzar el servicio de caché administrado también, de cualquier manera, nos aseguramos de que NCache vive dentro de su red virtual en la nube. Entonces, en un entorno local, eso no es un problema porque siempre en su propio entorno, solo obtiene un montón de máquinas virtuales o, si tiene su propio centro de datos, obtiene sus propios servidores y los implementa con la aplicación. tu instalas NCache como software y es para instalaciones internas, también puede usar docker y vio todas las cosas que esperaría que las aplicaciones modernas pudieran hacer, NCache servirá. Y luego, en la nube, puede obtener las VM u obtener el caché administrado, pero en la nube, siempre lo haremos dentro de su VPC en el caso de AWS y vnet en el caso de Azure. Está dentro de su red virtual. Entonces, está cerca de su aplicación porque si no es así, si tiene que crecer en múltiples saltos, y digamos si fuera un caché alojado, lo que probablemente esté bien para aplicaciones pequeñas pero algo serio, NCache casi siempre se usa en aplicaciones de misión crítica donde está haciendo su negocio a través de esa aplicación. Entonces, ahí es donde usarías NCache.

Entonces, en esas situaciones, no puede darse el lujo de tener ninguna ralentización y si no puede permitirse el lujo de haber ralentizado, ahí es donde quiere todo el control y mantener el caché lo más cerca posible de la aplicación. Depende del caso de uso que vaya a hacer, por ejemplo, el mayor y más rápido beneficio son las sesiones e inmediatamente lo conectaría sin ningún cambio de código. Es solo un cambio de configuración. En el caso de ASP.NET core, no es un cambio de configuración. Es un cambio de código de archivo de inicio, pero es muy pequeño, pero si desea realizar el almacenamiento en caché de datos de la aplicación, sigue siendo un cambio muy sencillo.

Permítanme mostrarles rápidamente cómo se ve la API. Entonces, mira esta API.

Conexión de caché
Cache cache = NCache.InitializeCache("myCache");
cache.Dispose();
Recuperacion de datos
Employee employee = (Employee) cache.Get("Employee:1000");
Employee employee = (Employee) cache["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);
cache["Employee:1000"] = employee;

Employee employee = (Employee) cache.Remove("Employee:1000");
cache.RemoveAsync("Employee:1000");

Es solo un cache.get muy pequeño, cache.add, Insert, remove. Entonces, tienes una clave y un valor como tu objeto. Entonces, es muy fácil de incorporar, pero tienes que ir y hacerlo, así que cada vez que obtienes datos de la base de datos, primero revisas el caché, si el caché lo tiene, lo tomas del caché, o vas a la base de datos. lo consigues y lo metes en el caché, ese es el modelo. Exactamente. Voy a acelerar de lo contrario, no voy a lograrlo. te mostrare NCache un poco tarde.

Mensajes y eventos Pub/Sub

Por lo tanto, la mensajería pub/sub también es una característica muy poderosa. Muchas aplicaciones hoy en día tienen que coordinar el esfuerzo. Estuve hablando con alguien hoy, quien dijo que tenían la necesidad de hacer mucha programación basada en eventos. Entonces, la mensajería pub/sub le brinda un modelo de programación impulsado por eventos muy poderoso porque tiene una infraestructura en la que ahora es una plataforma escalable en memoria dentro de su aplicación, puede pensar en ella como un bus de mensajería. No es para entornos distribuidos. Es para el mismo tipo de ubicación del centro de datos de una situación, pero es súper rápido porque todo está en la memoria y es escalable. Entonces, ese es el tercer caso de uso que tendrá para usar un caché distribuido como NCache. Sí, lo hace, lo hace y el código abierto también lo admite. Por lo tanto, todas estas características están disponibles tanto en código abierto como empresarial, de hecho, todas las NCache La API es más o menos lo mismo entre el código abierto y la empresa.

Lo que hemos visto con pub/sub es nuevamente que si tiene una aplicación de alto tráfico, alta transacción, entonces realmente necesita que el motor pub/sub sea súper rápido y ahí es donde NCache realmente brilla.

ASP.NET Core Almacenamiento en caché de datos de aplicaciones

Bueno. Entonces, el almacenamiento en caché de datos de la aplicación. ¿Cómo lo haces? Entonces, eso también es para responder allí, por lo que hay tres formas en que puede hacerlo.

IDistributedCacheIDistributedCache

Puede usar la interfaz IDistributedCache que ASP.NET core viene con y si ha programado contra él, simplemente puede enchufar NCache como proveedor. Por lo tanto, no hay más cambios de código una vez que haya realizado la programación de la API de IDistributedCache. Por lo tanto, el beneficio es que programará una vez y no estará atado a ningún proveedor de almacenamiento en caché. El inconveniente es que es el mínimo común denominador. Te mostraré cómo se ve, eso es todo lo que es. Tiene Get and Put, eso es todo. Conoce Get, Remove y Set, mientras que hay mucho más que debe poder hacer para hacer un uso completo del caché, que estábamos hablando del hecho de que desea sincronizar el caché con la base de datos. Entonces, hay pros y contras.

Entity Framework Core Cache

La segunda es que si tiene una aplicación EF Core, tiene una aplicación EF Core, es una forma más sencilla de conectarse NCache y te mostraré. Entonces, en realidad implementamos métodos de extensión para EF Core y, nuevamente, esto es tanto de código abierto como empresarial. Ahí está la muestra de EF Core. Bueno. Por lo tanto, si tuviera una aplicación EF Core, normalmente tendría una consulta de EF Core como esta, obtendrá algo mediante consultas de estilo LINQ. Por lo tanto, hemos implementado un método de extensión, digamos FromCache, por lo que son un montón de métodos, este es uno de ellos, por lo que dirá ir al caché si esta consulta se almacenó por última vez en el caché, obténgala del cache. Si no está en la memoria caché, vaya a la base de datos, ejecute esta consulta básica de EF normal, consígala y colóquela en la memoria caché. Entonces, es solo que una línea o solo una llamada de método comienza automáticamente a almacenar en caché todos los datos que provienen de la base de datos. Por lo tanto, simplifica su trabajo y sabe exactamente dónde conectar, no hay muchas llamadas adicionales a la API que tenga que hacer.

Entonces, para las aplicaciones principales de EF, nuevamente hay un cambio de código, pero lo menos posible que puede hacer y comenzar a almacenar datos en caché. Entonces, en realidad, para el núcleo de EF hay un montón de métodos, esto es FromCache, la mayor parte es de, hay solo cuatro o cinco métodos que puede usar, FromCache, luego LoadIntoCache, FromCacheOnly. Entonces, y luego también con EF Core, cuando guarda los cambios, también actualiza el caché antes o después de actualizar la base de datos, también actualiza el caché. Entonces, el caché tiene la versión actualizada de los datos. La integridad de la memoria caché se mantiene en primer lugar asegurándose de que todos los datos que guarde en la memoria caché y voy a saltar, por ejemplo, este es un servidor de memoria caché. Digamos que si tiene dos servidores y digamos que tiene tres servidores. Todo el caché se divide en particiones, cada partición tiene su propio conjunto de cubos, por lo que sus datos residen solo en una de las particiones. Entonces, y luego esos datos se replican en algún otro servidor, que se llama réplicas, pero las réplicas en el caso de NCache no está activo, es pasivo, su aplicación no se comunica con las réplicas. Su aplicación habla solo con la partición. Entonces, debido a que los datos se almacenan solo en una ubicación, no hay problema de sincronización. Todo el mundo va al mismo servidor, pero debido a que está particionado, no todo el mundo va al mismo servidor, algunas claves se almacenan aquí, otras se almacenan aquí, otras se almacenan aquí.

partición-réplica

Entonces, eso es lo que un caché distribuido como NCache es capaz de hacer lo que el servidor SQL no puede hacer porque la naturaleza de la base de datos relacional es que no se puede particionar, pero la naturaleza de la memoria caché distribuida es que sí se puede y cuando se particiona aquí, estos son tres servidores, quizás sean compartidos por diez servidores de aplicaciones y cada servidor de aplicaciones puede tener cuatro o cinco o seis u ocho procesos de trabajo. Por lo tanto, hay muchos procesos de clientes diferentes que se comunican con el caché, no hay problema de sincronización porque los datos reales se almacenan solo en una ubicación. Ahora hay otras topologías en NCache que se replican, donde existen los mismos datos activo-activo y múltiples y en ese caso, NCache tiene que sincronizar los cambios. Está basado en tokens, es un algoritmo de actualización basado en secuencias, no es muy escalable. Por lo tanto, no lo recomendamos para un entorno de transacciones altas.

El caché particionado con replicación es la mejor estrategia o lo llamamos una mejor topología de almacenamiento en caché para usar. Así es como NCache se asegura de que dentro del caché, los datos sean siempre correctos. ¿Eso responde a su pregunta? Entonces, el puerto que ha mostrado, ¿hay alguna configuración o configuración en el código que diga, de qué caché tiene que recogerlo? Sí. Entonces, por ejemplo, cuando ingrese a app.config, verá que dirá que usa mycacheId y le mostraré cuál es el caché. Entonces, cuando creas un caché en NCache. Cada caché recibe un nombre y ese nombre detrás de la escena sabe dónde está el caché, por lo que todo lo que tiene que hacer es especificar el nombre aquí y luego sabe dónde ir y obtener el caché. Y les mostraré cómo se ve realmente el caché. Un nombre de caché está en todos esos servidores y dentro de los mismos servidores puede tener múltiples nombres de caché, en el mismo servidor puede tener múltiples cachés y un caché puede vivir en varios y es un caché distribuido, el nombre de un caché tiene que vivir en varios servidores, así es como se distribuye, pero los mismos servidores también se pueden usar para otros nombres de caché, y cada nombre de caché brinda su aislamiento. Buena pregunta.

Alta disponibilidad

Entonces, aquí es donde decía que la alta disponibilidad es realmente importante. Si no puede agregar o quitar servidores en tiempo de ejecución sin ninguna interrupción, entonces su aplicación realmente no tiene una alta disponibilidad. Tenemos clientes que han estado corriendo NCache durante meses y años sin ningún tipo de interrupción. Entonces, por ejemplo, supongamos que tiene una configuración de dos servidores y acaba de agregar un tercer servidor porque su carga ha aumentado. Entonces, necesita agregar un tercer servidor, todo lo que hará es agregar un tercer servidor y se lo mostraré a través de la herramienta, solo agregue uno y NCache detrás de escena se repartirá. Entonces, estas dos particiones ahora se transformarán en tres particiones. Algunos de los cubos de aquí y aquí se asignarán a la tercera partición automáticamente mientras se ejecuta una aplicación, su aplicación ni siquiera se da cuenta de esto. Detrás de escena ahora que existe una tercera partición y ahora la réplica también hay una tercera réplica que se crea, así que digamos que la réplica 2 necesita moverse aquí y la réplica 3 se crea aquí.

partición-réplica2

NCache lo mantiene, detrás de esto NCache usa claves para el mapeo hash, pero lo hace todo dinámicamente, como un mapa de distribución, que es como un mapa de cubo que se reparticiona y se reasigna. Entonces, los datos en realidad se mueven de un servidor a otro automáticamente en tiempo de ejecución.

Afinidad de ubicación

Entonces, en algunos casos, es posible que desee mantener algunos de los datos juntos en la misma partición. NCache tiene una función de afinidad de ubicación, donde puede especificar y luego lo especificará. Dirá que estos dos datos están relacionados, quiero que estén en el mismo servidor y luego NCache lo mantendrá en el mismo servidor a través de una clave adicional que crea encima. Como dije, todas esas son funciones avanzadas, que no obtienes si solo usas el mínimo común denominador, y al usar esas funciones, puedes ajustar NCache a su entorno en sus necesidades específicamente.

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

Entonces, lo primero que quería cubrir, estos temas, son muy importantes. Para el almacenamiento en caché de datos de la aplicación, lo más importante es que el caché esté siempre actualizado, lo que significa que actualizado significa que tiene datos correctos, si los datos cambian en la base de datos, el caché tiene los datos más recientes.

Vencimientos basados ​​en el tiempo

Por lo tanto, la caducidad es la forma más común en que lo hacen los cachés, casi todos los cachés tienen la caducidad como característica. NCache tambien lo tiene Hay un vencimiento absoluto y luego hay un vencimiento deslizante. La caducidad absoluta es, digamos que está agregando datos al caché, puede decir que está bien después de cinco minutos porque no creo que sea seguro para usted mantenerlo en el caché durante más de cinco minutos. Entonces, está haciendo una conjetura educada, que es seguro mantener los datos en el caché durante cinco minutos y eso es lo suficientemente bueno para algunos datos, para otros datos puede no serlo.

La caducidad deslizante es más para cuando está almacenando sesiones y está diciendo que está bien después de que nadie la esté usando, después de que todos hayan terminado de usar esa sesión, simplemente elimínela. Entonces, es más una caducidad de limpieza. La caducidad absoluta es la sincronización para mantenerla consistente con la base de datos, el deslizamiento es limpio, pero la caducidad es una suposición informada, sea cual sea la suposición incorrecta.

Dependencias de la base de datos

En algunos casos, puede darse el lujo de que los datos sean inconsistentes, en otros casos no. Entonces, si no puede, debe tener otras características, así que aquí es donde NCache Lo que realmente destaca es que, por ejemplo, puede tener una sincronización del caché con la base de datos. Asi que, NCache utiliza la dependencia de SQL integrada en SQL Server para supervisar SQL Server. Por lo tanto, puede, para cada elemento que almacene en caché, puede decir que está bien mapear esto con esta fila correspondiente en la tabla de la base de datos SQL, NCache lo monitorea, si esa fila cambia, NCache luego elimina ese elemento del caché o lo vuelve a cargar. Entonces, ahora, de repente, tiene un caché inteligente, puede asegurarse de que lo que sea que esté almacenando en caché siempre será consistente y esto es algo que no obtiene si el caché es una caja negra.

Entonces, debe poder tener ese tipo de inteligencia con el caché, y las dependencias de SQL son una característica de .NET, ahí es donde NCache ser .NET ayuda si su base de datos es SQL. Ahora, también somos una dependencia de Oracle, que también usa las notificaciones de la base de datos de Oracle y hay otra forma de hacerlo que es nuestra notificación basada en sondeos, que es más eficiente pero no es tan en tiempo real y luego también puede sincronizar el caché con Fuentes de datos no relacionales. Sus datos pueden estar en un NoSQL database, podría estar en la nube, podría estar en cualquier lugar y desea poder monitorearlo. Entonces, puede crear lo que llamamos una dependencia personalizada, que es su código que vive en el servidor de caché. NCache lo llama en un cierto intervalo, va y verifica su fuente de datos, si los datos cambian, notifica NCache, ok, los datos han cambiado, elimínelos o vuelva a cargarlos.

Entonces, esta es un área donde NCache es realmente muy fuerte. Si desea mantener sus datos actualizados, debe poder hacer estas cosas para asegurarse de que el caché esté actualizado.

Lectura y escritura

Otra característica es la lectura y la escritura simultáneas. Entonces, ahora esto se combina con la caducidad y la sincronización de la base de datos. Esto permite que el caché cargue datos de su base de datos y eso es lo que, por ejemplo, si tiene una lectura completa, le mostraré cómo se ve una lectura completa. Es solo una interfaz que implementa y su código realmente reside en el caché, así que aquí hay una interfaz que implementa este código. Entonces, hay una llamada de carga desde la fuente que le da una clave y luego NCache llama a su método, el servidor de caché llama a su método, este código se ejecuta en los servidores, todos los servidores de caché, NCache llama a este método y dice, por favor, continúe y cargue esta clave porque no está en el caché. Entonces, si hago un caché. Obtener, creo que la clave no está en el caché, devuelvo un valor nulo, diciendo que la clave no existe, o si tengo una lectura completa, puedo ir al caché, y NCache puede ir a la base de datos y leerlo por usted. Entonces, siempre lo tendrás. Ahora, esto es muy útil en muchos casos, en los que solo desea mantener esos datos en el caché siempre.

Por lo tanto, la lectura completa le permite, cuando combina la lectura completa con vencimientos o la sincronización de la base de datos, lo que hace es cuando los datos caducan. NCache puede actualizarlo automáticamente, ¿por qué eliminarlo? Si va a volver a cargarlo, la próxima vez de todos modos porque se necesitan esos datos y los va a caducar solo para mantenerlos actualizados. Entonces, ¿por qué no simplemente tener NCache regresa y recárgalo. Si ha implementado la lectura directa, NCache lo hará automáticamente y sucederá lo mismo, si los datos cambian en la base de datos o en la fuente de datos y esta función de sincronización se da cuenta de que está bien, esa base de datos ha cambiado, entonces si ha implementado la lectura, irá automáticamente y la recargará .

Del mismo modo, la escritura simultánea le brinda otro beneficio, que es que si tiene una escritura posterior, puede actualizar el caché. Entonces, algunos datos, no son tan sensibles para las actualizaciones, quiero decir, por supuesto, si se trata de saldos bancarios de datos financieros que no desea hacer una escritura posterior, pero en algunos casos, está bien si solo puede poner en cola las actualizaciones. Entonces, si actualiza el caché, actualizar el caché es mucho más rápido que actualizar la base de datos, por supuesto, más escalable porque está distribuido y actualiza el caché y le dice NCache Continúe y actualice esto, la base de datos de forma asíncrona detrás de escena. Entonces, esa es la función de escritura diferida, y eso ahora acelera repentinamente su aplicación porque ¿cuál es el cuello de botella? Lee de la base de datos y escribe en la base de datos. Las lecturas se pueden almacenar en caché, de modo que ni siquiera va a la base de datos, pero las escrituras tienen que ir a la base de datos, no puede. Me refiero a que la base de datos es el maestro, ¿verdad? es facil.

Entonces, esa es otra característica que, si la tiene, NCache de repente le da más impulso a su aplicación. Pregunta: Entonces, por si acaso, no puede escribir en la base de datos y hacer asíncrono, ¿provocará una excepción? Sí. Lanzará una excepción, puede tener una devolución de llamada que sea llamada por NCache y nuevamente el código es, este código de escritura posterior se está ejecutando en los servidores de caché, pero la devolución de llamada está aquí, por lo que le notificará al cliente y se llamará a su devolución de llamada, para que pueda tomar acciones correctivas. Una vez que te sientas cómodo con ese caché, NCache puede sincronizar el caché con la base de datos, almacenará en caché más y más datos. Cuantos más datos almacene en caché, más caché comenzará a parecerse a una base de datos, lo que significa que una forma de valor clave de obtener datos no es lo suficientemente inteligente. Entonces, debe poder encontrar datos basados ​​en SQL, especialmente datos de referencia.

Búsqueda SQL

Cuando hablamos sobre la consulta de EF Core, está obteniendo datos en función de los atributos, no solo de la clave. Entonces, si puede buscar los datos con consultas SQL o LINQ o con el núcleo EF, eso hace que el caché sea mucho más rápido. Esa es otra manera NCache Lo más destacado es que una vez que pones todos esos datos en el caché, puedes buscar, puedes decir dame todos mis clientes que se encuentran en Boston o Nueva York y te dará una colección de objetos de clientes del caché. Entonces, está comenzando a parecerse más a una base de datos y le está quitando toda esa presión a esa base de datos, especialmente para los datos de referencia. Entonces, la búsqueda de SQL es realmente importante.

Bueno. Ahora quiero mostrarte lo que NCache ¿Se parece o se vería cualquier caché? Entonces, estoy conectado a Azure. Entonces, tengo dos máquinas virtuales de servidor de caché. entonces, tengo dos servidores de caché, un cliente de Windows y una línea de Linux porque hay .NET Core, podría estar ejecutando la aplicación en Windows o Linux y NCache funciona en realidad, los servidores de caché también pueden ejecutarse en Linux debido a .NET Core porque NCache son los .NET Core nativo.

azur

Crear un caché

Entonces, yo, por ejemplo, he hecho un escritorio remoto para el cliente de Windows. De hecho, voy a seguir adelante y crear un caché, por lo que mi caché tendrá dos servidores y tendré un cliente de Windows, un cliente de Linux, y cuando uso la palabra cliente que en realidad es su servidor de aplicaciones. Bueno. Entonces, voy a usar esto NCache herramienta de gestión. Ahora, esta herramienta es parte de Enterprise Edition, pero puede hacer las mismas cosas a través de las herramientas de línea de comandos de código abierto o los archivos de configuración, pero solo por conveniencia, seguiré adelante y crearé un caché.

Para crear

Llamaré a mi caché democache como dije que todos los cachés tienen nombre.

democaché

Elegiré una topología. Elegiré caché particionado con replicación.

partición-caché

Haré la replicación asíncrona, por lo que hay una replicación asíncrona y una replicación asíncrona. La replicación de sincronización es cuando no puede permitirse el lujo de hacer una sincronización si se trata de datos más confidenciales, datos financieros y cosas en las que desea que ocurran estas replicaciones como parte de la actualización, lo que, por supuesto, ralentiza las cosas pero las hace más.

Asincrónico

Entonces, aquí está mi servidor de caché uno, aquí está mi servidor de caché dos, así que acabo de crear un clúster de dos servidores. aún no se está ejecutando. Voy a agregar dos nodos de cliente. Esta es mi ventana, había un servidor. Entonces, 6 es mi cliente de Windows y 7 es mi cliente de UNIX. Bueno. Por lo tanto, tengo dos servidores de caché y dos clientes por lo general, como dije, tendrá un mínimo de dos servidores de caché y una proporción de cuatro a uno, cinco a uno entre los clientes y el servidor. Entonces, solo estoy iniciando el caché ahora. Una vez más, desde un lugar, puedo hacer todo esto y lo mismo en la próxima versión que estamos a punto de lanzar, todo está basado en la web, así que en la nube, puedes hacerlo. Voy a abrir estadísticas y estas son como monitoreo, estas son estadísticas de perfmon.

statistics

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

Voy a probar y ver si mi cliente puede hablar con esto, ahora esta caja es un cliente. entonces, voy a abrir la consola de PowerShell. Tendré dos parciales de Windows y estoy conectado a dos Linux aquí, así que tengo un Linux aquí, ahora el Linux aquí. ¿Derecha? Aquí, necesito iniciar PowerShell y aquí, también necesito importar mi módulo que no necesito hacer para Windows, ya está allí para mí y necesito hacer lo mismo aquí. Necesito iniciar PowerShell en Linux y bien, ahora voy a iniciar un cliente. Asi que, NCache viene con esta herramienta de prueba de estrés, que hace que sea realmente fácil para usted realizar pruebas de estrés en su propio entorno. Para que puedas ver exactamente cómo NCache realiza? Por lo tanto, no tiene que tomar una palabra por su rendimiento. Entonces, digamos aquí, estoy haciendo alrededor de 500 solicitudes por segundo por servidor.

estadísticas2

Bueno. Entonces, quiero aumentar la carga, así que voy a ir a la segunda consola y diré que vuelva a ejecutar una prueba de esfuerzo.

cmd

Ahora, de repente verán que esto se va a duplicar, correcto, y déjenme continuar y agregar más estrés. Vendré a uno de los de Linux y diré lo mismo y de repente ahora estoy más como 1500 por solicitud. Entonces, ahora tengo un total de alrededor de 3,000 solicitudes por segundo, como déjame hacer otra, y ahora estoy haciendo más de 4,000 solicitudes por segundo. Por lo tanto, puedo seguir agregando más y más si tengo más máquinas virtuales, puedo o simplemente puedo tener más instancias y verá que muy pronto una vez, alcanza el máximo de lo que sea que va a ser y estos dos servidores deberían ser capaz de manejar al menos 50,000 solicitudes por segundo, pero nuevamente eso es con el pequeño conjunto de datos, a medida que aumenta el tamaño de su objeto, eso disminuirá, por supuesto, pero una vez que maximice eso, continuaré aquí y nuevamente esto es funcionando bien, no tengo una tercera máquina virtual, pero todo lo que tengo que hacer es hacer esto y agregar una tercera dirección y diré finalizar y agregará una tercera casilla aquí y hará todas esas particiones o volver a particionar automáticamente para usted.

Del mismo modo, si necesito desactivar alguna de las máquinas virtuales, también lo hará. Sí, eso es todo, ese es el final de mi charla. ¿Podemos responder alguna pregunta? Es la única solución nativa de .NET, la única otra solución nativa fue AppFabric que se suspendió. Asi que, Redis no es una solución de .NET, aunque Microsoft la eligió para Azure porque querían ser independientes de la tecnología, por lo que la eligieron, pero somos nativos de .NET. Hemos sido así desde el primer día y, hasta donde sabemos, somos la opción favorita para .NET.

¿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.