Campamento de código .NET de Filadelfia

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

El tema de hoy es como optimizar el ASP.NET core actuación. Prefiero tener discusiones más interactivas, así que, mientras hablo, si tienen alguna pregunta, levanten la mano para que podamos comunicarnos. Entonces, estoy seguro de que está aquí porque la ASP.NET core es ahora la tecnología popular para desarrollar nuevas aplicaciones .NET o aplicaciones web .NET porque tiene una arquitectura limpia y liviana. Probablemente ya esté en MVC desde ASP.NET. Entonces, si ese es el caso, pasar a un ASP.NET core va a ser bastante fácil. ÁSPID.NET core es ligero Es multiplataforma, es de código abierto y hay una gran base de usuarios de ASP.NET heredada que hace que sea muy probable que la mayoría de ustedes se cambien a ASP..NET Core.

Entonces, ASP.NET core en adelante va a ser la elección, la elección de tecnología para .NET, para desarrollar aplicaciones web de alto tráfico o aplicaciones de servidor y aplicaciones web de alto tráfico. Eso significa ASP.NET core necesita escalabilidad y estoy seguro de que es por eso que estás aquí. Solo entendamos las definiciones antes de profundizar más.

¿Qué es la escalabilidad?

¿Qué es la escalabilidad? La escalabilidad esencialmente significa que si tiene una aplicación con cinco usuarios y funciona súper rápido, con un buen tiempo de respuesta, entonces puede mantener el mismo tiempo de respuesta, el mismo rendimiento con cinco mil o cincuenta mil o quinientos mil usuarios, usuarios simultáneos que su aplicación. es escalable. Si su aplicación no funciona bien con cinco usuarios, entonces esta no es la conversación para usted, entonces tiene otra, probablemente necesite ver la forma en que está accediendo a su base de datos y está haciendo su programación general. Esto supone que ha hecho un buen trabajo, desarrollando aplicaciones para al menos unos pocos usuarios y luego necesita saber cómo escalarlas.

¿Qué es la escalabilidad lineal?

La escalabilidad lineal significa que puede agregar más servidores en producción y, a medida que agrega más servidores, puede agregar de manera lineal la capacidad de transacción.

escalabilidad lineal

Ahora entraré en más detalles, pero lo que sucede es que, digamos que comienza con dos granjas web de servidores con carga balanceada. Después de cierta cantidad de usuarios, esos dos servidores se maximizarán y su rendimiento comenzará a disminuir y luego agregará el tercer servidor y, de repente, la capacidad debería aumentar en al menos un tercio o cualquiera que sea la nueva fórmula y luego cuando vaya cuando maximice tres servidores, entonces seguramente vuelva a agregar incremental. si puede hacer eso, entonces tiene una arquitectura de aplicación linealmente escalable. Si no puede hacer eso, entonces tiene un no lineal.

¿Qué es la escalabilidad no lineal?

Básicamente, no lineal significa que después de unos pocos servidores, agregar más servidores no hará ninguna diferencia porque hay algún cuello de botella en su aplicación que impide que se escale. Por lo tanto, su rendimiento en realidad disminuirá a medida que agregue más carga y hable hasta el punto en que su aplicación podría fallar. Por lo tanto, definitivamente no desea escalabilidad no lineal, lo que básicamente significa que después de cierto punto no hay escalabilidad.

escalabilidad no lineal

Qué aplicaciones necesitan escalabilidad

Entonces, ¿qué tipo de aplicaciones necesitan escalabilidad? Todas estas son aplicaciones de servidor. Estas son sus aplicaciones web que tiene el ASP.NET core servicios web, de nuevo ASP.NET core. Si desarrolla en microservicios, los microservicios se están convirtiendo en una gran palabra de moda ahora y debido al hecho de que puede ejecutarlos en contenedores y en un entorno en contenedores, puede ejecutar incluso ASP.NET core en un entorno en contenedores, pero los microservicios son otro muy buen caso de uso para la escalabilidad o cualquier otra aplicación de servidor en la que se procesan muchas transacciones en el backend.

Por lo tanto, si tiene alguno de estos tipos de aplicaciones, generalmente son aplicaciones orientadas al cliente, orientadas a la salida o al menos son parte de la aplicación orientada a la salida. Digamos que si su aplicación de servicios web, puede ser parte de una aplicación web general y hay un nivel de servicios web y lo mismo ocurre con los microservicios, pero generalmente son aplicaciones orientadas al cliente o orientadas a la salida, pero no siempre. Si es una empresa grande, es posible que tenga decenas de miles de usuarios internos, pero la mayoría de las veces son cosas externas.

El problema de la escalabilidad y la solución

Entonces, hay un problema de escalabilidad y es por eso que tenemos esta conversación hoy y el problema de escalabilidad no está en su nivel de aplicación. Por lo tanto, si tiene un entorno de carga equilibrada, el nivel de su aplicación se escala de forma muy lineal. Puedes agregar más servidores, no hay problema. Es la base de datos o el almacenamiento de datos. Cualquier tipo de datos que se almacenen podrían ser los datos de su aplicación, podrían ser sus sesiones, podrían ser cualquier otro dato que esté almacenando o recuperando que se convierte en un cuello de botella y es por eso, es una de las razones por las que NoSQL databaseha ganado popularidad.

NoSQL Database

El problema con NoSQL databaseEs que requieren que te alejes de las bases de datos relacionales. Lo que hemos visto es que para muchas situaciones, déjame decir que en la mayoría de los casos, puedes usar NoSQL databases para algunos datos, pero muchos datos todavía tienen que residir en bases de datos relacionales. Entonces, seguirá usando SQL Server o la base de datos SQL en Azure. Por lo tanto, debe resolver este problema de escalabilidad con bases de datos relacionales. NoSQL databaseLos s no siempre son la respuesta porque no puede usarlos, no puede reemplazar una base de datos relacional con una NoSQL database siempre. Y, si no puedes reemplazarlo, si no puedes usarlo, no puedes beneficiarte de él. Incluso si pudieras usar un NoSQL database, todavía no proporcionan el rendimiento que proporciona la caché distribuida en memoria. Entonces, todavía necesitarías muchas de las cosas de las que estoy hablando.

