Как стать автором
Обновить
565.74
OTUS
Цифровые навыки от ведущих экспертов

Как использовать Apache Ignite как in-memory caching layer для ускорения доступа к данным

Уровень сложностиПростой
Время на прочтение5 мин
Количество просмотров1.7K

Привет, Хабр!

Apache Ignite - это высокопроизводительная, распределённая in-memory платформа, которая предназначена для хранения и обработки больших объёмов данных с ультранизкой задержкой. Основная фича Ignite заключается в его способности обеспечивать молниеносный доступ к данным, распределённым по горизонтально масштабируемому кластеру.

Apache Ignite поддерживает множество функций:

  • Распределённое кэширование: Ignite позволяет кэшировать данные в памяти.

  • SQL-совместимость: Ignite предоставляет возможность работы с данными через SQL-запросы.

  • Транзакции с гарантией ACID.

Настройка и конфигурация Apache Ignite как кэширующего

Для начала нужно определить конфигурацию кэша в Ignite. Это можно сделать через XML или программно в Java. Пример конфигурации кэша в XML:

<bean class="org.apache.ignite.configuration.IgniteConfiguration">
    <property name="cacheConfiguration">
        <bean class="org.apache.ignite.configuration.CacheConfiguration">
            <property name="name" value="myCache"/>
            <property name="cacheMode" value="PARTITIONED"/>
            <!-- другие параметры -->
        </bean>
    </property>
</bean>

Ignite можно развернуть в кластере, используя стандартные скрипты запуска, которые входят в его дистрибутив. Для запуска узла Ignite с Java 11 и выше необходимо установить переменную окружения JAVA_HOME и запустить скрипт ignite.sh или ignite.bat с необходимыми параметрами JVM для доступа к некоторым внутренним API JDK.

Для интеграции Ignite с существующими БД через JDBC нужно настроить Ignite как read-through и/или write-through кэш. Так Ignite может автоматически загружать и синхронизировать данные с БД. Можно использовать Ignite как первичное хранилище данных или как кэширующий слой между приложением и БД. Настройка JDBC происходит через определение соединений в конфигурации Ignite и настройки кэша для работы с базой данных, используя соответствующие ключи и параметры SQL.

Пример кода для настройки кэша JDBC:

CacheConfiguration cacheCfg = new CacheConfiguration("SQLPublicPersonCache");
cacheCfg.setIndexedTypes(Long.class, Person.class);
cacheCfg.setCacheMode(CacheMode.PARTITIONED);
cacheCfg.setSqlSchema("PUBLIC");

IgniteConfiguration igniteCfg = new IgniteConfiguration();
igniteCfg.setCacheConfiguration(cacheCfg);
igniteCfg.setJdbcUrl("jdbc:mysql://[hostname]:[port]/[database]");
// Запуск узла Ignite
Ignition.start(igniteCfg);

Код настроит кэш для объектов типа Person, используемый для SQL-запросов, и указывает параметры подключения к базе данных через JDBC.

Стратегии кэширования данных в Apache Ignite

Стратегия read-through предполагает, что при запросе данных, которых нет в кэше, кэш автоматически загружает данные из БД и сохраняет их в кэше для будущих запросов. Это уменьшает количество обращений к базе данных и ускоряет чтение данных, т.к при последующих запросах данные будут извлекаться непосредственно из кэша.

CacheConfiguration<String, MyData> cacheCfg = new CacheConfiguration<>("myCache");
cacheCfg.setCacheMode(CacheMode.PARTITIONED);
cacheCfg.setReadThrough(true);
cacheCfg.setWriteThrough(true);

IgniteCache<String, MyData> cache = ignite.getOrCreateCache(cacheCfg);
// при отсутствии ключа в кэше, Ignite автоматически загрузит данные из БД
MyData data = cache.get("key");

Write-through обеспечивает синхронизацию данных с базой данных в реальном времени при их изменении в кэше. Каждая операция записи в кэш сопровождается мгновенной записью в базу данных.

CacheConfiguration<String, MyData> cacheCfg = new CacheConfiguration<>("myCache");
cacheCfg.setCacheMode(CacheMode.PARTITIONED);
cacheCfg.setWriteThrough(true);

IgniteCache<String, MyData> cache = ignite.getOrCreateCache(cacheCfg);
// при выполнении put, данные также будут синхронизированы с БД
cache.put("key", new MyData());

