Con el desarrollo de aplicaciones distribuidas de alta transacción, las soluciones de almacenamiento en caché distribuidas se han vuelto muy deseables para lograr la escalabilidad del rendimiento. NCache es una buena opción como almacén de datos distribuidos en memoria, ya que proporciona escalabilidad lineal y alta disponibilidad.
Hasta ahora todo va bien, pero cómo garantizar la integridad de los datos en entornos tan compartidos es un gran problema. Dado que dos o más clientes pueden acceder y modificar los mismos datos simultáneamente en su aplicación, el resultado puede ser datos inconsistentes. Una vez que se producen violaciones de la integridad de los datos, los datos de la memoria caché se vuelven prácticamente inútiles.
En esta publicación de blog, explicaré cómo ocurre este problema y cómo NCache te salva con su bloqueo distribuido .
NCache Detalles NCache Cerraduras Ncache Docs
Problemas de integridad de datos sin bloqueo
Para comprender el problema de la integridad de los datos en detalle, consideramos el ejemplo de una tienda de comercio electrónico en línea donde los vendedores cargan sus productos mientras los clientes ven y realizan pedidos para comprar esos productos.
Supongamos que un cliente quiere ver un determinado producto y el vendedor de ese producto quiere actualizar su precio. Ahora, si un cliente está viendo un producto a un precio más alto y el vendedor agrega un descuento que el usuario aún no puede ver, el usuario termina comprando el producto a un precio más alto.
El escenario se muestra en la Figura 1.
- El cliente 1 lee los detalles del producto en el caché.
- El cliente 2 también lee los datos del producto. Es correcto.
- El cliente 1 ahora actualiza los detalles del producto en el caché.
- El Cliente 2 también actualiza los detalles del producto en el caché.
- Las actualizaciones realizadas por el cliente 1 se pierden.
Veamos como NCache resuelve este problema.
NCache Detalles Bloqueo pesimista Bloqueo optimista
NCache Bloqueo distribuido
NCache proporciona una forma flexible de proteger sus datos de acuerdo con las necesidades de su negocio al permitirle bloquear sus datos. Un usuario toma el control de una parte de los datos y los actualiza. Mientras tanto, ningún otro usuario puede manipular esos datos.
Según el escenario de su aplicación, puede elegir cualquiera de estos NCache mecanismos de bloqueo:
- Bloqueo pesimista (bloqueos transaccionales o exclusivos): bloquea un elemento de forma exclusiva, lo que lo hace inaccesible para otros usuarios.
- Bloqueo optimista (bloqueo a través del control de versiones de elementos): utiliza el control de versiones de elementos que hace que un elemento sea accesible para otros usuarios.
Bloqueo pesimista para datos confidenciales
Se debe utilizar la estrategia de bloqueo pesimista cuando los datos que requieren actualizaciones en su aplicación son confidenciales. Puede utilizar LockHandle para adquirir un bloqueo explícito de sus datos. Una vez que haya terminado, se libera el bloqueo.
Ahora, vemos que cómo NCache el bloqueo pesimista resuelve el problema de consistencia de datos en nuestro ejemplo. Puede adquirir un bloqueo exclusivo en el producto para actualizar mientras tanto, ningún otro usuario puede acceder a ese producto. Esto se ilustra en la figura 2.
- El cliente 1 adquiere el bloqueo sobre el producto y comienza a agregar y actualizar los detalles del producto.
- Al cliente 2 se le niega el acceso para leer los detalles del producto y debe esperar hasta que se libere el bloqueo.
- Una vez que se libera el bloqueo, el Cliente 2 puede continuar con sus operaciones regulares en el producto.
Es importante observar que, NCache admite dos conjuntos de API: con y sin bloqueo. Si el usuario quiere usar el bloqueo pesimista, las API con parámetros de bloqueo deben usarse en todas partes en aplicaciones donde se requiere una fuerte consistencia de datos. Veamos cómo puedes hacerlo con NCache característica de bloqueo. En el siguiente segmento de código, primero, se crea un nuevo LockHandle y luego se establece el intervalo de tiempo para especificar el período de tiempo durante el cual se adquirirá el bloqueo. Este LockHandle funciona como una identificación de bloqueo para identificar el bloqueo. A continuación, se adquiere un bloqueo utilizando el método Get con una clave y LockHandle.
Ahora puede realizar sus operaciones comerciales y liberar manualmente el bloqueo o esperar a que finalice el período de tiempo.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
// Pre-condition: Cache is already connected // Create a new lock handle to fetch an Item using locking LockHandle lockHandle = new LockHandle(); // Timespan for which lock is to be taken TimeSpan timeSpan = TimeSpan.FromSeconds(5); // Get item from the cache and lock it var result = cache.Get(key, true, timeSpan, ref lockHandle); // Verify if the item is locked successfully if (result != null) { // Item has been successfully locked } else { // Key does not exist // Item is already locked with a different LockHandle } //Unlock item in cache manually cache.Unlock(key, lockHandle); |
Aquí, Obtener API con parámetros de bloqueo regresa inmediatamente sin esperar la adquisición del bloqueo. Necesitas hacer vínculos explícitos para adquirir un bloqueo de elementos en caso de que falles en primer lugar.
También puede adquirir un candado mediante el método Lock, que asocia un LockHandle con una llave. NCache proporciona varias formas de adquirir/liberar un bloqueo explícito que permite un bloqueo flexible. Si tiene la intención de implementar NCache bloqueo, usando el NCache aplicación de muestra para el bloqueo de artículos en GitHub será de ayuda
NCache Detalles Bloqueo pesimista Bloqueo optimista
Bloqueo optimista para disponibilidad de datos
El bloqueo pesimista es excelente, pero puede que no sea un enfoque óptimo cuando el tiempo de respuesta es crítico para su aplicación. Aquí es donde el bloqueo optimista resulta útil.
NCache usos de bloqueo optimistas control de versiones de elementos de caché para superar el hambre de subprocesos causado en el caso de bloqueo explícito. Por lo tanto, puede trabajar en una versión del elemento en caché que se incrementa con cada actualización de ese elemento. NCache realiza un seguimiento de la versión del elemento y no necesita preocuparse por la coherencia de los datos.
La figura 3 muestra cómo se hace:
- El cliente 1 agrega detalles sobre el producto y CacheItemVersion se establece en v1.
- El cliente 2 lee los detalles actualizados del producto con CacheItemVersion v1.
- El cliente 1 altera nuevamente los detalles debido a que CacheItemVersion se incrementa y se convierte en v2.
- Ahora, cuando el Cliente 2 intenta actualizar los detalles usando CacheItemVersion v1 anterior, la operación falla con CacheItemVersion
- El cliente 2 obtiene la última CacheItemVersion
- El cliente 2 actualiza los detalles del producto utilizando CacheItemVersion. Ahora la operación se realiza correctamente e incrementa CacheItemVersion en 1 automáticamente.
Esto garantiza que todos los usuarios hayan actualizado CacheItemVersion en todo momento y que a ningún usuario se le niegue el acceso a ningún producto en la tienda.
El siguiente código muestra cómo hacerlo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
// Specify the key of the cacheItem string key = "Product:1001"; // Initialize the cacheItemVersion CacheItemVersion version = null; // Get the cacheItem previously added in the cache with the version CacheItem cacheItem = cache.GetCacheItem(key, ref version); // If result is not null if (cacheItem != null) { // CacheItem is retrieved successfully with the version var prod = cacheItem.GetValue(); prod.Discount = 0.5; // Create a new cacheItem with updated value var updateItem = new CacheItem(prod); //Set the itemversion. This version is used to compare the // item version of the cached item updateItem.Version = version; //Insert call will fail with LockingException, if cache contains a newer version of the cache item. //In case of LockingException, we can fetch the latest cache item from cache and update it cache.Insert(key, updateItem); // If it matches, the insert is successful, otherwise it fails } |
Por qué usar NCache Cerraduras
Los datos seguros y consistentes son cruciales para las empresas de hoy en día y sería una pena que algo tan simple como las transacciones de múltiples usuarios dañaran la integridad de sus datos.
NCache asegura la integridad y consistencia de sus datos en entornos altamente distribuidos con la máxima flexibilidad. Según el escenario de su aplicación, puede adoptar diferentes mecanismos de bloqueo de varias maneras proporcionadas por NCache. ¡Eventualmente, tendrá concurrencia sin ninguna inconsistencia de datos!
Que increible informacion tienes para dar a los demas. Gracias por informarnos sobre ello. Siga compartiendo dicha información, que garantiza la seguridad de nuestras propiedades.