Entonces, veamos qué sucede realmente y permítanme analizarlo. El problema de la escalabilidad es algo que realmente no desea esperar hasta que suceda. Porque si está desarrollando una aplicación y dice que está funcionando bien hoy y es bueno para mil usuarios o cualquiera que sea la cantidad de usuarios que tenga y de repente su negocio comienza a volverse popular, tiene muchos más clientes en camino. Su departamento de marketing o comercial ha hecho un buen trabajo y, de repente, su aplicación comienza a ralentizarse y se ha documentado a través de estudios que muestran que cada segundo de ralentización, una aplicación web genera una pérdida de ingresos. Debido a que sus clientes en muchos de estos negocios en línea, los tipos de negocios que están en línea son negocios de comercio electrónico, negocios minoristas con tiendas en línea, esto podría ser atención médica, gobierno electrónico, redes sociales, juegos de azar en línea, industria de viajes. Muchas empresas se están conectando en línea porque cualquier empresa que tenga que tratar con consumidores va a hacer negocios con ellos. Estos son consumidores o decenas de miles, por lo general van a conectarse en línea con ellos. Y en línea no siempre es una aplicación web, también podría ser una aplicación de servicios web porque puede tener una aplicación móvil que se comunicará con un back-end.

Por lo tanto, no es una buena idea esperar hasta que tenga problemas de escalabilidad porque entonces será muy costoso para su negocio. Estas aplicaciones se ralentizarán, ya que vio esa curva no lineal en ese momento, agregar más servicio no ayudará. Por lo tanto, debe planificar esto con anticipación. Asegúrese de que la arquitectura de su aplicación sea correcta y que esté aprovechando esto. Es casi como algo obligatorio como mejor práctica para usted incorporar un caché distribuido en la arquitectura de su aplicación.

Almacenamiento en caché distribuido

Entonces, ¿cómo ayuda un caché distribuido? voy a usar NCache como ejemplo aquí y NCache es un caché distribuido de código abierto para .NET. Puede encontrarlo en GitHub y también puede encontrarlo en nuestro sitio web y también hay Enterprise Edition. Entonces, si no tiene el dinero o el presupuesto, vaya con el código abierto. Si desea una versión más compatible con más funciones que el código abierto, elija Enterprise. Entonces, voy a usar NCache como el ejemplo pero no estoy hablando de NCache. Estoy hablando de almacenamiento en caché en general. Entonces, ¿cómo ayuda un caché distribuido? Bueno, digamos en caso de NCache crea un grupo de dos o más servidores para que, como puede ver, este nivel intermedio, que es un nivel de almacenamiento en caché, tendrá dos y estos dos servidores y tal vez más de dos, dependiendo de cuántos servidores tenga aquí. ¿Cuánta carga tienes aquí?

ncache-despliegue

Entonces, cuando no tiene un caché distribuido, la base de datos es solo un servidor, realmente no puede distribuir una base de datos relacional. Quiero decir, las bases de datos relacionales del servidor SQL están tratando de mejorar su rendimiento. Por ejemplo, ahora tienen tablas en la memoria. SQL también tiene réplicas de solo lectura de la base de datos. Entonces, las lecturas se pueden replicar, pero el problema con las réplicas es que cada actualización es mucho más lenta porque cada vez que actualice se actualizarán cinco o cuatro lugares. Entonces, no es la forma ideal de resolver esto. Hay una mejor manera que es el caché distribuido y la razón por la que un caché distribuido es escalable es la palabra distribuida y la forma en que se puede distribuir es porque es un almacén de valor clave. Todo se almacena en base a una clave. La clave se puede mapear fácilmente en varias particiones y cada partición es un servidor y así es como se logra la distribución.

Entonces, tiene un mínimo de dos servidores de caché, una configuración típica que vemos es de aproximadamente 16 a 32 gigas por servidor como memoria porque, nuevamente, es un almacenamiento en memoria, por lo que debe tener mucha memoria. Y forma un clúster, es un clúster basado en TCP que extrae esta memoria y CPU como un recurso del clúster. Entonces, supongamos que comenzó con una aplicación web clara con 4 o 6 servidores web, por lo que tendrá 2 servidores de caché y su memoria de, digamos, 16 a 32 gigas y ahora está comenzando a obtener más y más y 80% del tiempo que ingresa al caché, el 20% irá a la base de datos para las actualizaciones. Incluso puede ser menos del 20% dependiendo de cuántas actualizaciones estés haciendo. Para algunos datos, las actualizaciones son más que para otros, pero digamos nuevamente, agregará más servidores al nivel de la aplicación aquí y volverá a hacer lo que hizo con la base de datos. Va a maximizar el nivel de almacenamiento en caché. Entonces, solo tienes 2 servidores. Digamos que llegó a unos 8 servidores en la granja web aquí. Porque como decía, cuanto más usuarios tienes más servicio de aplicación tienes. Entonces, esto se va a maximizar. Tan pronto como alcanza el máximo, agregamos un tercer servidor. Y estos no son servidores de muy alta gama. Estos son servidores de bajo costo.

Por lo general, un servidor típico tiene alrededor de 8 núcleos. Si obtienes más de 30 gigas de ram, entonces deberías ir a 16 núcleos porque a más RAM tienes más recolección de basura, tiene que ver porque no es una cosa de memoria administrada y entonces necesitas más potencia de procesamiento. Sin embargo, recomendamos a la mayoría de nuestros clientes, y nuevamente estas recomendaciones también se aplican al código abierto, recomendamos a nuestros clientes que utilicen entre 16 y 32 gigas de RAM por servidor. Simplemente agregue más servidores en lugar de obtener realmente pocos servicios de gama alta agregue más servidores. Entonces, cuando dos servidores están al máximo, simplemente agregue un tercero y lo mismo ocurre, puede agregar un cuarto o quinto y probablemente nunca alcance el máximo porque sea cual sea la capacidad de transacción que necesite, digamos si tiene 20,000 30,000 usuarios simultáneos, eso es prácticamente en el extremo superior de la mayoría de las aplicaciones web, quiero decir que puede haber algunas que son más, tal vez puede haber más de cien mil usuarios simultáneos, pero si tiene 20,000 usuarios simultáneos, eso significa que probablemente millones de personas visiten el sitio web todos los días. . Entonces, quiero decir, estamos hablando de esa escala.