Cache-aside требует, чтобы приложение самостоятельно управляло загрузкой данных в кэш и их обновлением. Кэш при этом не взаимодействует напрямую с базой данных. Приложение сначала проверяет наличие данных в кэше, и если они отсутствуют, загружает их из базы данных и помещает в кэш для будущего использования.

IgniteCache<String, MyData> cache = ignite.getOrCreateCache("myCache");
MyData data = cache.get("key");
if (data == null) {
    // загрузка данных из БД, если их нет в кэше
    data = myDatabase.loadData("key");
    cache.put("key", data);
}

Интеграция и API Apache Ignite

Apache Ignite поддерживает распределенный SQL и Key-Value API, позволяющие работать как с традиционными SQL-запросами, так и с простыми операциями на ключах и значениях. SQL API Ignite позволяет выполнять сложные запросы с объединением, агрегацией и группированием данных, которые хранятся в памяти или на диске

Пример SQL запроса:

IgniteCache<Long, City> cityCache = ignite.getOrCreateCache("City");
String sql = "SELECT name, MAX(population) as maxPop FROM City GROUP BY name ORDER BY maxPop DESC";
QueryCursor<List<?>> cursor = cityCache.query(new SqlFieldsQuery(sql));
for (List<?> row : cursor) {
    System.out.println("City: " + row.get(0) + ", Population: " + row.get(1));
}

Compute API Ignite позволяет распределенно выполнять задачи на узлах кластера. Сервисы Ignite позволяют развертывать и управлять долгоживущими бизнес-логиками в кластере, пример:

IgniteCompute compute = ignite.compute(ignite.cluster().forServers());
compute.broadcast(() -> System.out.println("Hello from node: " + ignite.cluster().localNode().id()));

Apache Ignite предоставляет API для машинного обучения, позволяя тренировать модели непосредственно на кластере, избегая дорогостоящей передачи данных. Real-Time Streaming API поддерживает интеграцию с системами потоковой обработки данных, такими как Apache Kafka и Apache Flink, для обработки потоков событий в реальном времени, пример:

KNNClassificationTrainer trainer = new KNNClassificationTrainer().withK(3);
KNNClassificationModel mdl = trainer.fit(
    ignite,
    dataCache,
    (k, v) -> new double[] {k.doubleValue()},
    (k, v) -> v.doubleValue()
);
double prediction = mdl.predict(new double[]{someValue});

Пример для кэширования данных веб-приложения

Сначала необходимо настроить и запустить узел Ignite. Для этого понадобится файлик конфигурации ignite.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="ignite.cfg" class="org.apache.ignite.configuration.IgniteConfiguration">
        <!-- Включаем кеширование. -->
        <property name="cacheConfiguration">
            <list>
                <bean class="org.apache.ignite.configuration.CacheConfiguration">
                    <!-- Название кеша -->
                    <property name="name" value="myCache"/>
                    <!-- Политика замещения -->
                    <property name="evictionPolicy">
                        <bean class="org.apache.ignite.cache.eviction.lru.LruEvictionPolicy">
                            <property name="maxSize" value="10000"/>
                        </bean>
                    </property>
                    <!-- Режим кеширования -->
                    <property name="cacheMode" value="PARTITIONED"/>
                </bean>
            </list>
        </property>
    </bean>
</beans>

Запусаем узел Ignite, используя этот конфигурационный файл.

Подключите приложение к кешу Apache Ignite. В Java это можно сделать так:

IgniteConfiguration cfg = new IgniteConfiguration();

// устанавливаем конфигурацию кеша
CacheConfiguration cacheCfg = new CacheConfiguration("myCache");
cacheCfg.setCacheMode(CacheMode.PARTITIONED);

cfg.setCacheConfiguration(cacheCfg);

// запуск Ignite node.
Ignite ignite = Ignition.start(cfg);

// получение доступа к кешу.
IgniteCache<Integer, String> cache = ignite.getOrCreateCache("myCache");

// пример работы с кешем.
if (cache.get(1) == null)
    cache.put(1, "data");

Таким образом можно кэшировать результаты сложных запросов к БД или часто запрашиваемые пользовательские данные.


С Apache Ignite можно существенно повысить производительность приложений и уменьшить время отклика.

В завершение хочу пригласить вас на бесплатный вебинар курса Data Engineer. Подробнее по ссылке.

Теги:
Хабы:
Всего голосов 1: ↑1 и ↓0+2
Комментарии0

Публикации

Информация

Сайт
otus.ru
Дата регистрации
Дата основания
Численность
101–200 человек
Местоположение
Россия
Представитель
OTUS