Статьи

Использование Infinispan в качестве решения для устойчивости

Перекрестная публикация с https://vaadin.com/blog/-/blogs/using-infinispan-as-a-persistency-solution . Спасибо Фредрик и Матти за ваше разрешение!

Различные РСУБД де-факто являются стандартом устойчивости. Их использование — такая надежная ставка для архитекторов, что я осмелюсь сказать, что они используются в слишком многих местах в настоящее время. Чтобы бороться с этим, я недавно изучал альтернативные варианты постоянства, такие как графовые базы данных . На этот раз я играл с Infinispan .

Если вы не знакомы с Infinispan или распределенными хранилищами данных ключ / значение в целом, вы можете думать о нем как о HashMap на стероидах. По сути, карта является общей для всех узлов вашего кластера. Благодаря кластеризации вы можете получить огромный размер, обеспечивающий быстрый доступ и избыточность, в зависимости от того, как вы его настроили. Есть несколько продуктов, которые конкурируют с Infinispan, такие как Ehcache и Hazelcast из мира ОС и Oracle Coherence с коммерческой стороны.

На самом деле Infinispan — это технология, которую вы могли бы использовать, даже не заметив этого. Например, функции высокой доступности Wildfly сильно зависят от кэшей Infinispan. Он также часто используется в качестве кэша второго уровня для библиотек ORM. Но он также может использоваться непосредственно как библиотека постоянства как таковая.

Почему вы рассматриваете это как решение для постоянства:

  • Это молниеносное хранение данных в памяти
  • Сохраненное значение может быть любым сериализуемым объектом, не требуя сложных библиотек отображений.
  • Он построен с нуля для кластерной среды — ваши данные более безопасны и быстрее доступны. Это очень легко для горизонтального масштабирования
  • Имеется несколько необязательных альтернатив для хранения в кэше, для записи состояния, например, на диск для перезагрузки всего кластера.
  • Не все данные должны храниться вечно, Infinispan имеет встроенные сложные правила выселения
  • Возможность использовать транзакционный доступ для изменений ACID

Звучит довольно удивительно, не так ли? И это точно для определенных случаев использования, но все технологии имеют свои слабые стороны и хранилища данных ключ / значение. По сравнению с RDBMS самый большой недостаток — это отношения с другими объектами. Вам нужно будет придумать стратегию хранения ссылок на другие объекты, и поиск, основанный на связанных функциях, также должен быть решен. Если вы в конечном итоге задаетесь вопросом об этих вопросах, обязательно проверьте, может ли Hibernate OGM помочь вам.

Кроме того, выполнение некоторого анализа данных можно считать более простым или, по крайней мере, более знакомым с традиционными запросами SQL. Особенно, если у вас много данных, распределенных по нескольким узлам, вам придется изучить основы модели программирования MapReduce, чтобы выполнять любые нетривиальные запросы.

Использование Infinispan в веб-приложении

Хотя Infinispan не привязан к Wildfly, я решил основывать свои эксперименты на Wildfly. Его встроенная версия доступна для веб-приложений, если вы явно запросите ее. Самый простой способ сделать это — добавить следующую запись MANIFEST.MF в ваш файл войны. Если вы не хотите испортить свой проект устаревшими файлами, просто добавьте его с помощью небольшого конфига плагина war.

1
Dependencies: org.infinispan export

Естественно, вы все равно захотите добавить зависимость Infinispan к своему приложению, но вы можете оставить ее предоставленной. Обязательно используйте ту же версию, которая предоставляется вашим сервером, в Wildlfy 8, версия Infinispan — 6.0.2. В проекте Maven добавьте такое объявление зависимостей:

1
2
3
4
5
6
7
<dependency>
    <groupId>org.infinispan</groupId>
    <artifactId>infinispan-core</artifactId>
    <version>6.0.2.Final</version>
    <!-- Provided as we use the Infinispan provided by Wildfly -->
    <scope>provided</scope>
</dependency>

Прежде чем получить доступ к «кэшам» Infinispan, вам необходимо настроить их. Доступны как программные, так и XML-конфигурации. С Wildfly наиболее естественно настроить хранилище данных Infinispan прямо в конфигурации сервера. «Правильный» файл конфигурации зависит от того, как вы запускаете свой сервер Wildfly. Если вы тестируете кластеризацию локально, вы, вероятно, захотите добавить что-то подобное в файл domain.xml в разделе <subsystem xmlns="urn:jboss:domain:infinispan:2.0"> .

1
2
3
4
<cache-container name="myCache" default-cache="cachedb">
    <transport lock-timeout="60000"/>
    <replicated-cache name="cachedb" batching="true" mode="SYNC"/>
</cache-container>

Обратите внимание, что с этой конфигурацией данные хранятся только в памяти узлов кластера. Чтобы узнать, как настроить параметры кэша или настроить «резервное копирование» на диске, обратитесь к обширной документации Infinispan .

Чтобы удалить все ссылки Infinispan из кода пользовательского интерфейса, я создал EJB, который выполняет весь доступ к данным. Там я внедряю CacheContainer, предоставленный Wildfly, и извлекаю кеш по умолчанию в методе init.

1
2
3
4
5
6
7
8
9
@Resource(lookup = "java:jboss/infinispan/container/myCache")
CacheContainer cc;
 
Map<String, MyEntity> cache;
 
@PostConstruct
void init() {
   this.cache = cc.getCache();
}

Полагаю, вам это уже интересно: да, Map — это очень знакомый интерфейс java.util.Map, а остальная часть реализации проста для любого Java-разработчика. Кэши Infinispan расширяют базовый интерфейс Map, но если вам нужны более продвинутые функции, вы также можете использовать типы Cache или AdvancedCache .

MyEntity в предыдущем фрагменте кода является просто очень простым POJO, который я создал для примера. Используя Vaadin CDI, я могу добавить EJB в свой класс пользовательского интерфейса и делать с ним почти все. Фактический код Vaadin не имеет специальных уловок, просто обычный код Vaadin, приправленный CDI.

Основываясь на этом упражнении, буду ли я использовать Infinispan напрямую для настойчивости в моем следующем проекте? Вероятно, нет, но для некоторых приложений, не задумываясь. Я также могу представить некоторые гибридные модели, где некоторые данные находятся только в кеше Infinispan, а некоторые — в традиционных RDBMS, естественно, за ORM, взяв лучшее из обоих миров.

Мы также будем использовать Infinispan в нашем предстоящем совместном вебинаре с Аруном Гуптой из RedHat 8 сентября 2014 года. Там мы покажем вам простое приложение Vaadin и то, как легко можно его кластеризовать с помощью Wildfly.