Entonces, debido a esto, ahora, de repente, la base de datos ya no es el cuello de botella. Los datos de su aplicación de almacenamiento en caché... Entonces, es un caché común. Es un caché compartido. Entonces, cuando coloca este caché aquí, porque es un caché en memoria, en memoria significa que si un servidor de caché se cae, perderá datos. Entonces, eso significa que la memoria caché debe proporcionar una replicación inteligente, pero NCache hace para asegurarse de que si un servidor deja de funcionar, otro servidor tenga una copia de esos datos, pero si hace demasiadas copias, eso también ralentiza todo. Asi que, NCache solo hace una copia de los datos y los particiona. Cada partición tiene una copia de seguridad en algún otro servidor y luego, tan pronto como un servidor deja de funcionar, las particiones hacen otra copia. Y, al tener un caché compartido, ahora estas cajas se vuelven apátridas. Sin estado significa que no se almacenan datos en el nivel de la aplicación.

Entonces, lo que debe hacer es cuando pueda lograr ese objetivo de que su nivel de aplicación no tenga estado, lo que significa que puede desactivar cualquiera de los servidores de aplicaciones sin causar ninguna interferencia. Digamos que tiene que aplicar un parche, un parche del sistema operativo o una actualización de la aplicación o algo que puede seguir aplicando aquí porque todos los datos están en la base de datos o en esta capa, por lo que se pueden modificar fácilmente.

Casos de uso de caché distribuida

Entonces, ahora que hemos establecido el caso de por qué debería usar el almacenamiento en caché, ¿cuál es el beneficio? Qué problema resuelve y cómo resuelve ese problema. La primera pregunta es ¿para qué lo usas? ¿Cuáles son los casos de uso? ¿En qué parte de la aplicación utiliza un caché distribuido?

Almacenamiento en caché de datos de aplicaciones

El número uno es el almacenamiento en caché de datos de la aplicación. Ese es el caso de uso del que ya hablé, que es que tiene una base de datos que tiene los datos de la aplicación, almacena estos datos en caché para que no tenga que ir a la base de datos. Ahora, hay una cosa que debe tener en cuenta y volveré sobre esto: en el almacenamiento en caché de datos de la aplicación, los datos tienen dos copias, una está en el maestro, que es la base de datos, y otra está en el caché. Siempre que tenga esa situación en la que los datos viven en dos lugares, ¿qué podría salir mal? Sí, las dos copias pueden volverse inconsistentes o no estar sincronizadas, lo que significa que la memoria caché podría volverse obsoleta. Por lo tanto, cualquier caché que se detenga lo obliga a almacenar en caché solo datos estáticos, datos de solo lectura. Y, los datos de solo lectura son solo el 20% de sus datos totales. El 80% es lo que llamamos datos transaccionales. Si no puede almacenar en caché los datos transaccionales, ese caché lo limitará y aquí es donde NCache tiene algunas funciones realmente poderosas y, de nuevo, todo de código abierto, todas las funciones realmente poderosas que lo ayudarán a asegurarse de que el caché siempre se mantenga actualizado. Es bueno y voy a entrar en ese momento.

ASP.NET Core Almacenamiento en caché específico

El caso de uso número 2 es que nuevamente el almacenamiento en caché de datos de la aplicación es para ASP.NET core y también otras aplicaciones pero para ASP.NET core, hay al menos otros dos usos, uno son las sesiones en las que puede restaurar su sesión en un caché distribuido como NCache y no se necesita programación para hacer eso, así que es muy, muy rápido. Si desea obtener el rendimiento de beneficio más rápido para su aplicación y digamos que su aplicación ya está activa o está lista, esto simplemente comienza a mostrar sus sesiones en caché distribuida como NCache. Y, debido a que no hay Programación, hay muy pocas pruebas que debe hacer si las necesita, por supuesto, algunas pruebas básicas de cordura para asegurarse de que todo funcione en su entorno, pero no hay ningún esfuerzo de desarrollo involucrado. por eso no hay cronogramas de desarrollo ni cronogramas de lanzamiento involucrados en esto. Entonces, muy muy rápido.

El segundo PAS.NET core el almacenamiento en caché específico es el almacenamiento en caché de respuestas que está en ASP.NET solía llamarse caché de salida, en ASP.NET core en realidad lo han hecho más basado en estándares. Así que ahora utiliza las directivas de almacenamiento en caché basadas en HTTP que pueden ser entendidas por soluciones de almacenamiento en caché perimetral de terceros, pero esencialmente está almacenando en caché el resultado de una página, por lo que la próxima vez que se llame a esa página, si el resultado va a ser el mismo, ¿Por qué ejecutar la página? ¿Por qué no simplemente entregar la salida? Ahora, eso es bueno en aquellas situaciones en las que la salida no cambia con mucha frecuencia, que son muchos casos, pero si tiene una aplicación que es muy dinámica, probablemente no tendrá tanto contacto estático, pero incluso si puede tenerlo por un período corto que aún lo salva. Entonces, ASP.NET core el almacenamiento en caché de respuestas tiene un concepto de middleware y puede conectar un caché distribuido como NCache como un middleware que básicamente vive en el mismo nivel que el ASP.NET core o es lo mismo pero el caché de middleware podría estar aquí y aquí está el ASP real.NET core solicitud. Entonces, ese es el segundo caso de uso común más grande para el almacenamiento en caché distribuido y entraré en detalles un poco más de esto, pero solo les estoy dando una descripción general.

Mensajes y eventos Pub/Sub

El tercer caso de uso es algo que mucha gente no sabe que es lo que puede hacer mensajes de publicación/suscripción y eventos con una caché distribuida. La mensajería Pub/Sub permite que múltiples aplicaciones o múltiples instancias de su aplicación coordinen el trabajo entre sí al compartir información de datos de manera asincrónica basada en eventos. ¿Cuáles son algunos de los ejemplos que podríamos relacionar con esto? Los microservicios, nuevamente, los microservicios son servicios desacoplados independientes pero necesitan coordinarse. Quiero decir que un microservicio puede producir algo que otros microservicios utilizan, así es como se realizará el flujo de trabajo, pero no quieren depender unos de otros directamente, de lo contrario, todo el modelo se rompe. Entonces, lo que debe hacer es pensar en esto como si ya no fuera un caché para su base de datos, pero piense en esto, y en realidad voy a... dame un segundo, lo giraré solo para una imagen, piensa en el caché distribuido ahora como una plataforma de mensajería.

