Tecnología & Ingeniería
8
min de lectura
20 de mayo de 2021

Cómo utilizar Apache Ignite - Caché - Primera parte

Charles Fonseca
Desarrollo sistemas para facilitar la vida de la humanidad.
Más sobre el autor

Apache Ignite es una plataforma de computación distribuida desarrollada por GridGain y posteriormente donada a laFundaciónApache. Esta es una serie de artículos sobre la plataforma Ignite, cuyo objetivo es considerar el alto rendimiento y abordar algunas cuestiones de implementación interna.

Ignite se utiliza en múltiples contextos: caché, mensajería, streaming, monitorización, eventos, computación distribuida. Todos los módulos serán cubiertos en esta serie. El proceso de cómo iniciar un nodo Ignite y un clúster está documentado aquí.

Arquitectura de la memoria

La gestión de la memoria es una de las señas de identidad de Ignite; los datos se guardan tanto en la memoria (RAM) como en el disco.

Si la instancia está configurada como cache-aside, es decir, sin interactuar con ninguna capa de persistencia (JDBC, Spring Data, Micronaut Data), utiliza los discos de los nodos como fuente de verdad en caso de inconsistencias. De lo contrario, un proceso conocido como captura de datos de cambio (CDC) es responsable de cualquier sincronización de datos en el clúster.

Cuando se asigna en la memoria, una parte se destina como on-heap; es decir, se mantiene en la memoria destinada a la instancia de la Máquina Virtual Java (JVM) del propio Ignite -que es una aplicación Java-, lo que puede resultar innecesariamente costoso, ya que al ejecutar el Garbage Collector, se escanea todo el heap, lo que puede robar algunos buenos ciclos de CPU a la aplicación. La otra forma es fuera del heap, fuera de la memoria asignada a Java, y gestionada exclusivamente por Ignite. Esto se representa a continuación:

Arquitectura de memoria Ignite

Caché

Características

  • Estructuras de datos Cacha

The IgniteSet<T> extends Set<T> and IgniteQueue<T> extends BlockingQueue<T> interfaces allow for the creation of data structures completely distributed through nodes, with backup, and dedicated partitioning in a transparent way for users. Since these structures inherit all native language operations from the Java implementations, they are readily available.

  • Despliegue para operaciones síncronas y asíncronas.

All asynchronous operations implement the interface IgniteFuture<V>, whose implementation is similar to the CompletableFuture of Java, with the possibility of inserting the callback function, or stringing operations.

  • Métricas avanzadas

La API de la caché expone sus métricas, el número de fallos de la caché, los aciertos de la caché, el tiempo de puesta, el tiempo de obtención, el tiempo de reequilibrio de datos y el tamaño del montón. Esto hace que la experiencia del usuario sea muy transparente, y también proporciona una visión macro para el desarrollador.

  • Serialización/deserialización optimizada

IgniteCache<Integer, Organisation> cache = ignite.getOrCreateCache("cacheName");

Organización org = nueva Organización(

    "Microsoft", new Address("1096 Eddy Street, San Francisco, CA"), OrganisationType.PRIVATE));


cache.put(1, org);


// Get cache that will get values as binary objects.

IgniteCache<Integer, BinaryObject> binaryCache = cache.withKeepBinary();// Get recently created organisation as a binary object.

BinaryObject binary = binaryCache.get(1);// Así es como ocurre la magia

String name = binary.field("name");

La implementación de BinaryObject.field() nos permite deserializar campos específicos y optimizar el uso de la CPU, ya que sólo se procesará el dato a utilizar.

Estructuras de datos distribuidas en caché

  • Cola de espera

IgniteQueue<String> queue = Ignition.ignite().queue("queueName", 0, null);int TIMES = 10;for (int i = 0; i < RETRIES; i++) {

    String item = UUID.randomUUID() + "_" + i;

    queue.put(item);

    println("Se ha añadido el elemento de la cola: " + elemento);

}// IgniteQueue es totalmente compatible con la biblioteca Java.

for (String item : queue)

    println("Elemento de la cola: " + elemento);// Tomar elementos de la cola head.

for (int i = 0; i < TIMES; i++)

    println("Se ha leído un elemento de la cola head: " + queue.take());// Vuelve a tomar elementos de la cola head .

for (int i = 0; i < TIMES; i++)

    println("Se ha leído un elemento de la cola head: " + queue.poll());

  • Establecer

IgniteSet<String> set = Ignition.ignite().set("setName", null);for (int i = 0; i < 5; i++) {

    String item = UUID.randomUUID() + "_" + i;

    set.add(item);

}for (String item : set)

    println("Conjunto elemento: " + elemento);println(conjunto.contiene("1"));println("Conjunto tamaño: " + set.size());println("Eliminado: " + set.remove("0"));

Recomendaciones


suscríbete a nuestra newsletter con contenidos exclusivos.

Haga clic y únase a Sensedia News

Haga clic y únase a Sensedia News

Haga clic y únase a Sensedia News

¡Gracias por leer!