Lectura simultánea, Escritura simultánea, Escritura diferida en NCache

NCache es un caché distribuido en memoria extremadamente rápido y escalable para .NET que almacena en caché los datos de las aplicaciones para reducir los costosos viajes a la base de datos. Puedes usar NCache para eliminar los cuellos de botella de rendimiento asociados con el almacenamiento de datos y la escalabilidad de la base de datos.

La forma más común de utilizar dicho caché es permitir que su aplicación lea datos de su base de datos/fuente de datos y luego los almacene en caché. Después de lo cual, cuando su aplicación actualiza estos datos en su base de datos, también actualiza el caché para garantizar que esté sincronizado con la base de datos.

Además, NCache proporciona otro mecanismo muy poderoso para leer y escribir datos llamado Proveedores de fuente de datos (lectura/escritura/escritura detrás) para permitir NCache leer y escribir datos de su base de datos.

Hay tres formas en las que puedes usar NCache en este contexto:

  1. Leer de parte a parte: usted desarrolla un controlador de lectura que reside y se ejecuta en todos los servidores de caché del clúster. Luego, cuando su aplicación obtenga datos del caché, NCache llama al controlador de lectura para que lea estos datos de su fuente de datos si esos datos aún no están presentes en el caché.
  2. Escritura simultánea (sincronización): desarrolla un controlador de escritura directa que también reside y se ejecuta en todos los servidores de caché del clúster. Y, cuando su aplicación actualice datos en el caché, NCache primero actualiza el caché y luego llama al controlador de escritura para actualizar inmediatamente su base de datos también. Y su aplicación también espera hasta que los datos se actualicen en la base de datos.
  3. Escritura posterior (asincrónica): Si no desea que su aplicación espere hasta que el controlador de escritura completa complete la actualización de los datos en la base de datos, puede elegir la opción Escritura posterior donde NCache actualiza su base de datos de forma asincrónica y su aplicación no tiene que esperar a que se actualice la base de datos. Esto acelera su aplicación ya que las actualizaciones de la base de datos suelen ser mucho más lentas que las actualizaciones de la caché.
Figura 1: Código del lado del servidor (edición .NET)
Figura 1: Código del lado del servidor (edición .NET)
Figura 1: Código del lado del servidor (edición Java)
Figura 2: Código del lado del servidor (edición Java)

Beneficios de la lectura directa/escritura directa/escritura diferida

A continuación se detallan algunos beneficios de utilizar lectura, escritura y escritura retrasada en NCache.

  1. Mejor rendimiento de escritura con Write-behind: Actualizar su base de datos suele ser mucho más lento que actualizar el caché. Cuando utiliza escritura posterior, su aplicación solo actualiza el caché y continúa mientras NCache actualiza asincrónicamente su base de datos. Esto mejora bastante el rendimiento de su aplicación.
  2. Más escalabilidad de la base de datos con la limitación de escritura en segundo plano: Si su aplicación actualiza la base de datos con bastante frecuencia, es probable que se bloquee. Pero, si activa la limitación con escritura posterior, entonces NCache mantiene sus datos actualizados en el caché con replicación y actualiza su base de datos lentamente. Esto alivia mucha presión de su base de datos.
  3. Actualización automática de caché al vencimiento: Si ha desarrollado un controlador de lectura, puede habilitar la actualización automática al vencimiento con NCache. De esta manera, cada vez que caduque un elemento almacenado en caché, en lugar de eliminarlo del caché, NCache llama al controlador de lectura para recargar una copia nueva de su fuente de datos.
  4. Actualización automática de caché en cambios de base de datos: Si ha desarrollado un controlador de lectura directa, puede habilitar la actualización automática en la dependencia de SQL/dependencia de Oracle con NCache. De esta manera, cada vez que cambien los datos correspondientes en la base de datos, en lugar de eliminar el elemento almacenado en caché del caché, NCache llama al controlador de lectura para recargar una copia nueva de su base de datos.

Características más importantes