caso de uso de pubsub-mensajería

Entonces, todo el cambio de paradigma es que ahora tienes aplicaciones. Estos pueden ser múltiples máquinas virtuales o contenedores que ejecutan sus microservicios o cualquier otra aplicación y pueden comunicarse entre sí de manera pub/sub. Entonces, hay temas y hay editores y suscriptores y eso realmente simplifica su aplicación.

Ahora, hay otras soluciones Pub/Sub como el requisito de cola de mensajería de conejo y MSMQ. ¿Qué tiene de especial una caché distribuida como NCache? ¿Por qué deberías usar esto sobre eso? La razón para usar un caché distribuido es que es muy, muy rápido. Todo está en la memoria. No tiene todas las funciones que tendrá una cola de mensajes porque también serán persistentes y almacenarán los mensajes durante largos períodos de tiempo, pero en muchas situaciones no es necesario mantenerlos durante tanto tiempo si todo funciona dentro de el mismo centro de datos y es realmente un entorno transaccional, pero lo usa más para el flujo de trabajo que la replicación es más que suficiente. El hecho de que tenga todos los datos almacenados en más de un servidor es más que suficiente para asegurarse de que sus mensajes y eventos no se pierdan. Entonces, a diferencia del almacenamiento en caché de datos de la aplicación donde había dos copias de los datos, por lo que la naturaleza del problema era diferente, debe mantener el caché actualizado. En el segundo y tercer caso es lo contrario, solo hay una copia de los datos que es el caché. Entonces, ahora dentro del caché tiene que haber más de una copia que sea consistente para fines de replicación porque si no tiene eso, el caché que está en la memoria perderá sus datos. Por lo tanto, no desea perder sus mensajes, sus sesiones y la salida de su página solo porque una vez que el servidor está inactivo. Por lo tanto, la mensajería Pub/Sub en eventos suele ser un caso de uso realmente poderoso para un caché distribuido y, de nuevo, todo esto es de código abierto.

Entonces, hay otra característica en NCache llamada consulta continua que en realidad no tiene otra memoria caché de espacio .NET, algunas de las memorias caché de Java sí la tienen, y una consulta continua le permite especificar un tipo SQL de una consulta en la memoria caché, por ejemplo, podría decir algo como seleccionar clientes donde customer.city es Nueva York y usted dice que estoy interesado en este caso y le pregunta al caché si puede monitorear este conjunto de datos. Asi que. cualquier objeto de cliente con este atributo, agregado, actualizado o eliminado de la memoria caché, notifíquelo. Entonces, ahora no tiene que mirar cada objeto usted mismo, lo que de todos modos no puede o es para verificar, el caché lo hará por usted. Es similar a cómo funciona SQL Server en la dependencia de SQL. Puede pedirle a su servidor que monitoree el conjunto de datos y le notifique cuando ese conjunto de datos cambie. Excepto que es una o más filas en una tabla, pero aquí son objetos en un caché distribuido. Entonces, esos son los tres casos de uso comunes.

ASP.NET Core – Almacenamiento en caché de datos de la aplicación

Entonces, creo que el caso de uso más común es el almacenamiento en caché de datos de la aplicación. En realidad, la palabra caché distribuida es más una palabra del ecosistema de Microsoft. En el lado de Java, se llama cuadrícula de datos de memoria. Usamos tres palabras. Usamos el caché distribuido, usamos la cuadrícula de datos de memoria para la ventaja web de la gente de Java, aunque estamos en el ecosistema de Microsoft. Entonces, no somos tanto y luego está el almacén de datos en memoria distribuido. Por lo tanto, el almacenamiento en caché de datos de aplicaciones es el caso de uso de almacenamiento en caché distribuido.

Interfaz IDistributedCache

Entonces, si va a utilizar el almacenamiento en caché de datos de la aplicación, hay tres formas de hacerlo. Hay una interfaz IDistributedCache y está disponible en ASP.NET 4, que básicamente se parece a esto aquí.

caché distribuido

Interfaz muy simple. Microsoft finalmente proporcionó una interfaz que le permite conectar cualquier caché distribuida debajo. El único problema con esto es que es muy, muy simple. Entonces, no puedes hacer mucho a través de esto. Puedes hacerlo realmente básico. Y, lo único que hace es que le da vencimientos. Puede especificar la opción de entrada de caché que son los vencimientos. ¡Entonces sí! NCache implementa esto, por lo que si está programando a través de la interfaz IDistributedCache, puede simplemente conectarse NCache sin ningún cambio de código, ningún otro cambio de código y ha hecho la programación, pero no recomendaría que hiciera esto porque si realmente va a aprovechar un caché distribuido y el beneficio, entonces quiere entender lo que todos los demás ¿características? ¿Por qué no deberías usarlos? Ahora voy a ir con eso.

Entity Framework Core Cache

Otra es si está haciendo EF core, nuevamente, si desea minimizar el código que desea escribir, NCache presente proveedor de métodos de extensión del núcleo de EF, permítame mostrarle esto rápidamente. Por lo tanto, los métodos de extensión del núcleo de EF realmente simplifican la forma en que usaría el caché. Nuevamente, al igual que IDistributedCache, las características no son tan extensas.

ef-core-caché

Entonces, por ejemplo, supongamos que desea ver su consulta típica basada en EF Core o EF LINQ, lo que hemos hecho es implementar un método de extensión de caché de granja y hay otros métodos de extensión, tan pronto como diga que cuando esté detrás del equipo, esta consulta primero se verá y estará en el caché. Si el caché lo tiene, lo obtendrá del caché; de lo contrario, irá a la base de datos, lo obtendrá y lo almacenará en caché antes de que se lo entregue. Entonces, simplifica bastante su programación. Si eso es algo que desea, digamos que ya tiene una aplicación principal de EF y desea conectarse lo más rápido posible, esta es la forma más rápida de obtener NCache allí como se puede ver esto es.

