Artículos
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

Lasinterfaces IgniteSet extends Sete IgniteQueue extends BlockingQueuepermiten la creación de estructuras de datos completamente distribuidas a través de nodos, con copia de seguridad, y partición dedicada de forma transparente para los usuarios. Dado que estas estructuras heredan todas las operaciones del lenguaje nativo de las implementaciones de Java, están fácilmente disponibles.

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

Todas las operaciones asíncronas implementan la interfaz IgniteFuture<V>, cuya implementación es similar a la de CompletableFuture de Java, con la posibilidad de insertar la función callback, o encadenar operaciones.</V>

  • 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");</Integer,>

Organización org = nueva Organización(

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


cache.put(1, org);


// Obtener la caché que obtendrá los valores como objetos binarios.

IgniteCache<Integer, BinaryObject>binaryCache = cache.withKeepBinary();// Obtener la organización recientemente creada como objeto binario.</Integer,>

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


¡Gracias por leer!