A continuación se muestran algunos aspectos destacados de la lectura, la escritura y la escritura retrasada en NCache.

  1. Código del lado del servidor (.NET o Java): Puede desarrollar sus controladores de lectura/escritura con .NET o Java. Hay una interfaz para cada controlador que desarrolla e implementa su código en todos los servidores de caché del clúster. NCache es capaz de llamarlos en tiempo de ejecución cuando sea necesario. Todos los controladores desarrollados en .NET son llamados de forma nativa por NCache ya que también está desarrollado en .NET. Sin embargo, los controladores desarrollados en Java son llamados por NCache a través de la interfaz nativa de Java (JNI).
  2. Múltiples controladores de lectura/escritura: Puede desarrollar múltiples controladores de lectura y escritura y registrarlos con NCache. En ese caso, todos tienen nombre y su aplicación puede solicitar cualquiera de ellos especificando su nombre.
  3. Controlador de lectura/escritura predeterminado: Si tiene varios controladores registrados como controladores con nombre, entonces NCache le permite seleccionar una de ellas como opción predeterminada. Este controlador predeterminado se utiliza cuando su aplicación no especifica un nombre de controlador.
  4. Aspectos destacados de la lectura
    1. Lectura forzada: NCache proporciona una opción en la que puede indicarle que utilice la lectura directa incluso si el elemento existe en la memoria caché (normalmente, la lectura directa solo se llama cuando un elemento no se encuentra en la memoria caché). Esto le permite actualizar este elemento de su base de datos si cree que los datos podrían haber cambiado allí.
    2. Obtener lectura masiva: NCache proporciona una API de obtención masiva que permite que su aplicación proporcione una lista de claves con las que puede recuperar datos del caché.
    3. Lectura de estructuras de datos (contador, diccionario, lista, cola, conjunto): NCache proporciona a su aplicación la capacidad de recuperar cualquier estructura de datos y NCache llama a un controlador de lectura para recuperar estos datos de su base de datos.
  5. Aspectos destacados de la escritura
    1. Eliminar la escritura simultánea de elementos: NCache también proporciona a su aplicación la API Remove que le permite usar una clave para eliminar un elemento del caché y luego de la fuente de datos.
    2. Eliminación masiva de artículos Escritura simultánea: NCache también proporciona una API de eliminación masiva que permite que su aplicación proporcione una lista de claves para eliminar de la caché y de la fuente de datos de forma masiva.
    3. Escritura simultánea de adición/actualización masiva: NCache proporciona una API de actualización/añadidura masiva que permite que su aplicación proporcione una lista de claves y sus valores para agregar/actualizar la memoria caché de forma masiva. La escritura directa también funciona en esta situación y agrega/actualiza su base de datos/fuente de datos con estos elementos de forma masiva.
    4. Escritura de estructuras de datos (contador, diccionario, lista, cola y conjunto): NCache proporciona la capacidad para que su aplicación actualice cualquier estructura de datos y NCache llama a un controlador de escritura simultánea para actualizar su base de datos con los cambios.
    5. Agregar/Actualizar/Eliminar escritura simultánea asíncrona: NCache La API proporciona Agregar/Insertar/Quitar asíncrono. La escritura directa admite esta API y se invoca cada vez que su aplicación realiza esa llamada a la API. Aquí. La escritura directa supone que su aplicación está esperando a que se complete la operación y el hecho de que sea asincrónica solo se reconoce en el nivel de API del cliente.
  6. Aspectos destacados de escritura diferida
    1. Cola de operaciones asíncronas replicada (alta disponibilidad): La escritura retrasada acepta la solicitud del cliente para actualizar el caché y lo actualiza inmediatamente, pero pone en cola la actualización de la base de datos para su ejecución asincrónica más adelante. Esta cola siempre se replica en más de un servidor de caché dependiendo de la topología de almacenamiento en caché para garantizar que estas operaciones nunca se pierdan si algún servidor de caché deja de funcionar repentinamente.
    2. Estrangulamiento Puede especificar un nivel de limitación para las operaciones asíncronas de escritura posterior. Esto le permite distribuirlos. El nivel de limitación predeterminado es 500 operaciones/seg.
    3. Modos de escritura retrasada (no por lotes o por lotes): El modo sin lotes significa que cada operación en la cola de escritura retrasada se ejecuta por separado, mientras que en el modo por lotes se agrupan varias operaciones y se ejecutan colectivamente.
    4. Retraso de la operación por lotes: Puede especificar un retraso entre dos operaciones en modo por lotes. Esto le permite ralentizar las actualizaciones de la base de datos si lo desea.
    5. Cola de operaciones fallidas: Dado que la escritura posterior realiza todas las operaciones de forma asincrónica cuando falla una operación, NCache Puede ponerlo en la cola de operaciones fallidas para que pueda ejecutarse nuevamente sin interferir con operaciones nuevas que no han fallado. Puede especificar un tamaño máximo y un desalojo.
  7. Supervisar contadores de escritura directa/escritura retrasada: NCache proporciona un amplio conjunto de contadores con los que puede monitorear lo que sucede en escritura directa/escritura retrasada. Estos contadores están disponibles en el NCache Monitor, herramienta Windows PerfMon, contadores SNMP, Prometheus y Grafana.

Interfaz de código de lectura/escritura simultánea

Desarrollar código para controladores de lectura y escritura es un proceso sencillo. A continuación se muestran ejemplos de interfaces para ambos.

public interface IReadThruProvider
{
	void Init(IDictionary parameters, string cacheId);
	ProviderCacheItem LoadFromSource(string key);
	IDictionary<string, ProviderCacheItem> LoadFromSource(ICollection<string> keys);
	ProviderDataTypeItem<IEnumerable> LoadDataTypeFromSource(string key, DistributedDataType dataType);
	void Dispose();
}
public interface ReadThruProvider extends java.lang.AutoCloseable
{
	void init(java.util.Map<java.lang.String,java.lang.String> parameters, java.lang.String cacheId) throws java.lang.Exception;
	ProviderCacheItem loadFromSource(java.lang.String key) throws java.lang.Exception;
	java.util.Map<java.lang.String,ProviderCacheItem> loadFromSource(java.util.Collection<java.lang.String> keys) throws java.lang.Exception;
	ProviderDataStructureItem loadDataStructureFromSource(java.lang.String key, DistributedDataStructureType distributedDataStructureType) throws java.lang.Exception;
}
public interface IWriteThruProvider
{
	void Init(IDictionary parameters, string cacheId);
	OperationResult WriteToDataSource(WriteOperation operation);
	ICollection<OperationResult> WriteToDataSource(ICollection<WriteOperation> operations);
	ICollection<OperationResult> WriteToDataSource(ICollection<DataTypeWriteOperation> dataTypeWriteOperations);
	void Dispose();
}
public interface WriteThruProvider extends java.lang.AutoCloseable
{
	void init(java.util.Map<java.lang.String,java.lang.String> parameters, java.lang.String cacheId) throws java.lang.Exception;
	OperationResult writeToDataSource(WriteOperation operation) throws java.lang.Exception;
	java.util.Collection<OperationResult> writeToDataSource(java.util.Collection<WriteOperation> operations) throws java.lang.Exception;
	java.util.Collection<OperationResult> writeDataStructureToDataSource(java.util.Collection<DataStructureWriteOperation< dataStructureWriteOperations) throws java.lang.Exception;
}
© Copyright Alachisoft 2002 - Todos los derechos reservados. NCache es una marca registrada de Diyatech Corp.