NCache API

La tercera opción es utilizar NCache API que también es una API bastante sencilla. NCache La API se ve casi idéntica al objeto ASP.NETcache pero más que eso lo hemos intentado pero salimos hace mucho tiempo. ÁSPID.NET Core es la única interfaz para el objeto que existía, así que tratamos de mantenerlo lo más cerca posible.

ncache-api-app-data-caching

Entonces, es un concepto simple, se conecta al caché, obtiene un identificador de caché, hace un cache.get, hay un índice u olvida, puede hacer contiene, agrega, inserta, elimina y son versiones asíncronas de estos para que no tenga que esperar a que se actualice el caché. Obviamente hay más que eso. Entonces, esto te da una idea de lo simple que es usar un caché.

Funciones de almacenamiento en caché de datos de la aplicación: mantenga el caché actualizado

Ahora, lo principal a lo que quería llegar era a esta página. Sí, supongo que te dije que hay dos copias del caché. Si su caché no puede mantenerse actualizado, realmente limitará el uso. Eso es muy importante de entender. ¿Qué hacen los cachés?

Vencimientos (Absoluto + Deslizante)

La mayoría de los cachés le proporcionan Expiraciones. La caducidad también se llama TTL, Tiempo de vida, lo llamamos caducidad absoluta porque ahí es donde el objeto de caché de ASP.NET usa ese término, así que lo mantuvimos. ¿Qué hace? Está agregando un objeto al caché, está diciendo que venza este dentro de cinco minutos o dentro de diez minutos porque creo que es seguro almacenarlo en caché durante ese tiempo. Está haciendo una suposición informada que está bien en algunos de los casos de datos de referencia. Por ejemplo, tienes un catálogo de productos. Probablemente no va a cambiar cada 10 minutos. Su precio no va a cambiar allí. Entonces, son cambios más predecibles para algunas de las situaciones. Entonces, está bien usar expresiones allí. Pero, si está almacenando en caché un cliente o una actividad, no sabe cuándo cambiará eso porque los clientes llamarán y harán algunos cambios, por lo que es posible que no pueda vivir solo de Expiraciones. Entonces, ahí es donde necesita otras funciones en el caché y aquí es donde están todas estas funciones en Caché en NCache como código abierto.

Sincronizar caché con base de datos

Una de las características es la NCache puede sincronizarse con la base de datos. Ahora la base de datos puede ser SQL Server, podría ser Oracle o podría ser OLEdb en caso de sondeo, pero la sincronización significa que NCache se convierte en cliente, el servidor de caché se convierte en cliente de la base de datos. Ahora usará la dependencia de SQL de la que estaba hablando. Lo mismo que una consulta continua pero para el servidor SQL. Utilizará una dependencia de SQL y le mostraré cómo funciona.

sincronizar-base de datos

Entonces, digamos... Entonces, cuando agrega, digamos que agrega este objeto de producto al caché, de modo que tiene una clave y tiene el elemento de caché que contiene el producto. Lo que desea hacer es especificar una declaración SQL que identifique un producto específico en la tabla de productos y nuevamente esta declaración SQL es para el servidor SQL. Estás pasando el caché de eventos, NCache lo pasaremos al servidor SQL. NCache, cuando almacena en caché este producto, ahora notificará a un registro con el servidor SQL una dependencia de SQL y mantendrá la asignación. Entonces, si el servidor SQL envía un evento a NCache diciendo que este producto se actualizó en la base de datos ahora NCache sabe que todavía está en el caché. Entonces, hará una de dos cosas. solo necesita eliminarlo del caché. Me refiero a que su aplicación no tiene que hacer nada, todo lo hace el caché o si ha implementado esta característica llamada lectura, automáticamente recargará el elemento. Entonces, iré a la base de datos en un momento. Por lo tanto, la sincronización de la base de datos es una característica muy poderosa. Le da tranquilidad y almacena en caché todos los datos. Sin lo cual, si solo está haciendo sus exploraciones, está limitado y es tan malo que si habla con una persona típica que sabe sobre el almacenamiento en caché de manera básica, reaccionará al almacenamiento en caché, "oh, eso es para datos de solo lectura". El almacenamiento en caché es solo para datos estáticos. Todo el mundo tiene miedo de tocar los datos transaccionales y es por estas cosas, porque los vencimientos no son más que una conjetura educada, que puede ser válida para casos más predecibles como el catálogo de productos y otros, pero no es válido para los datos transaccionales.

Sincronizar caché con no relacional

Entonces, el mismo problema si tiene un almacén de datos no relacional. Podría ser algo en la nube, podrían ser bases de datos heredadas, podría ser un mainframe. Puede lograr el mismo objetivo que la dependencia de SQL, excepto en ese caso, no está en esa notificación. Una dependencia personalizada es algo que implementa. Es su código que este es un código del lado del servidor, por lo que NCache tiene este concepto de código del lado del servidor. Código que escribes, que vive en el servidor de caché.

Lectura y escritura

La dependencia personalizada es una, la lectura simultánea y la escritura simultánea son Otra. Acabo de hablar sobre la lectura directa, que puede volver a cargar la cosa si está en una sincronización de base de datos, si elimina el elemento NCache puede ir y recargar. ¿Cómo se puede recargar? Aunque su código de lectura. ¿Qué es la lectura completa? Parece que estoy saltando de un lado a otro, pero quería conectar estos .s por eso. ¿Cómo... escribir y leer es solo una interfaz simple, por lo que tiene una interfaz de lectura aquí? Sí, hay tres métodos, hay un Init que le permite conectarse a la fuente de datos. Dispose es la desconexión y son demasiadas sobrecargas de LoadFromSource. Entonces, LoadFromSource es una clave y usted devuelve el elemento de caché y LoadFromSource tiene una sobrecarga en la que puede devolver un diccionario. Entonces, LoadFromSource es algo que NCache llama a su controlador de lectura.

