1. Обзор
GemFire — это высокопроизводительная распределенная инфраструктура управления данными, расположенная между кластером приложений и внутренними источниками данных.
GemFire позволяет управлять данными в памяти, что ускоряет доступ. Spring Data обеспечивает простую настройку и доступ к GemFire из приложения Spring.
В этой статье мы рассмотрим, как мы можем использовать GemFire для удовлетворения требований к кэшированию нашего приложения.
2. Зависимости Maven
Чтобы использовать поддержку Spring Data GemFire, нам сначала нужно добавить следующую зависимость в наш pom.xml:
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-gemfire</artifactId>
<version>1.9.1.RELEASE</version>
</dependency>
Последнюю версию этой зависимости можно найти здесь .
3. Основные функции GemFire
3.1. Кэш
Кэш в GemFire предоставляет основные службы управления данными, а также управляет подключением к другим одноранговым узлам.
Конфигурация кеша ( cache.xml
) описывает, как данные будут распределяться между разными узлами:
<cache>
<region name="region">
<region-attributes>
<cache-listener>
<class-name>
...
</class-name>
</cache-listener>
</region-attributes>
</region>
...
</cache>
3.2. Регионы
Области данных — это логическая группа в кэше для одного набора данных.
Проще говоря, регион позволяет нам хранить данные на нескольких виртуальных машинах в системе, независимо от того, на каком узле хранятся данные в кластере.
Регионы делятся на три большие категории:
- Реплицированная область содержит полный набор данных на каждом узле. Это дает высокую производительность чтения. Операции записи выполняются медленнее, поскольку обновление данных необходимо распространять на каждый узел:
<region name="myRegion" refid="REPLICATE"/>
- Разделенная область распределяет данные таким образом, что каждый узел хранит только часть содержимого области. Копия данных хранится на одном из других узлов. Он обеспечивает хорошую производительность записи.
<region name="myRegion" refid="PARTITION"/>
- Локальный регион находится на определяющем узле-члене. Связь с другими узлами внутри кластера отсутствует.
<region name="myRegion" refid="LOCAL"/>
3.3. Запросить кеш
GemFire предоставляет язык запросов под названием OQL (язык объектных запросов), который позволяет нам обращаться к объектам, хранящимся в областях данных GemFire. Синтаксис очень похож на SQL. Давайте посмотрим, как выглядит очень простой запрос:
SELECT DISTINCT * FROM exampleRegion
QueryService GemFire
предоставляет методы для создания объекта запроса.
3.4. Сериализация данных
Для управления сериализацией-десериализацией данных GemFire предоставляет опции, отличные от сериализации Java, которые обеспечивают более высокую производительность, большую гибкость хранения и передачи данных, а также поддержку различных языков.
Имея это в виду, GemFire определил формат данных Portable Data eXchange (PDX). PDX — это межъязыковой формат данных, обеспечивающий более быструю сериализацию и десериализацию за счет сохранения данных в именованном поле, к которому можно получить прямой доступ без необходимости полной десериализации объекта.
3.5. Выполнение функции
В GemFire функция может находиться на сервере и может быть вызвана из клиентского приложения или другого сервера без необходимости отправки самого кода функции.
Вызывающий объект может указать функции, зависящей от данных, для работы с определенным набором данных или может привести независимую функцию данных для работы с конкретным сервером, участником или группой участников.
3.6. Непрерывный запрос
При непрерывных запросах клиенты подписываются на события на стороне сервера, используя фильтрацию запросов типа SQL. Сервер отправляет все события, изменяющие результаты запроса. Непрерывная доставка событий запросов использует структуру подписки клиент/сервер.
Синтаксис непрерывного запроса аналогичен базовым запросам, написанным на OQL. Например, запрос, предоставляющий последние данные о запасах из региона запасов
, можно записать так:
SELECT * from StockRegion s where s.stockStatus='active';
Чтобы получить обновление статуса из этого запроса, к StockRegion
необходимо подключить реализацию CQListener:
<cache>
<region name="StockRegion>
<region-attributes refid="REPLICATE">
...
<cache-listener>
<class-name>...</class-name>
</cache-listener>
...
</region-attributes>
</region>
</cache>
4. Поддержка Spring Data GemFire
4.1. Конфигурация Java
Чтобы упростить настройку, Spring Data GemFire предоставляет различные аннотации для настройки основных компонентов GemFire:
@Configuration
public class GemfireConfiguration {
@Bean
Properties gemfireProperties() {
Properties gemfireProperties = new Properties();
gemfireProperties.setProperty("name","SpringDataGemFireApplication");
gemfireProperties.setProperty("mcast-port", "0");
gemfireProperties.setProperty("log-level", "config");
return gemfireProperties;
}
@Bean
CacheFactoryBean gemfireCache() {
CacheFactoryBean gemfireCache = new CacheFactoryBean();
gemfireCache.setClose(true);
gemfireCache.setProperties(gemfireProperties());
return gemfireCache;
}
@Bean(name="employee")
LocalRegionFactoryBean<String, Employee> getEmployee(final GemFireCache cache) {
LocalRegionFactoryBean<String, Employee> employeeRegion = new LocalRegionFactoryBean();
employeeRegion.setCache(cache);
employeeRegion.setName("employee");
// ...
return employeeRegion;
}
}
Чтобы настроить кеш и регион GemFire, мы должны сначала настроить несколько конкретных свойств. Здесь mcast-port
установлен на ноль, что указывает на то, что этот узел GemFire отключен для многоадресного обнаружения и распространения. Затем эти свойства передаются в CacheFactoryBean
для создания экземпляра GemFireCache
.
Используя bean-компонент GemFireCache
, создается экземпляр LocalRegionFatcoryBean
, который представляет регион в кэше для экземпляров Employee
.
4.2. Отображение сущностей
Библиотека поддерживает отображение объектов, которые будут храниться в сетке GemFire. Метаданные сопоставления определяются с помощью аннотаций в классах предметной области:
@Region("employee")
public class Employee {
@Id
public String name;
public double salary;
@PersistenceConstructor
public Employee(String name, double salary) {
this.name = name;
this.salary = salary;
}
// standard getters/setters
}
В приведенном выше примере мы использовали следующие аннотации:
- @
Region ,
чтобы указать экземпляр региона классаEmployee .
@Id,
чтобы аннотировать свойство, которое будет использоваться в качестве ключа кэша.@PersistenceConstructor
,
который помогает пометить один конструктор, который будет использоваться для создания сущностей, если доступно несколько конструкторов.
4.3. Репозитории GemFire
Далее давайте посмотрим на центральный компонент Spring Data — репозиторий:
@Configuration
@EnableGemfireRepositories(basePackages
= "com.foreach.spring.data.gemfire.repository")
public class GemfireConfiguration {
@Autowired
EmployeeRepository employeeRepository;
// ...
}
4.4. Поддержка запросов Oql
Репозитории позволяют определять методы запросов для эффективного выполнения запросов OQL к региону, с которым сопоставлен управляемый объект:
@Repository
public interface EmployeeRepository extends
CrudRepository<Employee, String> {
Employee findByName(String name);
Iterable<Employee> findBySalaryGreaterThan(double salary);
Iterable<Employee> findBySalaryLessThan(double salary);
Iterable<Employee>
findBySalaryGreaterThanAndSalaryLessThan(double salary1, double salary2);
}
4.5. Поддержка выполнения функций
У нас также доступна поддержка аннотаций — для упрощения работы с выполнением функции GemFire.
Есть две проблемы, которые необходимо решить, когда мы используем функции: реализацию и выполнение.
Давайте посмотрим, как POJO может быть представлен как функция GemFire с использованием аннотаций Spring Data:
@Component
public class FunctionImpl {
@GemfireFunction
public void greeting(String message){
// some logic
}
// ...
}
Нам нужно явно активировать обработку аннотаций, чтобы @GemfireFunction
работала:
@Configuration
@EnableGemfireFunctions
public class GemfireConfiguration {
// ...
}
Для выполнения функции процесс, вызывающий удаленную функцию, должен предоставить аргументы вызова, идентификатор
функции , цель выполнения ( onServer
, onRegion
, onMember
и т. д .):
@OnRegion(region="employee")
public interface FunctionExecution {
@FunctionId("greeting")
public void execute(String message);
// ...
}
Чтобы включить обработку аннотации выполнения функции, нам нужно добавить, чтобы активировать ее с помощью возможностей сканирования компонентов Spring:
@Configuration
@EnableGemfireFunctionExecutions(
basePackages = "com.foreach.spring.data.gemfire.function")
public class GemfireConfiguration {
// ...
}
5. Вывод
В этой статье мы рассмотрели основные функции GemFire и рассмотрели, как предоставляемые Spring Data API упрощают работу с ним.
Полный код для этой статьи доступен на GitHub .