Entonces, digamos que su aplicación hace Cache.Get y ese elemento no está en el caché y le dice NCache si no está en el caché, vaya y pregunte al controlador de lectura. NCache llamará al controlador de lectura completa porque el controlador de lectura completa es su código que vive dentro del clúster de caché. NCache llamará a este método. Este método es su código, va a su base de datos, su fuente de datos, que puede ser cualquier cosa, podría ser un SQL o llamado mainframe y obtener los datos y luego ponerlos. Ahora eso NCache tiene la capacidad de ir a su base de datos, lo que significa que puede hacer una recarga automática. Entonces, esa es la parte de conveniencia. Por lo tanto, puede sincronizarlo con la base de datos relacional y la base de datos no relacional.

Almacenamiento en caché de datos relacionales

Lo último es el almacenamiento en caché de datos relacionales. Tienes que hacer el mantenimiento de libros con la aplicación de datos y realizar un seguimiento de un dato y la relación con otro. Solo voy a dar un ejemplo de un cliente que tiene varios pedidos. Aunque generalmente no elimina un cliente, digamos que lo hizo y el caché no lo sabe, digamos que si eliminó un objeto de cliente del caché y tenía diez pedidos en el caché, esos pedidos no son ya no son válidos, no deben guardarse en la memoria caché. Por lo tanto, cada vez que tiene uno a muchos, generalmente los muchos dependen del uno, por lo que si elimina uno del caché, también debe eliminar muchos del caché. Ahora es algo de lo que tendría que hacer un seguimiento cada vez que elimine uno, tiene que ir y eliminar muchos. Entonces, lo que puede hacer en su lugar es que el objeto de caché ASP.NET tenía un concepto de dependencia adjunto. NCache implementó esto para que pueda relacionar estos dos y luego, si el objeto del cliente alguna vez se actualiza o mueve, todos los pedidos se eliminan automáticamente.

Puede usar la dependencia de caché para uno demasiado, para uno a uno y también si desea almacenar en caché colecciones y luego almacenar objetos individuales por separado también. Entonces, eso está en su colección de clientes como un objeto almacenado en caché y tenía algunos de los clientes también almacenados en caché individualmente. Porque en el caché puedes guardar varias copias. Todo está siendo mantenido por su aplicación. Entonces, a diferencia de su base de datos, que tiene que tener normalización e integridad de datos y, de esa manera, el caché puede tener varias copias porque se trata de rendimiento. Cuando tiene varias copias y tiene que poder limpiar cuando se actualiza una copia y eso es lo que le permite hacer esta dependencia de caché. Entonces, esas son las cuatro formas diferentes en que mantiene su caché actualizado. Todos están disponibles como parte de NCache open source.

Funciones de almacenamiento en caché de datos de aplicaciones: lectura y escritura simultáneas

Estoy a través de la escritura simultánea de lectura nuevamente, la escritura simultánea es lo mismo que la lectura simultánea, excepto que, cuando actualiza el caché, le pide al caché que vaya y actualice la base de datos.

Lectura y escritura simultánea

Entonces, la lectura completa es cuando lee el caché y le pide al caché que lea de la base de datos en caso de que no tenga los datos. Ahora, la lectura directa y la escritura directa le permiten consolidar su código de persistencia en un nivel de almacenamiento en caché. Y deje que el caché sea más consciente de su base de datos y la aplicación se vuelva más y más simple.

escribir detrás

la escritura simultánea también tiene un beneficio adicional que se llama escribir detrás de que cada vez que actualiza la base de datos, esa es la operación más lenta en su aplicación es actualizar la base de datos. Es incluso más lento que obtener datos de la base de datos y si está utilizando un caché para obtener datos, no tiene que ir tanto a la base de datos. ¿Por qué no usar el caché para datos actualizados si los datos no son tan sensibles? Significa que puede ponerlo en cola para una actualización asíncrona. Si los datos son muy confidenciales, entonces, obviamente, no desea ponerlos en cola para la actualización asíncrona, pero muchos de los datos se pueden poner en cola para la actualización asíncrona. Cuando lo pone en cola y básicamente hace una función de escritura posterior, pregunta NCache para escribirlo en la base de datos de forma asíncrona, a medida que se genera una cola o una solicitud de actualización múltiple, esa cola se replica en varios servidores, en caso de que un servidor se caiga, no está perdido. Y, su aplicación ciertamente acelera allí porque ya no está esperando que se actualice la base de datos. Por lo tanto, la escritura directa tiene la ventaja de rendimiento. Y, escriba detrás... La lectura completa tiene todos los beneficios.

Artículos de recarga automática

Incluso puede recargar automáticamente con vencimientos. Entonces, cuando expire, puede recargar automáticamente ese artículo. La caducidad básicamente, digamos, probablemente cambie en el servidor de la base de datos. Ya no es válido en el caché, por lo que no lo eliminará, ¿por qué no lo cargamos? Lo necesitará de todos modos. Entonces es probable que sea una especie de búsqueda de datos, por lo que se lee automáticamente. Nuevamente, el caché se hace cargo cada vez más de ese trabajo de su aplicación.

Funciones de almacenamiento en caché de datos de aplicaciones: agrupación de datos

Una vez que pueda mantener el caché actualizado y tenga confianza, ahora comenzará a almacenar en caché una gran cantidad de datos. Cuando comienza a almacenar en caché una gran cantidad de datos, es realmente bueno si puede buscar datos más allá de este par de valores clave. Acabo de hablar con alguien anoche y realmente tuvieron que idear técnicas sobre cómo formatear las claves para encontrar diferentes tipos de datos. Esto es algo que no tienes que hacer en NCache. Puede asignar estas etiquetas meta llamadas grupos y subgrupos y etiquetas y etiquetas con nombre. Estos son metadatos que puede asignar a sus objetos en lugar de cambiar el nombre de las claves. Estos podrían ser mejores datos y en base a eso puedes decir dame todo lo que tenga esta etiqueta o estas dos etiquetas o estas tres etiquetas o dame todo lo que pertenezca a este grupo. Ese es uno.

En segundo lugar, puede hacer consultas SQL. Déjame mostrarte eso. Entonces, nuevamente, el caché comienza a parecerse cada vez más a una base de datos.

agrupación de datos

Entonces, por ejemplo, puede decir aquí, seleccione todos los productos con este nombre para que ahora esté haciendo una búsqueda basada en un atributo del objeto del producto. Ahora esto es mucho NCache código para ejecutar. lector como SQL Server. Es muy similar, obtienes un lector de Icache y solo miras tus cosas. Ahora, esto es algo nuevo, haz que el caché haga lo que necesites hacer. Por un lado, coloca una gran cantidad de datos en el caché y, en segundo lugar, ahora puede buscar datos en el caché.

ASP.NET Core Almacenamiento de sesiones

He hablado del ASP.NET core sesiones Creo que lo principal a tener en cuenta es que hay dos formas de usarlo.

Almacenamiento de caché distribuida

Una es que te enchufas NCache. NCache ha implementado un proveedor IDistributedCache. Entonces, te conectas NCache como proveedor de IDistributedCache y ASP.NET core automáticamente comienza a almacenar las sesiones en NCache. A ver si lo tengo aquí.

almacenamiento de sesión de caché distribuido

Entonces, por ejemplo, aquí hay un ASP.NET Core aplicación, vas a los servicios de configuración y solo agregas NCache como proveedor de IDistributedCache y ahora está utilizando el ASP normal.NET core sesión que sabe que depende de IDistributedCache porque sabe que ahora hay un proveedor conectado. Entonces, cuando haga esto, todas las sesiones se guardarán en NCache. Y les voy a mostrar cómo es el almacenamiento en caché. Voy a darles una demostración real de NCache. Entonces, esa es una forma.

NCache Proveedor de sesión

La segunda forma es que realmente uses NCache como su propio proveedor de sesión, entonces, en lugar de ir a IDistributedCache, ingresa a los mismos servicios de configuración y dice agregar NCache proveedor de sesión.

ncache-sesion-proveedor

Ahora, este proveedor de sesiones tiene más funciones que el IDistributedCache normal. Tiene más funciones específicas de sesión. Quiero decir, te recomendaría que usaras el NCache en su propio proveedor de sesión que ha sido bueno para ir con IDistributedCache. Pero, puede ir a ambas opciones, ASP.NET core te proporciona esto. Como dije, esto no requiere nada más que eso para cambiar el código. Eso es todo. Todo lo demás es automático. Entonces, si se va a beneficiar de un caché distribuido como NCache, conecte esto como un punto de entrada en su aplicación. Tiene que beneficiarse hoy porque el almacenamiento en caché de datos de su aplicación requerirá programación y luego se ajustará a sus cronogramas de desarrollo y un proceso un poco más largo que este. Pero, esto se hace muy muy rápido y sé que seguramente esto ya está aquí.

ASP.NET Core Almacenamiento en caché de respuestas

Y, esta es una configuración, así que volveré a repasar y de la misma manera que el almacenamiento en caché de respuestas usa un caché distribuido y puede conectarse NCache a eso y luego funciona automáticamente.

almacenamiento en caché de respuestas

Requisitos arquitectónicos en caché distribuida

Permítanme entrar rápidamente en algunas de las cosas que NCache lo haré

Alta disponibilidad

Un caché distribuido es algo así como una base de datos, está viviendo en producción con su aplicación. Por lo tanto, debe asegurarse de que su arquitectura sea flexible y esté altamente disponible.

clúster de caché de alta disponibilidad

Así por ejemplo, NCache tiene una arquitectura peer-to-peer pero otros tipos de Redis no tener. Entonces, en lugar de tener un esclavo maestro, desea tener un punto a punto. Como dije, muchos de los cachés de Java a los que llaman en la cuadrícula de datos de memoria tienen una arquitectura de igual a igual. Lo bueno de peer-to-peer es que todos son pares, por lo que cualquier nodo puede fallar y no sucede nada. Probablemente el esclavo maestro es el esclavo que no puede convertirse en maestro. Si el amo muere, el esclavo sigue siendo un esclavo. Entonces, requiere intervención manual para que usted se recupere. En caso de peer to peer, se recupera automáticamente. Por lo tanto, debido a peer to peer, se convierte en lo que llamamos el grupo dinámico de autorreparación que se ajusta automáticamente. Entonces, ese es el primer aspecto.

Escalabilidad lineal w. Replicación

El segundo aspecto es la escalabilidad lineal, que es la partición y nuevamente la escalabilidad lineal con ajuste dinámico de la partición.

particiones-dinamicas-1

Las cosas NCache automáticamente es, digamos que tiene una configuración de dos servidores y desea agregar dos particiones y ahora desea agregar un tercer servidor, por lo que se agrega la tercera partición. NCache automáticamente, digamos que va desde, digamos que tiene dos servidores aquí con dos particiones. Cada partición como una copia de seguridad en un servidor y una partición diferentes es esencialmente una colección de cubos con distribución de mapas hash.

particiones-dinamicas-2

Entonces, digamos que si tiene 1,000 cubos, 500 irán a la partición 1, 500 partición mundial 2, todo funciona bien, ahora desea agregar un tercer servidor. St una vez porque, de nuevo, al agregar un tercer servidor ahora puede tener tres particiones, por lo que NCache lo hará automáticamente entre bastidores mientras se ejecuta la aplicación, creará una tercera partición y moveremos algunos de los datos de la partición 1 y 2 a la tercera partición. Nuevamente, un tercio, un tercio, un tercio. Entonces, los baldes realmente se mueven y todo eso sucede dinámicamente. Una vez que los cubos se mueven, las réplicas también se reajustan, pero la réplica uno y la dos ya no son las mismas réplicas que eran anteriormente, rápidamente tienen menos datos y está la nueva réplica llamada réplica tres. El servidor que tenía las réplicas dos ya no es la réplica 3, tendrá tres y la réplica tres se creará en el tercer servidor, todo eso se hace automáticamente por usted.

Entonces, ese dinamismo es lo que lo hace altamente disponible. Entonces, cuando agrega un servidor, hay una intervención manual, pero realmente tiene que... Entonces, sigue siendo muy conveniente si puede ir y hacer eso. Literalmente, solo dices agregar y todo se hace por ti. Pero, es aún más importante cuando descarta un servidor porque la caída también podría ocurrir debido a la falla del servidor. Entonces, cuando está en la configuración de tres servidores, eso dice que el servidor 3 se cae, ahora la partición 3 se pierde, ¿qué NCache lo que hará es activar inmediatamente la réplica tres porque tiene una copia de la partición 3. Entonces, ahora tiene la partición 1, la partición 2 y la réplica 3 porque la partición 3, temporalmente. Por lo tanto, no hay interrupción. Una vez hecho eso entonces NCache ahora tenga en cuenta que solo dos servidores solo pueden tener tres particiones, fusiona la réplica 3 en la partición 1 y 2, todo al mismo tiempo y luego, una vez que se realiza la fusión, ahora crea una réplica 2 en este lugar aquí. Entonces, puedes volver a esta imagen.

Ahora bien, esto es algo que con otras modas no se puede hacer de forma automática. Lo que eso significa es que si esto sucedió y el medio murió, uno de los miembros de su departamento de TI tendrá que ir y reajustarse manualmente y hasta que eso suceda, un caché para uno y lo que ellos llaman funcionalidad limitada, pero NCache lo hace automáticamente así. Entonces, debe asegurarse de que la alta disponibilidad esté realmente allí en un caché.

Caché de cliente

Ya he hablado de la velocidad de InProc.

cliente-caché

Replicación pálida

Hay otra característica y ahora esta es una característica para Enterprise Edition, que es que, si tiene varios centros de datos a los que ahora se han movido muchas aplicaciones, debido a la nube, es más fácil implementar la aplicación en varias regiones.

diagrama de replicación wan

Por lo tanto, si su aplicación está centrada en múltiples datos, es posible que su caché también deba replicarse en múltiples y, debido a que hay mucha latencia, no puede realmente hacer que todo el clúster abarque varias regiones. Entonces, tendrá un clúster en uno en un clúster y hay un puente en el medio que se replica de forma asíncrona. Entonces, es un caso de replicación bidireccional de activo-activo y el puente resuelve el conflicto debido a que la misma clave se actualiza para ambos lugares. Ahora tienes que hacer un seguimiento de eso.

NCache De demostración

Déjame mostrarte rápidamente lo que NCache parece. Entonces, obtuve Azure, así que básicamente adquirí o aprovisioné, si puedo obtener el portal, ¡ahí está! Entonces, tengo... es muy lento. ¡Vamos! Tomando cuatro, sí, ¡de acuerdo! Entonces, tenemos cuatro máquinas virtuales en esto y estoy conectado a una de ellas que es... Entonces, básicamente tengo dos servidores de caché, son todas ventanas, un cliente de caché Windows, un cliente de caché que es Linux. Porque es .NET core, puedo hacer todo. Incluso los servidores de caché pueden estar activos, pero NCache como dije es .net core así que puede simplemente ir, cuando ingrese a nuestro sitio web, solo, puede descargar el .msi o el Tar.gz según su preferencia. Puede instalar Windows o Linux. En realidad, también puedes descargar código abierto desde aquí. Nuestra empresa se basa en nuestro código abierto, por lo que somos propietarios de un código abierto y una empresa.

Crear una caché en clúster

Entonces, permítanme rápidamente ahora, lo siento, voy a crear un clúster de caché de 2 nodos, nuevamente, esta herramienta no es de código abierto, pero todo esto se puede hacer en código abierto. Simplemente no es tan bonito. En realidad, ahora será una herramienta basada en la web. Entonces, solo voy a seguir adelante. Este es mi primer servidor de caché. Este es mi segundo servidor de caché. Entonces, voy a hacer dos clústeres de caché de servidor. Tomaré todos los demás valores predeterminados tal como están. Continuaré y agregaré dos clientes, uno soy yo mismo, que es el cliente de Windows y el segundo agregaré el cliente 10.0.0.7 y el cliente de Linux. Comencemos el caché. Quiero decir que así de rápido es para usted crear y configurar cachés.

Simular estrés y monitorear caché

Voy a comenzar mi primera estadística sobre esto. NCache viene con este programa llamado herramienta de prueba de estrés que le permite simular la carga en NCache. Entonces, es como un programa. Obtiene entradas por sí mismo. Tengo PowerShell abierto aquí, así que voy a hacer una prueba de estrés e ingresar el nombre del caché, que es el nombre del caché que acabo de dar aquí, escribir aquí, y ahora tengo este cuadro, este es el primero. Entonces, voy al cuadro de cliente, así que voy a ejecutar esto y verán que de repente comienza la actividad aquí. Entonces, estoy haciendo alrededor de 500 operaciones por segundo por caja en este momento, ¿de acuerdo? Entonces, digamos, quiero aumentar mi carga, quiero probar cómo NCache funcionará en mi entorno, así que continuaré y lanzaré otra instancia de lo mismo en la misma caja. De repente, verán que mi carga ha subido casi al doble y ahora tengo dos cajas de Linux, como pueden ver aquí es Linux, este es el . caja de siete que está justo aquí. Entonces, primero voy a iniciar PowerShell aquí, solo quiero copiar rápidamente este módulo y haré el mismo caché de demostración de prueba de estrés y tan pronto como lo haga, verá que esto ha subido repentinamente a punto de tener 60…

ncachemanifestación

Entonces, cada vez que hago esto, se agregan alrededor de 500 operaciones por segundo por caja. Voy a hacer uno más y luego terminaremos con eso. Agregaré... Entonces, puede seguir agregando más y más carga hasta que vea que comenzarán a maximizarse y luego agregará un tercer servidor. Y, por supuesto, también necesita agregar más clientes. Todo esto es perf-mon que puede monitorear fácilmente, incluso en herramientas de terceros. Esto es tan simple como es. Estos son elementos almacenados en caché que está agregando.

Puede acceder a la descarga de nuestro sitio web, ya sea el código abierto, por lo tanto, el código abierto está disponible, también hay un instalador MSI para que descargue el código abierto. Por lo tanto, puede optar por el código abierto o, si está realmente seguro de que desea usarlo en un entorno de apoyo, simplemente continúe y descargue Enterprise de inmediato. Digamos, si llegaré al código fuente abierto, para que pueda descargar el instalador, de esa manera no tendrá que pagar por el código fuente. Nuevamente, aunque todo el código fuente está en GitHub.

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